很久以前我在看雪的帖子——家庭银行家2分析
先说明一下1 写得很烂,不愿意看的也没什么损失
2 很久以前自己在看雪发的,不是转帖
呵呵,那段时间特别自大,如果发现什么错误,希望共勉……
【文章标题】: 家庭银行家算法完全解析
【文章作者】: NONAME剑人
【作者邮箱】: [email protected]
【作者主页】: ....Have No....
【作者QQ号】: 464252600(验证:反汇编)
【软件名称】: 家庭银行家 2.0 build 53
【软件大小】: 1.27MB
【下载地址】: 上NEWHUA
【加壳方式】: ASP
【保护方式】: ASP SHELL
【编写语言】: Borland Delphi 4.0 - 5.0
【使用工具】: OllyDbg UnAspPack PeiD
【操作平台】: WindowsXP Pro正
【软件介绍】: "家庭银行家" 是一款面向家庭和个人用户的理财软件
日常收支情况记录
1 方便、快捷、迅速的输入方式:操作类似于电子表格,可以全部用键盘完成输入过程
2 功能强大的查询功能:一改以往复杂的专业查询方式,用接近自然语言的查询条件组合,迅速找出您所需要的数据
3 归类分析:让您马上了解每个收支子项目中钱赚了多少,钱又花了多少
4 功能强大的图表分析:功能日益强劲的图表分析功能,让您用最直观地方式了解收支组成
5 每日收支记录统计分析:让您迅速地察看每天收支情况
6 灵活、自由、全面的各项设置:所有的收支项目内容都可以自由定制,以最适应自己生活习惯的方式运行
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
呵呵,好久以前的软件了。2003年的,之所以找老版本是希望作者不会为一点点小的利益而*** :)
(由于手头没有精华,不好判断是不是写重了……各位发现了表鞭我……)
先用PeiD查壳,ASP的壳,手头正好有脱壳工具,就懒得动手扒皮了(我有撸子:))
脱完以后用OD加载,没有自效验,没有反DEBUG,好!(窃喜)再来,看注册,居然是内存注册,好!(再次窃喜)
OD插件里选“超级字串参考+”,选UNICODE,往上上上拉,找到了“注册失败,请检查您的注册码是否输入正确。”没?
好!我们来分析……
00736122|.8B45 FC MOV EAX,DWORD PTR SS:
00736125|.50 PUSH EAX ;//入假注册码
00736126|.8D55 F8 LEA EDX,DWORD PTR SS:
00736129|.8B83 F0020000 MOV EAX,DWORD PTR DS:
0073612F|.E8 8851D0FF CALL HomeBank.0043B2BC
00736134|.8B55 F8 MOV EDX,DWORD PTR SS: ;入注册名
00736137|.33C9 XOR ECX,ECX
00736139|.8B83 00030000 MOV EAX,DWORD PTR DS:
0073613F|.E8 74DFF5FF CALL HomeBank.006940B8 ;关键CALL!!!
00736144|.84C0 TEST AL,AL
00736146|.75 1A JNZ SHORT HomeBank.00736162
00736148|.6A 10 PUSH 10
0073614A|.B9 B8617300 MOV ECX,HomeBank.007361B8 ;家庭银行家
0073614F|.BA C4617300 MOV EDX,HomeBank.007361C4 ;注册失败,请检查您的注册码是否输入正确。
00736154|.A1 E8747500 MOV EAX,DWORD PTR DS:
00736159|.8B00 MOV EAX,DWORD PTR DS:
0073615B|.E8 A847D2FF CALL HomeBank.0045A908
00736160|.EB 2E JMP SHORT HomeBank.00736190
00736162|>8B83 00030000 MOV EAX,DWORD PTR DS:
00736168|.E8 2FDCF5FF CALL HomeBank.00693D9C
0073616D|.84C0 TEST AL,AL
0073616F|.74 1F JE SHORT HomeBank.00736190
00736171|.6A 40 PUSH 40
00736173|.B9 B8617300 MOV ECX,HomeBank.007361B8 ;家庭银行家
00736178|.BA F0617300 MOV EDX,HomeBank.007361F0 ;注册成功,谢谢。请退出程序后重新进入。
显然
----------------------------
00736144|.84C0 TEST AL,AL
00736146|.75 1A JNZ SHORT HomeBank.00736162
----------------------------
两句说明了上面有重要CALL,接进去
006940B8/$55 PUSH EBP
006940B9|.8BEC MOV EBP,ESP
006940BB|.83C4 F0 ADD ESP,-10
006940BE|.53 PUSH EBX
006940BF|.33DB XOR EBX,EBX
006940C1|.895D F0 MOV DWORD PTR SS:,EBX
006940C4|.895D F4 MOV DWORD PTR SS:,EBX
006940C7|.894D F8 MOV DWORD PTR SS:,ECX
006940CA|.8955 FC MOV DWORD PTR SS:,EDX ;入假用户名
006940CD|.8BD8 MOV EBX,EAX
006940CF|.8B45 FC MOV EAX,DWORD PTR SS: ;取出用户名
006940D2|.E8 3904D7FF CALL HomeBank.00404510
006940D7|.8B45 F8 MOV EAX,DWORD PTR SS:
006940DA|.E8 3104D7FF CALL HomeBank.00404510
006940DF|.8B45 08 MOV EAX,DWORD PTR SS:
006940E2|.E8 2904D7FF CALL HomeBank.00404510
006940E7|.33C0 XOR EAX,EAX
006940E9|.55 PUSH EBP
006940EA|.68 A2416900 PUSH HomeBank.006941A2
006940EF|.64:FF30 PUSH DWORD PTR FS:
006940F2|.64:8920 MOV DWORD PTR FS:,ESP
006940F5|.8B45 FC MOV EAX,DWORD PTR SS:
006940F8|.E8 5F02D7FF CALL HomeBank.0040435C
006940FD|.3B43 3C CMP EAX,DWORD PTR DS:
00694100|.7F 19 JG SHORT HomeBank.0069411B
00694102|.8B45 FC MOV EAX,DWORD PTR SS:
00694105|.E8 5202D7FF CALL HomeBank.0040435C
0069410A|.3B43 40 CMP EAX,DWORD PTR DS:
0069410D|.7C 0C JL SHORT HomeBank.0069411B
0069410F|.8B45 08 MOV EAX,DWORD PTR SS:
00694112|.E8 4502D7FF CALL HomeBank.0040435C
00694117|.85C0 TEST EAX,EAX
00694119|.75 04 JNZ SHORT HomeBank.0069411F
0069411B|>33DB XOR EBX,EBX
0069411D|.EB 60 JMP SHORT HomeBank.0069417F
0069411F|>8D55 F4 LEA EDX,DWORD PTR SS:
00694122|.8B45 08 MOV EAX,DWORD PTR SS:
00694125|.E8 7A5DD7FF CALL HomeBank.00409EA4 ;假注册码全大写
0069412A|.8B55 F4 MOV EDX,DWORD PTR SS:
0069412D|.8D45 08 LEA EAX,DWORD PTR SS:
00694130|.E8 3F00D7FF CALL HomeBank.00404174
00694135|.8D4D F0 LEA ECX,DWORD PTR SS:
00694138|.8B55 FC MOV EDX,DWORD PTR SS:
0069413B|.8BC3 MOV EAX,EBX
0069413D|.E8 66FCFFFF CALL HomeBank.00693DA8 ;关键
00694142|.8B45 F0 MOV EAX,DWORD PTR SS:
00694145|.8B55 08 MOV EDX,DWORD PTR SS:
00694148|.E8 CF5DD7FF CALL HomeBank.00409F1C
0069414D|.85C0 TEST EAX,EAX
0069414F|.74 04 JE SHORT HomeBank.00694155
00694151|.33DB XOR EBX,EBX
00694153|.EB 2A JMP SHORT HomeBank.0069417F
00694155|>8D43 38 LEA EAX,DWORD PTR DS:
00694158|.8B55 FC MOV EDX,DWORD PTR SS:
0069415B|.E8 D0FFD6FF CALL HomeBank.00404130
00694160|.8D43 44 LEA EAX,DWORD PTR DS:
00694163|.8B55 F8 MOV EDX,DWORD PTR SS:
00694166|.E8 C5FFD6FF CALL HomeBank.00404130
0069416B|.8D43 4C LEA EAX,DWORD PTR DS:
0069416E|.8B55 08 MOV EDX,DWORD PTR SS:
00694171|.E8 BAFFD6FF CALL HomeBank.00404130
00694176|.8BC3 MOV EAX,EBX
00694178|.E8 B7010000 CALL HomeBank.00694334
0069417D|.B3 01 MOV BL,1
0069417F|>33C0 XOR EAX,EAX
00694181|.5A POP EDX
00694182|.59 POP ECX
00694183|.59 POP ECX
00694184|.64:8910 MOV DWORD PTR FS:,EDX
00694187|.68 A9416900 PUSH HomeBank.006941A9
0069418C|>8D45 F0 LEA EAX,DWORD PTR SS:
0069418F|.BA 04000000 MOV EDX,4
00694194|.E8 67FFD6FF CALL HomeBank.00404100
00694199|.8D45 08 LEA EAX,DWORD PTR SS:
0069419C|.E8 3BFFD6FF CALL HomeBank.004040DC
006941A1\.C3 RETN
这时候动态破解吧,很容易可以看出这个关键CALL是在0069413D
再来
00693DD9|.E8 7E05D7FF CALL HomeBank.0040435C ;EAX=假用户名的位
00693DDE|.3B46 3C CMP EAX,DWORD PTR DS:
00693DE1|.7F 0D JG SHORT HomeBank.00693DF0
00693DE3|.8B45 FC MOV EAX,DWORD PTR SS:
00693DE6|.E8 7105D7FF CALL HomeBank.0040435C
00693DEB|.3B46 40 CMP EAX,DWORD PTR DS: ;如果《=3 则
00693DEE|.7D 0C JGE SHORT HomeBank.00693DFC
00693DF0|>8BC7 MOV EAX,EDI
00693DF2|.E8 E502D7FF CALL HomeBank.004040DC
00693DF7|.E9 9F000000 JMP HomeBank.00693E9B
00693DFC|>8B45 FC MOV EAX,DWORD PTR SS:
00693DFF|.E8 5805D7FF CALL HomeBank.0040435C
00693E04|.8BD8 MOV EBX,EAX
00693E06|.EB 31 JMP SHORT HomeBank.00693E39
00693E08|>8B45 FC /MOV EAX,DWORD PTR SS: ;入假用户名
00693E0B|.8A4418 FF |MOV AL,BYTE PTR DS: ;循环,提字符串,不用解释吧(最终到EDX)
解释一下上面,是从末尾开始取字符串
00693E0F|.25 FF000000 |AND EAX,0FF ;EAX和0FF做与运算
00693E14|.33D2 |XOR EDX,EDX ;EDX=0
00693E16|.52 |PUSH EDX
00693E17|.50 |PUSH EAX
00693E18|.8B46 58 |MOV EAX,DWORD PTR DS:
00693E1B|.8B56 5C |MOV EDX,DWORD PTR DS:
00693E1E|.E8 763BD7FF |CALL HomeBank.00407999 ;计算那个EAX……
00693E23|.52 |PUSH EDX ; /Arg2
00693E24|.50 |PUSH EAX ; |Arg1
00693E25|.8D45 E4 |LEA EAX,DWORD PTR SS: ; |把EAX做成字符串放到EBP-C里入栈
00693E28|.E8 1F67D7FF |CALL HomeBank.0040A54C ; \HomeBank.0040A54C
00693E2D|.8B55 E4 |MOV EDX,DWORD PTR SS:
00693E30|.8D45 F4 |LEA EAX,DWORD PTR SS:
00693E33|.E8 2C05D7FF |CALL HomeBank.00404364
00693E38|.4B |DEC EBX
00693E39|>8B45 FC MOV EAX,DWORD PTR SS: ;入假用户名
00693E3C|.E8 1B05D7FF |CALL HomeBank.0040435C ;求位
00693E41|.83E8 06 |SUB EAX,6 ;EAX=EAX-6(1:E-6=8)
00693E44|.3BD8 |CMP EBX,EAX ;原位数=eax就出循环
00693E46|.7C 04 |JL SHORT HomeBank.00693E4C
00693E48|.85DB |TEST EBX,EBX
00693E4A|.^ 7F BC \JG SHORT HomeBank.00693E08
00693E4C|>8D55 F8 LEA EDX,DWORD PTR SS:
00693E4F|.8B45 F4 MOV EAX,DWORD PTR SS: ;EAX=上面的字符相连
用动态分析,注释说得很详细了……
好了,现在得出一个大长串 我的用户名是NoNameSwordMan得出48955918864438
再下面
00693E4F|.8B45 F4 MOV EAX,DWORD PTR SS: ;EAX=上面的字符相连
00693E52|.E8 F925D7FF CALL HomeBank.00406450
00693E57|.8945 E8 MOV DWORD PTR SS:,EAX 1
00693E5A|.8955 EC MOV DWORD PTR SS:,EDX 2
00693E5D|.8B5E 50 MOV EBX,DWORD PTR DS:
00693E60|.85DB TEST EBX,EBX
00693E62|.7F 11 JG SHORT HomeBank.00693E75
00693E64|.FF75 EC PUSH DWORD PTR SS: ; /Arg2
00693E67|.FF75 E8 PUSH DWORD PTR SS: ; |Arg1
00693E6A|.8BD7 MOV EDX,EDI ; |
00693E6C|.33C0 XOR EAX,EAX ; |
00693E6E|.E8 4967D7FF CALL HomeBank.0040A5BC ; \HomeBank.0040A5BC
00693E73|.EB 26 JMP SHORT HomeBank.00693E9B
00693E75|>FF75 EC PUSH DWORD PTR SS: ; /Arg2
00693E78|.FF75 E8 PUSH DWORD PTR SS: ; |Arg1
00693E7B|.8BD7 MOV EDX,EDI ; |
00693E7D|.8BC3 MOV EAX,EBX ; |
00693E7F|.E8 3867D7FF CALL HomeBank.0040A5BC ; \HomeBank.0040A5BC
00693E84|.8B07 MOV EAX,DWORD PTR DS: ------------最佳看注册码点
00693E86|.E8 D104D7FF CALL HomeBank.0040435C
00693E8B|.8BC8 MOV ECX,EAX
00693E8D|.2B4E 50 SUB ECX,DWORD PTR DS:
00693E90|.8B56 50 MOV EDX,DWORD PTR DS:
00693E93|.42 INC EDX
00693E94|.8BC7 MOV EAX,EDI
00693E96|.E8 0907D7FF CALL HomeBank.004045A4
00693E9B|>33C0 XOR EAX,EAX
00693E9D|.5A POP EDX
00693E9E|.59 POP ECX
00693E9F|.59 POP ECX
00693EA0|.64:8910 MOV DWORD PTR FS:,EDX
00693EA3|.68 C83E6900 PUSH HomeBank.00693EC8
00693EA8|>8D45 E4 LEA EAX,DWORD PTR SS:
00693EAB|.E8 2C02D7FF CALL HomeBank.004040DC
00693EB0|.8D45 F4 LEA EAX,DWORD PTR SS:
00693EB3|.E8 2402D7FF CALL HomeBank.004040DC
00693EB8|.8D45 FC LEA EAX,DWORD PTR SS:
00693EBB|.E8 1C02D7FF CALL HomeBank.004040DC
00693EC0\.C3 RETN
动分,得知1 2和附近的一些步骤是在做10---》16位(后编辑注:我查了查原来的精华,确实有这个软件的文章----
-----我的表情#_# 5555~`,不过这步说错了,这是在10--16,不是提位,这是10---16的一种方法(4个一分割))
OK,把你刚才的那个大长串放到CALC里,再转到16进制……OK!REG FINISH!
整理一下
可用的用户名/序列号
NoNameSwordMan
2c8670275036
最佳爆破点
00736146,改JNZ为JMP
[ 本帖最后由 NONAME剑人 于 2008-8-4 19:49 编辑 ] 期待算法分析 /:001 对LZ还是有印象的,曾经的确有点自大。不过明白就好。其实破几款软件,算不得能耐的。 呵呵,是啊,还恳请楼上赐教。 入这行门都是从破解软件开始的,但破多了就知道破解软件并非生活的全部
页:
[1]