爱你不悔 發表於 2008-10-8 19:03:06

破解CuteFTP 4.0的方法

CuteFTP早期的版本的保护还是比较厉害的,先是KeyFile,后来才改成注册码。它有个3.x版本被拿来作为HCU(High Cracking University)的strainer。4.0版本可以变成注册版,但是输入注册码之后它要连到其公司的服务器上去验证。输入注册码之后是可以跟出注册码来的,但是通不过联机验证则它不会将注册码保存起来,所以下次启动还是未注册版。可以从它启动时开始跟踪,找到注册码,实际上所有的软件都可以从启动时入手。
<br />用RegMon、FileMon检查一下,发现有个注册表键叫做Key1,里面放的是一些很长的乱七八糟的字符。可以用bpx RegQueryValueExA作断点,然后跟踪,但是这玩意儿读的注册表键太多,且SoftICE的条件断点又不是很灵光(我用bpx RegQueryValueExA if *(esp 8)==’Key1’作断点它不中断),所以改用W32Dasm来寻找合适的断点。将其反汇编之后查找引用到&quot;Key1&quot;这个字符串的地方,记下其地址作为断点,然后用Symbol Loader加载主程序,设好断点,发现在下面的地方读出该键值,但它要求Key1串的长度小于等于20。
<br />
<br />015F:00489074MOV      ESI,
<br />015F:0048907AJNZ      004890A9
<br />015F:0048907CMOV      ECX,
<br />015F:00489080LEA      EDX,
<br />015F:00489084PUSH      EDX
<br />015F:00489085LEA      EAX,
<br />015F:00489089PUSH      EBX
<br />015F:0048908APUSH      EAX
<br />015F:0048908BPUSH      00
<br />015F:0048908DPUSH      0053E030      //Key1
<br />015F:00489092PUSH      ECX
<br />015F:00489093CALL      ESI            //读注册表
<br />015F:00489095TEST      EAX,EAX
<br />015F:00489097JNZ      004890A2
<br />015F:00489099MOV      EDX,
<br />015F:0048909DPUSH      EDX
<br />015F:0048909ECALL      EBP
<br />015F:004890A0JMP      00489108
<br />
<br />.........
<br />
<br />015F:00489108MOV      ECX, //Key1串的长度
<br />015F:0048910CCMP      ECX,14      //长度小于等于0x14则继续检查
<br />015F:0048910FJBE      0048911B
<br />015F:00489111POP      EDI
<br />015F:00489112POP      ESI
<br />015F:00489113POP      EBP
<br />015F:00489114XOR      EAX,EAX      //bag guy
<br />015F:00489116POP      EBX
<br />015F:00489117ADD      ESP,10
<br />015F:0048911ARET
<br />015F:0048911BMOV      EAX,
<br />015F:0048911FTEST      EAX,EAX
<br />015F:00489121JZ      00489125
<br />015F:00489123MOV      ,ECX
<br />015F:00489125POP      EDI
<br />015F:00489126POP      ESI
<br />015F:00489127POP      EBP
<br />015F:00489128MOV      EAX,00000001
<br />015F:0048912DPOP      EBX
<br />015F:0048912EADD      ESP,10
<br />015F:00489131RET
<br />
<br />将Key1串改成一个长度小于20的ASCIIZ串,重新来一遍。等它读完Key1后用BPR断点监视Key1串,会看见它把Key1转换成大写,并检查长度:
<br />
<br />015F:004AB0F0REPNZ SCASB
<br />015F:004AB0F2NOT      ECX
<br />015F:004AB0F4DEC      ECX
<br />015F:004AB0F5CMP      ECX,0E
<br />015F:004AB0F8JNZ      004AB16D
<br />
<br />可见长度应为14个字符。接下来它检查Key1的第一个字符是否为’A’,并计算注册码的其它位:
<br />
<br />015F:00491828CMP      BYTE PTR ,41//Key1的首字符
<br />015F:0049182BJZ      00491832
<br />015F:0049182DPOP      EDI
<br />015F:0049182EXOR      EAX,EAX            //bad guy
<br />015F:00491830POP      EBX
<br />015F:00491831RET
<br />015F:00491832PUSH      ESI                //以下为计算过程
<br />015F:00491833MOV      ESI,00000001
<br />015F:00491838MOV      AL,
<br />015F:0049183BPUSH      EAX
<br />015F:0049183CCALL      004917D0
<br />015F:00491841SHL      EDI,05
<br />015F:00491844ADD      ESP,04
<br />015F:00491847OR      EDI,EAX
<br />015F:00491849INC      ESI
<br />015F:0049184ACMP      ESI,07
<br />015F:0049184DJL      00491838
<br />015F:0049184FMOV      CL,
<br />015F:00491852PUSH      ECX
<br />015F:00491853CALL      004917D0
<br />015F:00491858ADD      ESP,04
<br />015F:0049185BLEA      EDX,
<br />015F:00491862SHR      EAX,02
<br />015F:00491865POP      ESI
<br />015F:00491866POP      EDI
<br />015F:00491867OR      EAX,EDX
<br />015F:00491869POP      EBX
<br />015F:0049186ARET
<br />
<br />计算完了之后就开始比较:
<br />
<br />015F:004AB0F0REPNZ SCASB
<br />015F:004AB0F2NOT      ECX
<br />015F:004AB0F4DEC      ECX
<br />015F:004AB0F5CMP      ECX,0E    //这是刚才判长度的地方
<br />015F:004AB0F8JNZ      004AB16D
<br />015F:004AB0FAPUSH      ESI
<br />015F:004AB0FBCALL      004B1B8A
<br />015F:004AB100PUSH      0E
<br />015F:004AB102LEA      EAX,
<br />015F:004AB106PUSH      ESI
<br />015F:004AB107PUSH      EAX
<br />015F:004AB108CALL      004AF930
<br />015F:004AB10DLEA      ECX,
<br />015F:004AB111MOV      BYTE PTR ,00
<br />015F:004AB116PUSH      ECX
<br />015F:004AB117CALL      00491820      //这是刚才计算的地方
<br />015F:004AB11CMOV      ESI,EAX
<br />015F:004AB11EPUSH      ESI
<br />015F:004AB11FCALL      00491510
<br />015F:004AB124LEA      EDX,
<br />015F:004AB128MOV      EDI,EAX
<br />015F:004AB12APUSH      EDX
<br />015F:004AB12BPUSH      ESI
<br />015F:004AB12CMOV      BYTE PTR ,00
<br />015F:004AB131CALL      004916A0
<br />015F:004AB136LEA      EAX,   
<br />015F:004AB13APUSH      0E            //14个字符
<br />015F:004AB13CLEA      ECX,
<br />015F:004AB140PUSH      EAX            //真注册码
<br />015F:004AB141PUSH      ECX            //假注册码
<br />015F:004AB142CALL      004B04D0      //比较
<br />015F:004AB147ADD      ESP,2C
<br />015F:004AB14ATEST      EAX,EAX
<br />015F:004AB14CJNZ      004AB15E
<br />015F:004AB14EMOV      EDX,
<br />015F:004AB152OR      AX,FFFF      //good guy
<br />015F:004AB156MOV      ,EDI
<br />015F:004AB158POP      EDI
<br />015F:004AB159POP      ESI
<br />015F:004AB15AADD      ESP,20
<br />015F:004AB15DRET
<br />015F:004AB15EMOV      EAX,
<br />015F:004AB162MOV      ,EDI
<br />015F:004AB164POP      EDI
<br />015F:004AB165XOR      AX,AX      //bad guy
<br />015F:004AB168POP      ESI
<br />015F:004AB169ADD      ESP,20
<br />015F:004AB16CRET
<br />
<br />至此就找出了注册码。根据上面的计算和比较过程可知注册码与名字什么的没有关系,所以它启动时不用读取用户名。用RegMon监视一下它显示About对话框的时候的动作,发现它还读取RegUserName键,这显然是存放用户名的。
<br />关键的健:
<br />HKEY_LOCAL_MACHINE\Software\GlobalSCAPE Inc.\CuteFTP\Key1
<br />HKEY_LOCAL_MACHINE\Software\GlobalSCAPE Inc.\CuteFTP\RegUserName
<br />HKEY_CLASSES_ROOT\pfc
<br />最后一个键是存放日期的,老版本的也在这里。

<br />
頁: [1]
查看完整版本: 破解CuteFTP 4.0的方法