首页
社区
课程
招聘
[原创]网页小偷的简单破解
发表于: 2011-8-18 13:08 5375

[原创]网页小偷的简单破解

2011-8-18 13:08
5375
破解第一步:
PEiD查壳:
ASPack 2.12 -> Alexey Solodovnikov
第二步:
OD载入,入口代码:
007C2001 >  60              pushad
007C2002    E8 03000000     call    007C200A
007C2007  - E9 EB045D45     jmp     45D924F7
007C200C    55              push    ebp
007C200D    C3              retn
007C200E    E8 01000000     call    007C2014
007C2013    EB 5D           jmp     short 007C2072
Aspack是常见的压缩壳,我们用esp定律直接脱去:
F7单步一下,然后对esp下硬件访问断点
F9运行,停到:
007C23B0   /75 08           jnz     short 007C23BA
007C23B2   |B8 01000000     mov     eax, 1
007C23B7   |C2 0C00         retn    0C
007C23BA   \68 C38A4D00     push    004D8AC3
007C23BF    C3              retn      这两条指令跳到OEP
单步运行:
004D8AC3    55              push    ebp
004D8AC4    8BEC            mov     ebp, esp
004D8AC6    6A FF           push    -1
004D8AC8    68 E8127500     push    007512E8
004D8ACD    68 1CDB4D00     push    004DDB1C
004D8AD2    64:A1 00000000  mov     eax, dword ptr fs:[0]
004D8AD8    50              push    eax
004D8AD9    64:8925 0000000>mov     dword ptr fs:[0], esp
004D8AE0    83EC 58         sub     esp, 58
004D8AE3    53              push    ebx
004D8AE4    56              push    esi
004D8AE5    57              push    edi
004D8AE6    8965 E8         mov     dword ptr [ebp-18], esp
004D8AE9    FF15 64025100   call    dword ptr [510264]               ; kernel32.GetVersion
004D8AEF    33D2            xor     edx, edx
此时脱壳完成,使用LoadPE dump出来,保存为dump.exe
打开ImportRec,修复IAT,输入OEP = 004D8AC3 – 400000 = D8AC3
ImportRec选择自动查找IAT即可,选择修复转储文件,选择dump.exe,ImportRec自动报错为dump_.exe脱壳完毕。
PEiD查壳dump_.exe, 为Microsoft Visual C++ 6.0编写

用OD打开dump_.exe文件:
F9运行,选择注册,输入错误的注册码:12345678,选择注册,弹出注册对话框:
检测结果:错误的注册码
回到OD,选择F12,选择K界面

选择C,回到当前页面
选择CTRL + G,输入 00459EC0
00459EB8   .  8D0470        lea     eax, dword ptr [eax+esi*2]
00459EBB   .  50            push    eax                              ; /Style
00459EBC   .  52            push    edx                              ; |Title
00459EBD   .  51            push    ecx                              ; |Text
00459EBE   .  6A 00         push    0                                ; |hOwner = NULL
00459EC0   .  FF15 C0065100 call    dword ptr [<&user32.MessageBoxA>>; \MessageBoxA
00459EC6   .  5F            pop     edi,此处下断点
00459EC7   .  83F8 03       cmp     eax, 3                           ;  Switch (cases 2..7)
00459ECA   .  5E            pop     esi
选择F9运行
注册失败对话框点击确定,则程序停在00459EC6   .  5F     pop     edi,此处
向上翻页:
00459E20   .  83EC 64       sub     esp, 64,此处下断点,删除00459EC6处断点   
00459E23   .  56            push    esi
00459E24   .  8B7424 74     mov     esi, dword ptr [esp+74]
00459E28   .  57            push    edi
00459E29   .  8B7E 08       mov     edi, dword ptr [esi+8]
00459E2C   .  57            push    edi
00459E2D   .  E8 2E650700   call    004D0360
00459E32   .  83C4 04       add     esp, 4
00459E35   .  85C0          test    eax, eax
00459E37   .  74 10         je      short 00459E49
重新选择注册:
程序停在00459E20   .  83EC 64       sub     esp, 64 处
F8单步执行
我们发现无论怎么修改判定条件,程序都不能正常显示注册,那么我们就根据堆栈回溯:

0012F6B4   0047D2C1  返回到 dumped_.0047D2C1
0012F6B8   0012F6C4
0012F6BC   00000003
0012F6C0   0012F6D8
0012F6C4   00000000
0012F6C8   00000000
0012F6CC   00000000
0012F6D0   0043C536  返回到 dumped_.0043C536 来自 dumped_.00457AD5

使用CTRL+G来到0043C536处,并向上翻页
来到此处:
0043BE89  /$  55            push    ebp 这里下断点
0043BE8A  |.  8BEC          mov     ebp, esp
0043BE8C  |.  81EC 14000000 sub     esp, 14
0043BE92  |.  6A FF         push    -1
0043BE94  |.  6A 08         push    8
0043BE96  |.  68 03200116   push    16012003
0043BE9B  |.  68 8E190152   push    5201198E
0043BEA0  |.  E8 60BC0100   call    00457B05
0043BEA5  |.  83C4 10       add     esp, 10
0043BEA8  |.  8945 FC       mov     dword ptr [ebp-4], eax
0043BEAB  |.  68 04000080   push    80000004
0043BEB0  |.  6A 00         push    0
0043BEB2  |.  8B45 FC       mov     eax, dword ptr [ebp-4]
0043BEB5  |.  85C0          test    eax, eax
0043BEB7  |.  75 05         jnz     short 0043BEBE
重新注册:
程序断到此处:

F8单步运行,F8的时候观察堆栈数据,
如下:
0012F6FC   00783C60  dumped_.00783C60
0012F700   0012F744
0012F704   00000001
0012F708   00D92628
0012F70C   001DAD60  ASCII "12345678"此处出现注册码
0012F710  /0012F744
选择出现注册码部分,数据窗口跟随,并下内存访问断点,断下后,并返回用户窗口:
得到如下算法部分:
004FC29F  /$  A1 24257700   mov     eax, dword ptr [772524]
004FC2A4  |.  53            push    ebx
004FC2A5  |.  8B5C24 08     mov     ebx, dword ptr [esp+8]
004FC2A9  |.  56            push    esi
004FC2AA  |.  8BF1          mov     esi, ecx
004FC2AC  |.  57            push    edi
004FC2AD  |.  85DB          test    ebx, ebx
004FC2AF  |.  8906          mov     dword ptr [esi], eax
004FC2B1  |.  74 36         je      short 004FC2E9
004FC2B3  |.  8BC3          mov     eax, ebx
004FC2B5  |.  C1E8 10       shr     eax, 10
004FC2B8  |.  66:85C0       test    ax, ax
004FC2BB  |.  75 0B         jnz     short 004FC2C8
004FC2BD  |.  0FB7C3        movzx   eax, bx
004FC2C0  |.  50            push    eax
004FC2C1  |.  E8 CC5A0000   call    00501D92
004FC2C6  |.  EB 21         jmp     short 004FC2E9
004FC2C8  |>  53            push    ebx                              ; /String
004FC2C9  |.  FF15 6C035100 call    dword ptr [<&kernel32.lstrlen>]  ; \lstrlenA
004FC2CF  |.  8BF8          mov     edi, eax
004FC2D1  |.  85FF          test    edi, edi
004FC2D3  |.  74 14         je      short 004FC2E9
004FC2D5  |.  57            push    edi
004FC2D6  |.  8BCE          mov     ecx, esi
004FC2D8  |.  E8 C1FDFFFF   call    004FC09E
004FC2DD  |.  57            push    edi
004FC2DE  |.  53            push    ebx
004FC2DF  |.  FF36          push    dword ptr [esi]
004FC2E1  |.  E8 BAF7FDFF   call    004DBAA0
004FC2E6  |.  83C4 0C       add     esp, 0C
004FC2E9  |>  8BC6          mov     eax, esi
004FC2EB  |.  5F            pop     edi
004FC2EC  |.  5E            pop     esi
004FC2ED  |.  5B            pop     ebx
004FC2EE  \.  C2 0400       retn    4

此处我们只做爆破,算法部分大家自己去研究。
F8继续往下:
0043C344  |.  53            push    ebx
0043C345  |.  E8 97B70100   call    00457AE1
0043C34A  |.  83C4 04       add     esp, 4
0043C34D  |>  E8 78020000   call    0043C5CA
0043C352  |.  85C0          test    eax, eax
0043C354  |.  0F84 52010000 je      0043C4AC   来看这是一个远跳转
此时,修改条件,使其不跳转,然后运行,则提示注册已成功
0043C35A  |.  6A 00         push    0
0043C35C  |.  68 01000000   push    1
0043C361  |.  6A FF         push    -1
0043C363  |.  6A 06         push    6
0043C365  |.  68 06200116   push    16012006
0043C36A  |.  68 8E190152   push    5201198E
0043C36F  |.  E8 8BB70100   call    00457AFF
由此可见0043C5CA函数是算法验证部分,其返回为1的时候,表示验证成功。
所以我们做如下修改:
0043C344  |.  53            push    ebx
0043C345  |.  E8 97B70100   call    00457AE1
0043C34A  |.  83C4 04       add     esp, 4
0043C34D  |>  E8 78020000   call    0043C5CA
0043C352  |.  85C0          test    eax, eax
0043C354      0F85 52010000 jnz     0043C4AC修改此处
0043C35A  |.  6A 00         push    0
0043C35C  |.  68 01000000   push    1
0043C361  |.  6A FF         push    -1
0043C363  |.  6A 06         push    6
保存文件为aaa.exe
运行aaa.exe,注册可以成功
但是在其他选项中,选择其他功能,则还是不能运行
用OD运行aaa.exe,选择设置,提示未注册版本无法使用此功能,请注册
此时我们按下F12,

来到00459EC6处,并向上翻页,断到
00459E20   .  83EC 64       sub     esp, 64 下断点
00459E23   .  56            push    esi
00459E24   .  8B7424 74     mov     esi, dword ptr [esp+74]
00459E28   .  57            push    edi
00459E29   .  8B7E 08       mov     edi, dword ptr [esi+8]
00459E2C   .  57            push    edi
00459E2D   .  E8 2E650700   call    004D0360
00459E32   .  83C4 04       add     esp, 4
00459E35   .  85C0          test    eax, eax
00459E37   .  74 10         je      short 00459E49

重新选择其他中的一个功能选项:
则程序断下:
00459E20   .  83EC 64       sub     esp, 64 断在此处
00459E23   .  56            push    esi
00459E24   .  8B7424 74     mov     esi, dword ptr [esp+74]
00459E28   .  57            push    edi
00459E29   .  8B7E 08       mov     edi, dword ptr [esi+8]
00459E2C   .  57            push    edi
00459E2D   .  E8 2E650700   call    004D0360
查看栈中数据:
0012F6F0   0047D2C1  返回到 aaa.0047D2C1
0012F6F4   0012F700
0012F6F8   00000003
0012F6FC   0012F714
0012F700   00000000
0012F704   00000000
0012F708   00000000
0012F70C   0044EF9F  返回到 aaa.0044EF9F 来自 aaa.00457AD5
0012F710   00000003
CTRL+G 来到0044EF9F处

0044EF51  /.  55            push    ebp 在此处下断点
0044EF52  |.  8BEC          mov     ebp, esp
0044EF54  |.  81EC 0C000000 sub     esp, 0C
0044EF5A  |.  E8 2035FBFF   call    0040247F
0044EF5F  |.  8945 F8       mov     dword ptr [ebp-8], eax
0044EF62  |.  837D F8 00    cmp     dword ptr [ebp-8], 0
0044EF66  |.  0F85 58000000 jnz     0044EFC4
0044EF6C  |.  68 04000080   push    80000004
0044EF71  |.  6A 00         push    0
0044EF73  |.  68 2AE25600   push    0056E22A
0044EF78  |.  68 01030080   push    80000301
0044EF7D  |.  6A 00         push    0
0044EF7F  |.  68 40000000   push    40
0044EF84  |.  68 04000080   push    80000004
0044EF89  |.  6A 00         push    0
0044EF8B  |.  68 98E25600   push    0056E298
0044EF90  |.  68 03000000   push    3
0044EF95  |.  BB 209E4500   mov     ebx, 00459E20
0044EF9A  |.  E8 368B0000   call    00457AD5
0044EF9F  |.  83C4 28       add     esp, 28
重新选择其他选择,则断在此处:
0044EF51  /.  55            push    ebp此处断下
0044EF52  |.  8BEC          mov     ebp, esp
0044EF54  |.  81EC 0C000000 sub     esp, 0C
0044EF5A  |.  E8 2035FBFF   call    0040247F
0044EF5F  |.  8945 F8       mov     dword ptr [ebp-8], eax
0044EF62  |.  837D F8 00    cmp     dword ptr [ebp-8], 0
0044EF66  |.  0F85 58000000 jnz     0044EFC4 修改此处跳转,没有弹出对话框
所以修改如下:
0044EF5A  |.  E8 2035FBFF   call    0040247F
0044EF5F  |.  8945 F8       mov     dword ptr [ebp-8], eax
0044EF62      837D F8 01    cmp     dword ptr [ebp-8], 1
0044EF66  |.  0F85 58000000 jnz     0044EFC4

修改保存文件为bbb.exe
如此,就实现了第一个功能的爆破
同理在地址
0043BAD4  /.  55            push    ebp
0043BAD5  |.  8BEC          mov     ebp, esp
0043BAD7  |.  81EC 0C000000 sub     esp, 0C
0043BADD  |.  E8 9D69FCFF   call    0040247F
0043BAE2  |.  8945 F8       mov     dword ptr [ebp-8], eax
0043BAE5  |.  837D F8 00    cmp     dword ptr [ebp-8], 0
0043BAE9  |.  0F85 58000000 jnz     0043BB47
修改为:
0043BAD4  /.  55            push    ebp
0043BAD5  |.  8BEC          mov     ebp, esp
0043BAD7  |.  81EC 0C000000 sub     esp, 0C
0043BADD  |.  E8 9D69FCFF   call    0040247F
0043BAE2  |.  8945 F8       mov     dword ptr [ebp-8], eax
0043BAE5  |.  837D F8 00    cmp     dword ptr [ebp-8], 1
0043BAE9  |.  0F85 58000000 jnz     0043BB47
实现第二个功能的爆破

在地址
0043BBF1  /.  55            push    ebp
0043BBF2  |.  8BEC          mov     ebp, esp
0043BBF4  |.  81EC 0C000000 sub     esp, 0C
0043BBFA  |.  E8 8068FCFF   call    0040247F
0043BBFF  |.  8945 F8       mov     dword ptr [ebp-8], eax
0043BC02  |.  837D F8 00    cmp     dword ptr [ebp-8], 0
0043BC06  |.  0F85 58000000 jnz     0043BC64
修改为:
0043BBF1  /.  55            push    ebp
0043BBF2  |.  8BEC          mov     ebp, esp
0043BBF4  |.  81EC 0C000000 sub     esp, 0C
0043BBFA  |.  E8 8068FCFF   call    0040247F
0043BBFF  |.  8945 F8       mov     dword ptr [ebp-8], eax
0043BC02  |.  837D F8 00    cmp     dword ptr [ebp-8], 1
0043BC06  |.  0F85 58000000 jnz     0043BC64
实现第四个功能的爆破
此时已经对该软件完全爆破

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 386
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
好牛的xxx,这样的也被你xxx了
2011-8-18 19:26
0
雪    币: 1015
活跃值: (235)
能力值: ( LV12,RANK:440 )
在线值:
发帖
回帖
粉丝
3
support!
2011-8-18 20:39
0
雪    币: 697
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
看着眼熟,和**取名软件一个路数,各位小心了,哈哈
2011-8-18 20:41
0
雪    币: 212
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
给人一种言简意赅的感觉,顶起!
2011-8-18 20:46
0
游客
登录 | 注册 方可回帖
返回
//