破解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来寻找合适的断点。将其反汇编之后查找引用到"Key1"这个字符串的地方,记下其地址作为断点,然后用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]