一款宝宝取名软件爆破分析
-----------------------------------------------------------------------------------------------
1. PEID 检测 检测结果:ASPack 2.12 脱壳工具脱掉,不赘述。
2. 初试 机器码+注册码类型,随便输入假码,弹出对话框。OK,从对话框下手。
|
1) OD 载入,bp MessageBoxA; bp MessageBoxW
2) F9 运行,输入假码,程序断下,ctrl+F9,回到程序领空,如下:
004FDEB3 | . 56 | PUSH ESI | |
…… | |||
004FDF48 | . 8D0470 | LEA EAX,DWORD PTR DS:[EAX+ESI*2] | |
004FDF4B | . 50 | PUSH EAX | ; /Style |
004FDF4C | . 52 | PUSH EDX | ; |Title |
004FDF4D | . 51 | PUSH ECX | ; |Text |
|
3) 找到此处子函数,分析各个跳转语句,发现 MessageBox 始终被调用, 继续 Ctrl+F9 返回上一级函数。如下:
00520A5F | . FFD3 | CALL EBX |
00520A61 | . 8B4424 0C | MOV EAX,DWORD PTR SS:[ESP+0xC] |
00520A65 | . 8B5424 10 | MOV EDX,DWORD PTR SS:[ESP+0x10] |
00520A69 | . 8B4C24 14 | MOV ECX,DWORD PTR SS:[ESP+0x14] |
00520A6D | . 83C4 18 | ADD ESP,0x18 |
00520A70 | . C3 | RETN |
4) 断下这里,F9 跑起,发现每一次点击注册,该子函数都会被执行多次, 无奈,继续返回上一级函数。如下:
|
5) 运气不错,遇到注册提示信息,继续往上翻,发现在这个子函数里面果 真有两处注册成功的提示。如下:
; ASCII "已注册"
; ASCII "恭喜,已
|
004CE007 . 68 04000080 PUSH 0x80000004
004CE00C . 6A 00 PUSH 0x0
004CE00E . 68 C1217500 PUSH 软件_WSD.007521C1 ; ASCII "恭喜,注 册成功,您现在需要重打开软件!"
004CE013 . 68 03000000 PUSH 0x3
6) 定位关键跳。往上翻,不远就找到了,如下:
004CDEB7 . E9 04020000 JMP 软件_WSD.004CE0C0
004CDEBC > E8 D537F3FF CALL 软件_WSD.00401696
004CDEC1 . 85C0 TEST EAX,EAX
004CDEC3 . 0F84 70010000 JE 软件_WSD.004CE039
7) 在关键跳处下端,重新载入,程序跑到这里,直接改掉 eax 值,F9 继续 跑起。期待着弹出注册成功界面,无奈程序直接挂掉:
8) 继续上次操作,改 F9 跑起为 F8 单步,继续跑起,一切正常,直至运行 到一个 call 语句,如下:
004CDF56 . 50 PUSH EAX
004CDF57 . 3BC8 CMP ECX,EAX
004CDF59 . 0F8F 0B000000 JG 软件_WSD.004CDF6A
004CDF5F . C745 FC 010000>MOV DWORD PTR SS:[EBP-0x4],0x1
004CDF66 . 58 POP EAX
004CDF67 . 59 POP ECX
004CDF68 .^EB EA JMP SHORT 软件_WSD.004CDF54
004CDF6A > 83C4 08 ADD ESP,0x8
004CDF6D . 837D FC 00 CMP DWORD PTR SS:[EBP-0x4],0x0
004CDF71 . 0F85 0A000000 JNZ 软件_WSD.004CDF81
004CDF77 . E8 BCBBFAFF CALL 软件_WSD.00479B38
004CDF7C . E9 3F010000 JMP 软件_WSD.004CE0C0
004CDF81 > 833D C452B800 >CMP DWORD PTR DS:[0xB852C4],0x0
004CDF88 . 0F85 61000000 JNZ 软件_WSD.004CDFEF
9) 执行该语句,程序直接死掉,目测改语句就是反修改函数,这里先不管, 执行该语句前有一个判断,直接 JMP 掉,重新 F8 再试,该 call 语句之 后的 JNZ 条件跳转实现,如下:
004CDFEF > 68 04000080 PUSH 0x80000004
|
10) 此 时 有 木 有 发 现 CALL 软件 _WSD.004FA8EC 调用的 目的 地 址 就 是 MessageBox 弹框的上一级函数啊。好了,到这里,已经能够弹出成功注 册的框框了:
11) 点击 OK,重启软件,发现仍旧没什么改变,仍然需要注册,看来每次 软件启动都会进行检验。那好,从验证函数入手,回到之前找到的关键 跳,验证函数就在之上,进入验证函数,发现很多地方都调用了,如下:
12) 如此多的调用,一个个改肯定不好,反正程序最后返回的 EAX 才是判断 关键,改掉 EAX 就行。找到 retn 之前 EAX 赋值的地方,如下:
00401736 |. E8 950B0000 CALL 软件_WSD.004022D0
0040173B |. 8945 EC MOV DWORD PTR SS:[EBP-0x14],EAX
0040173E 00401741 |
|. 8B5D F0 |. 85DB |
MOV EBX,DWORD PTR SS:[EBP-0x10] TEST EBX,EBX |
00401743 | |. 74 09 | JE SHORT 软件_WSD.0040174E |
00401745 | |. 53 | PUSH EBX |
00401746 | |. E8 95910F00 | CALL 软件_WSD.004FA8E0 |
0040174B | |. 83C4 04 | ADD ESP,0x4 |
0040174E | |> 8B45 EC | MOV EAX,DWORD PTR SS:[EBP-0x14] |
00401751 | |. E9 00000000 | JMP 软件_WSD.00401756 |
00401756 | |> 8BE5 | MOV ESP,EBP |
00401758 | |. 5D | POP EBP |
00401759 | \. C3 | RETN |
13) 虽然不知道那几个 call 函数做了什么,但是代码很好懂,不管什么,直 接把
0040174E |> 8B45 EC MOV EAX,DWORD PTR SS:[EBP-0x14]
改成
MOV EAX,0x1
14) 仅改此一句,保存为 exe,双击执行,ok,显示为已注册
15) 继续测试,发现问题,点击如下几处仍会和之前一样发生程序错误,看 来在这些按钮对应的功能之前都存在软件注册检验的函数,之后执行反 修改函数:
|
|
17) 该反修改函数的原理也懒得弄了,总之跳过这段执行程序异常代码就行,
改掉,保存为可执行文件,运行,如下,终于搞定。