分类分类
关注+2004-10-15作者:蓝点
分析破解某个家庭理财东东 (加强版)
本人在很多地方看到过这个软件的破解文献,但好象大虾们都没有给出算法分析,看来高手不屑一写,所以只有我这种小菜来写啦,呵呵~~~让高手见笑了.
软件简介:这是某个公司出的家庭理财东东。破解它比较容易,适合初学者用来作练习题。
软件下载:http://www.moneywise.com.cn/downcenter.htm
破解工具:FileInfo TRW 2000(带FPU浮点插件)
破解过程:
(1)先用Fi查看软件,发现软件没有加壳。(呵呵~~~真是个练手的好机会,不用脱壳就能玩.)
(2)运行TRW,再把《这个家庭理财东东》软件拖入TRW窗口,载入调试后按CTR+N返回。
(3)填写好注册号码,先随便填写。我的机器码:8263-5933 我填的注册码:12345678
(4)按下CTR+N回到TRW中。在命令行,
输入:bpx hmemcpy 回车 (用内存拷贝函数给它下断点。)
输入:bl 回车 (查看下好的断点是不是成功了)
按下:CTR+N (返回《家庭理财东东》软件,跟踪函数的调用)
(5)按下注册面版“完成注册”键。
(6)这时,回到了TRW窗口。表明《这个家庭理财东东》程序调用了hmemcpy(内存拷贝函数),跟踪成功了。
在命令行,
输入:bc 回车 (撤消断点)
输入:pmodule 回车 (函数回到程序《家庭理财东东》领空)
这时,大家会看到一段如下的汇篇代码:
017F:004C5618 8B45FC MOV EAX,[EBP-04]
017F:004C561B E850F8FFFF CALL 004C4E70 (这个call很关键)
017F:004C5620 84C0 TEST AL,AL
017F:004C5622 744F JZ 004C5673 (关键跳转)
呵呵~~在此处改跳转,就可以把该软件爆破,但仅仅这样做我们是不会满意的,难到不是吗?呵呵~~找出算法并写出注册机才是我们追求的最终目标。
017F:004C5624 A130EF6600 MOV EAX,[0066EF30]
017F:004C5629 8B00 MOV EAX,[EAX]
017F:004C562B 8B55FC MOV EDX,[EBP-04]
继续再往下走,就会跳出出错对话框。
(7)来到 017F:004C561B E850F8FFFF CALL 004C4E70 中,我们来分析作者的求注册码算法分析思路。
我们会看到一段如下的汇篇代码:
………………此处省略了一些无关紧要的汇编代码………………
017F:004C4E93 8D45F4 LEA EAX,[EBP-0C] (把所填的注册码放到EAX中)
017F:004C4E96 E831FFFFFF CALL 004C4DCC (通过这个CALL取了机器码:8263-5933 )
017F:004C4E9B 8B45F4 MOV EAX,[EBP-0C]
017F:004C4E9E 8D55F8 LEA EDX,[EBP-08]
017F:004C4EA1 E846FFFFFF CALL 004C4DEC
017F:004C4EA6 8B45F8 MOV EAX,[EBP-08] ( 在EAX中有注册码4339-4142)
017F:004C4EA9 E8FAFCFFFF CALL 004C4BA8
017F:004C4EAE 8BD8 MOV EBX,EAX
017F:004C4EB0 8B45FC MOV EAX,[EBP-04]
017F:004C4EB3 E8F0FCFFFF CALL 004C4BA8
017F:004C4EB8 85C0 TEST EAX,EAX
017F:004C4EBA 7504 JNZ 004C4EC0
017F:004C4EBC 33DB XOR EBX,EBX
017F:004C4EBE EB0A JMP SHORT 004C4ECA
017F:004C4EC0 3BC3 CMP EAX,EBX
017F:004C4EC2 7504 JNZ 004C4EC8
017F:004C4EC4 B301 MOV BL,01
017F:004C4EC6 EB02 JMP SHORT 004C4ECA
017F:004C4EC8 33DB XOR EBX,EBX
017F:004C4ECA 33C0 XOR EAX,EAX
017F:004C4ECC 5A POP EDX
017F:004C4ECD 59 POP ECX
017F:004C4ECE 59 POP ECX
017F:004C4ECF 648910 MOV [FS:EAX],EDX
017F:004C4ED2 68EC4E4C00 PUSH DWORD 004C4EEC
017F:004C4ED7 8D45F4 LEA EAX,[EBP-0C]
017F:004C4EDA BA03000000 MOV EDX,03
017F:004C4EDF E8FCF0F3FF CALL 00403FE0
017F:004C4EE4 C3 RET
(8)呵呵~~在:017F:004C4EA6 8B45F8 MOV EAX,[EBP-08] 的 EAX我们看到了注册码,说明在上面的: 017F:004C4EA1 E846FFFFFF CALL 004C4DEC 中大有蹊跷,我们跟进去瞧瞧。
017F:004C4E0F 8B45FC MOV EAX,[EBP-04]
017F:004C4E12 E891FDFFFF CALL 004C4BA8
017F:004C4E17 8BD8 MOV EBX,EAX 发现(EAX=000E8D1C)
017F:004C4E19 85DB TEST EBX,EBX
017F:004C4E1B 7509 JNZ 004C4E26
017F:004C4E1D 8BC6 MOV EAX,ESI
(9)不难发现,我们在004C4E17中发现了一个可疑的数EAX=E8D1C,暂且不管他,我们继续往下看:
………………此处省略了一些无关紧要的汇编代码………………
017F:004C4E0F 8B45FC MOV EAX,[EBP-04]
017F:004C4E12 E891FDFFFF CALL 004C4BA8
017F:004C4E17 8BD8 MOV EBX,EAX (注意此处的EAX=000E8D1C)
017F:004C4E19 85DB TEST EBX,EBX
017F:004C4E1B 7509 JNZ 004C4E26
017F:004C4E1D 8BC6 MOV EAX,ESI
017F:004C4E1F E898F1F3FF CALL 00403FBC
017F:004C4E24 EB27 JMP SHORT 004C4E4D
017F:004C4E26 2B1DD0B96600 SUB EBX,[0066B9D0] (将EBX-34B263C=FCC366E0放入EBX中)
017F:004C4E2C 895DF4 MOV [EBP-0C],EBX
017F:004C4E2F 33C0 XOR EAX,EAX
017F:004C4E31 8945F8 MOV [EBP-08],EAX
017F:004C4E34 DF6DF4 FILD QWORD [EBP-0C] (将[ebp-0c]中的数放到浮点寄存器st)
017F:004C4E37 DC0DD4B96600 FMUL QWORD [0066B9D4] (将st 乘于[0066b9d4]中的数,结果放到st 中)
017F:004C4E3D E8CEDEF3FF CALL 00402D10
017F:004C4E42 8BD8 MOV EBX,EAX
017F:004C4E44 8BD6 MOV EDX,ESI
017F:004C4E46 8BC3 MOV EAX,EBX
017F:004C4E48 E867FCFFFF CALL 004C4AB4
017F:004C4E4D 33C0 XOR EAX,EAX
017F:004C4E4F 5A POP EDX
017F:004C4E50 59 POP ECX
哎~~EAX=E8D1C 很可疑呀,后来还对它进行了浮点运算,那我们不妨跟到004C4E12这个CALL中去逛逛.
(10)这时可要仔细观察呀,看看有什么“新大陆”没有!
017F:004C4C15 E88251F4FF CALL 00409D9C
017F:004C4C1A 33C9 XOR ECX,ECX
017F:004C4C1C 33F6 XOR ESI,ESI
017F:004C4C1E B806000000 MOV EAX,06 (把06放入EAX中)
017F:004C4C23 8B55F8 MOV EDX,[EBP-08] (把机器码:82635933放入EDX)
017F:004C4C26 0FB65402FF MOVZX EDX,BYTE [EDX+EAX-01](取机器码:82635933数中的倒数第三个数9放到EDX)
017F:004C4C2B 83EA30 SUB EDX,BYTE +30 (39-30=9)
017F:004C4C2E 03F2 ADD ESI,EDX (把9放到ESI中)
017F:004C4C30 03C9 ADD ECX,ECX
017F:004C4C32 8D0C89 LEA ECX,[ECX+ECX*4] (把[ECX+ECX*4]的偏移地址放入ECX中)
017F:004C4C35 03D1 ADD EDX,ECX (EDX与ECX相加,再把数值放到EDX中)
017F:004C4C37 8BCA MOV ECX,EDX (把EDX中的数放到ECX中)
017F:004C4C39 48 DEC EAX (EAX减1,作为条件来实现一个循环)
017F:004C4C3A 85C0 TEST EAX,EAX (异或EAX,标志位作为下面跳转的条件)
017F:004C4C3C 75E5 JNZ 004C4C23 (为1则跳转,为0则不会跳转)循环了6次
017F:004C4C3E 33D2 XOR EDX,EDX
017F:004C4C40 B808000000 MOV EAX,08 (把08放入EAX中)
017F:004C4C45 03D2 ADD EDX,EDX
017F:004C4C47 8D1492 LEA EDX,[EDX+EDX*4]
017F:004C4C4A 8B5DF8 MOV EBX,[EBP-08] (把机器码82635933放入EBX)
017F:004C4C4D 0FB65C03FF MOVZX EBX,BYTE [EBX+EAX-01](取机器码:82635933数中的倒数第一个数3放到EBX)
017F:004C4C52 83EB30 SUB EBX,BYTE +30 (33-30=3)
017F:004C4C55 03D3 ADD EDX,EBX (EDX与EBX相加,再把值放到EDX中)
017F:004C4C57 48 DEC EAX (EAX减1)
017F:004C4C58 83F806 CMP EAX,BYTE +06 (用EAX-6得到的值来作为跳转的条件)
017F:004C4C5B 75E8 JNZ 004C4C45 (为1则跳转,为0则不会跳转)循环了2次
017F:004C4C5D 3BF2 CMP ESI,EDX (比较ESI与EDX的值)
017F:004C4C5F 7404 JZ 004C4C65
017F:004C4C61 33DB XOR EBX,EBX (EAX清零)
017F:004C4C63 EB02 JMP SHORT 004C4C67
017F:004C4C65 8BD9 MOV EBX,ECX
017F:004C4C67 33C0 XOR EAX,EAX
017F:004C4C69 5A POP EDX (EDX压如栈)
017F:004C4C6A 59 POP ECX (ECX压如栈)
017F:004C4C6B 59 POP ECX (ECX压如栈)
017F:004C4C6C 648910 MOV [FS:EAX],EDX
017F:004C4C6F 68894C4C00 PUSH DWORD 004C4C89
017F:004C4C74 8D45F8 LEA EAX,[EBP-08]
017F:004C4C77 BA02000000 MOV EDX,02
017F:004C4C7C E85FF3F3FF CALL 00403FE0
017F:004C4C81 C3 RET
(11)呵呵,通过上面的分析,我们不难发现,作者程序中注册码的第一部分算法是:把机器码(我的机器码是:82635933)从倒数第三个数取起,进行一系列的整除求余运算,其中共循环6次,这时得到一个数(我的是:000E8D1C).这个数参加下一步的注册码运算. 我们这时跳出这个CALL,来到:
017F:004C4E24 EB27 JMP SHORT 004C4E4D 这个程序块中,
我们接着来分析下一步的算法.
017F:004C4E26 2B1DD0B96600 SUB EBX,[0066B9D0] (将EBX-34B263C=FCC366E0放入EBX中)
017F:004C4E2C 895DF4 MOV [EBP-0C],EBX
017F:004C4E2F 33C0 XOR EAX,EAX (EAX清零)
017F:004C4E31 8945F8 MOV [EBP-08],EAX
017F:004C4E34 DF6DF4 FILD QWORD [EBP-0C] (将[ebp-0c]中的数放到浮点寄存器st)
017F:004C4E37 DC0DD4B96600 FMUL QWORD [0066B9D4] (将st 乘于[0066b9d4]中的数,结果放到st 中)
017F:004C4E3D E8CEDEF3FF CALL 00402D10
017F:004C4E42 8BD8 MOV EBX,EAX (EAX=F018AE56放入EBX中)
017F:004C4E44 8BD6 MOV EDX,ESI
017F:004C4E46 8BC3 MOV EAX,EBX
017F:004C4E48 E867FCFFFF CALL 004C4AB4 可疑的CALL
017F:004C4E4D 33C0 XOR EAX,EAX
017F:004C4E4F 5A POP EDX
(12)呵呵~~通过上面的浮点运算,我们得到:EAX=F018AE56 ,记下这个很重要的数字,我们来到前面说的那可疑的CALL前,然后按F8往里走。
哈哈……来到“004C4E48 CALL 004C4AB4 ”可疑的CALL中仔细观察后,我们发现胜利就在眼前。
017F:004C4AD8 E8DFF4F3FF CALL 00403FBC
017F:004C4ADD 33FF XOR EDI,EDI
017F:004C4ADF BB06000000 MOV EBX,06 (把06放入 EBX中,做计数器)
017F:004C4AE4 8B45FC MOV EAX,[EBP-04] (把F018AE56放入EAX中)
017F:004C4AE7 B90A000000 MOV ECX,0A (把0A放入ECX中,做为除数)
017F:004C4AEC 33D2 XOR EDX,EDX (EDX清零)
017F:004C4AEE F7F1 DIV ECX (EAX除ECX,余数在EDX中)
017F:004C4AF0 8BF2 MOV ESI,EDX (把得到的余数4放入ESI中)
017F:004C4AF2 03FE ADD EDI,ESI (EDI+ESI结果放到EDI中)
017F:004C4AF4 8D45F0 LEA EAX,[EBP-10] (把[EBP-10]的偏移地址放入EAX中)
017F:004C4AF7 8D5630 LEA EDX,[ESI+30] (把[ESI+30]的偏移地址放入EAX中)
017F:004C4AFA E865F6F3FF CALL 00404164
017F:004C4AFF 8B55F0 MOV EDX,[EBP-10]
017F:004C4B02 8D45F4 LEA EAX,[EBP-0C] (把[EBP-0C]的偏移地址放入EAX中)
017F:004C4B05 E84AF7F3FF CALL 00404254
017F:004C4B0A 8B45FC MOV EAX,[EBP-04] (把0A放入ECX中,做为除数)
017F:004C4B0D B90A000000 MOV ECX,0A
017F:004C4B12 33D2 XOR EDX,EDX (EDX清零)
017F:004C4B14 F7F1 DIV ECX (EAX除ECX,余数在EDX中)
017F:004C4B16 8945FC MOV [EBP-04],EAX
017F:004C4B19 4B DEC EBX (用EBX-1的结果来作为循环的辨别条件)
017F:004C4B1A 75C8 JNZ 004C4AE4 (上面的结果为1则跳,为0则不跳)
这一段程序把通过第一部分运算得到的常数F018AE56进行了一系列的循环整除求余运算,每循环一次,得到一位注册码。我通过运算依次得到的注册码为:4.3.3.9.4.1
017F:004C4B1C BB02000000 MOV EBX,02 (把02放入 EBX中,做计数器)
017F:004C4B21 8BC7 MOV EAX,EDI (EDI中的数放到EAX中)
017F:004C4B23 B90A000000 MOV ECX,0A (把0A放入ECX中,做为除数)
017F:004C4B28 33D2 XOR EDX,EDX (EDX清零)
017F:004C4B2A F7F1 DIV ECX (EAX除ECX,余数在EDX中)
017F:004C4B2C 8BF2 MOV ESI,EDX (把EDX中的值放入ESI中)
017F:004C4B2E 8D45EC LEA EAX,[EBP-14] (把[EBP-14]的偏移地址放入EAX中)
017F:004C4B31 8D5630 LEA EDX,[ESI+30] (把[EBP+30]的偏移地址放入EAX中)
017F:004C4B34 E82BF6F3FF CALL 00404164
017F:004C4B39 8B55EC MOV EDX,[EBP-14]
017F:004C4B3C 8D45F4 LEA EAX,[EBP-0C] (把[EBP-0C]的偏移地址放入EAX中)
017F:004C4B3F E810F7F3FF CALL 00404254
017F:004C4B44 8BC7 MOV EAX,EDI
017F:004C4B46 B90A000000 MOV ECX,0A (把0A放入ECX中,做为除数)
017F:004C4B4B 33D2 XOR EDX,EDX (EDX清零)
017F:004C4B4D F7F1 DIV ECX (EAX除ECX,余数在EDX中)
017F:004C4B4F 8BF8 MOV EDI,EAX
017F:004C4B51 4B DEC EBX (用EBX-1的结果来作为循环的辨别条件)
017F:004C4B52 75CD JNZ 004C4B21 (上面的结果为1则跳,为0则不跳)
这一段程序把上面运算得到的数ESI=18进行了循环整除求余运算,每循环一次,得到一位注册码。我依次运算得到的注册码:4.2
017F:004C4B54 8D55F4 LEA EDX,[EBP-0C]
017F:004C4B57 B905000000 MOV ECX,05
017F:004C4B81 BA03000000 MOV EDX,03
017F:004C4B86 E855F4F3FF CALL 00403FE0
哈哈……跟踪到这里,我们也就发现了注册码的另一部分重要算法了!
(13)呵呵~~~~~接下来我们看看程序最后还要做的事情:把算出的注册码4.3.3.9.4.1.4.2 换成另外一种形式“4339-4142”,这就是我的注册码。
通过整理这两大部分的算法分析,我们就能得到整个程序注册码的算法了。哈哈……任务完成了!
作者学破解时间不长,不足处还望各位朋友给予指导和帮助,在此,作者先谢谢大家了!
欢迎各位破解爱好者来相互交流学习!Emial:bomber1949@sina.com QQ:32069691
风尘(长沙)
2002年5月15日
相关文章
更多+相同厂商
热门推荐
点击查看更多
点击查看更多
点击查看更多
说两句网友评论