能力值:
( LV2,RANK:10 )
|
-
-
4 楼
好久没写文章了……,分析过程:http://www.rrgod.com/post/123.html
你这个估计1分钟就被人秒掉
|
能力值:
( LV4,RANK:50 )
|
-
-
6 楼
支持一下
OD载入程序后 EIP是这里
00406640 > B8 03214000 mov eax, 00402103
00406645 8A38 mov bh, byte ptr [eax]
00406647 B9 03110000 mov ecx, 1103
0040664C 8A50 FF mov dl, byte ptr [eax-1]
0040664F 8810 mov byte ptr [eax], dl
00406651 48 dec eax
00406652 ^ E2 F8 loopd short 0040664C
00406654 8838 mov byte ptr [eax], bh
00406656 ^ FF25 5C664000 jmp dword ptr [40665C] ; crackme.
根据壳的运行原理 我们会知道它总会来到OEP的 所以在这里(我初学时用过的)F8单步走
我这里直接在关键的JMP 处下断点 这样能快点其实和F8单步是一个道理
00406656 ^\FF25 5C664000 jmp dword ptr [40665C] ; crackme.
00406636 ^\FF25 3C664000 jmp dword ptr [40663C] ; crackme.
00406616 - FF25 1C664000 jmp dword ptr [40661C] ; crackme.
可以发现程序会依次走过这几个JMP
直接F4到00406616就可以了 然后F8单步就走到OEP了
00401240 55 db 55 ; CHAR 'U'
00401241 89 db 89
00401242 E5 db E5
00401243 83 db 83
00401244 EC db EC
00401245 08 db 08
00401246 C7 db C7
00401247 04 db 04
00401248 24 db 24 ; CHAR '$'
00401249 02 db 02
0040124A 00 db 00
0040124B 00 db 00
0040124C 00 db 00
0040124D FF db FF
0040124E 15 db 15
0040124F 2C614000 dd <&msvcrt.__set_app_type>
00401253 E8 db E8
00401254 A8 db A8
00401255 FE db FE
00401256 FF db FF
00401257 FF db FF
00401258 90 nop
00401259 8D db 8D
0040125A B4 db B4
0040125B 26 db 26 ; CHAR '&'
0040125C 00 db 00
0040125D 00 db 00
0040125E 00 db 00
0040125F 00 db 00
00401260 $ 55 push ebp
00401261 . 8B0D 44614000 mov ecx, dword ptr [<&msvcrt.atexit>>; msvcrt.atexit
00401267 . 89E5 mov ebp, esp
00401269 . 5D pop ebp
这样看可能有点不舒服吧 其实只要根据F8单步走过语句,按下CTRL+A可以,F8单步也可以分析出应该是这样的结果
00401240 55 push ebp
00401241 89E5 mov ebp, esp
00401243 83EC 08 sub esp, 8
00401246 C70424 020000>mov dword ptr [esp], 2
0040124D FF15 2C614000 call dword ptr [<&msvcrt.__set_app_ty>; msvcrt.__set_app_type
00401253 . E8 A8FEFFFF call 00401100
00401258 . 90 nop
00401259 . 8DB426 000000>lea esi, dword ptr [esi]
00401260 $ 55 push ebp
00401261 . 8B0D 44614000 mov ecx, dword ptr [<&msvcrt.atexit>>; msvcrt.atexit
在OD中扫描一下字符串,就会发现我们想要的关键字符 SUCCESS(程序中的少了个C)
也可以用API函数来定位,都可以的
再输入完用户名和注册码后 我们在下面的GetDlgItemTextA下面来下断点F2
00401797 |. E8 84080000 call <jmp.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
0040179C |. 83EC 10 sub esp, 10
0040179F |. 8D85 C8FDFFFF lea eax, dword ptr [ebp-238]
004017A5 |. 890424 mov dword ptr [esp], eax
004017A8 |. E8 27FBFFFF call 004012D4 ; 计算用户名长度
004017AD |. 8985 C4FDFFFF mov dword ptr [ebp-23C], eax ; |
004017B3 |. 83BD C4FDFFFF>cmp dword ptr [ebp-23C], 4 ; |小于5位就会提示用户名太短了
004017BA |. 7F 27 jg short 004017E3 ; |
004017BC |. C74424 0C 000>mov dword ptr [esp+C], 0 ; |
004017C4 |. C74424 08 444>mov dword ptr [esp+8], 00404044 ; |呵呵用户名太短!uuusucess!
004017CC |. C74424 04 494>mov dword ptr [esp+4], 00404049 ; |用户名太短!uuusucess!
004017D4 |. C70424 000000>mov dword ptr [esp], 0 ; |
004017DB |. E8 50080000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA
004017E0 |. 83EC 10 sub esp, 10
004017E3 |> C785 C0FDFFFF>mov dword ptr [ebp-240], 0
004017ED |> 8B85 C0FDFFFF /mov eax, dword ptr [ebp-240]
004017F3 |. 3B85 C4FDFFFF |cmp eax, dword ptr [ebp-23C]
004017F9 |. 7D 2E |jge short 00401829 ; 循环5次
004017FB |. 8D45 F8 |lea eax, dword ptr [ebp-8]
004017FE |. 0385 C0FDFFFF |add eax, dword ptr [ebp-240] ;
00401804 |. 8D90 D0FDFFFF |lea edx, dword ptr [eax-230]
0040180A |. 8D45 F8 |lea eax, dword ptr [ebp-8]
0040180D |. 0385 C0FDFFFF |add eax, dword ptr [ebp-240]
00401813 |. 2D 30020000 |sub eax, 230 ;
00401818 |. 0FB600 |movzx eax, byte ptr [eax] ;
0040181B |. 04 05 |add al, 5 ; 关键 用户名计算 eax=name[i]+5
0040181D |. 8802 |mov byte ptr [edx], al
0040181F |. 8D85 C0FDFFFF |lea eax, dword ptr [ebp-240]
00401825 |. FF00 |inc dword ptr [eax]
00401827 |.^ EB C4 \jmp short 004017ED
00401829 |> C74424 0C F40>mov dword ptr [esp+C], 1F4 ; |
00401831 |. 8D85 D8FEFFFF lea eax, dword ptr [ebp-128] ; |
00401837 |. 894424 08 mov dword ptr [esp+8], eax ; |
0040183B |. C74424 04 EE0>mov dword ptr [esp+4], 3EE ; |
00401843 |. 8B45 08 mov eax, dword ptr [ebp+8] ; |
00401846 |. 890424 mov dword ptr [esp], eax ; |
00401849 |. E8 D2070000 call <jmp.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
0040184E |. 83EC 10 sub esp, 10 ; 得到注册码的长度
00401851 |. 8D85 C8FDFFFF lea eax, dword ptr [ebp-238]
00401857 |. 894424 04 mov dword ptr [esp+4], eax
0040185B |. 8D85 D8FEFFFF lea eax, dword ptr [ebp-128]
00401861 |. 890424 mov dword ptr [esp], eax
00401864 |. E8 27FAFFFF call 00401290 注册码计算
00401869 |. 8985 BCFDFFFF mov dword ptr [ebp-244], eax ; |
0040186F |. 83BD BCFDFFFF>cmp dword ptr [ebp-244], 0 ; |
00401876 |. 75 65 jnz short 004018DD ; | 爆破修改这里就可以了
00401878 |. C74424 0C 000>mov dword ptr [esp+C], 0 ; |
00401880 |. C74424 08 554>mov dword ptr [esp+8], 00404055 ; |uuusucess!
00401888 |. C74424 04 594>mov dword ptr [esp+4], 00404059 ; |sucess!
00401890 |. C70424 000000>mov dword ptr [esp], 0 ; |
00401897 |. E8 94070000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA
下面是注册码的计算过程
00401296 |> /8B45 08 /mov eax, dword ptr [ebp+8]
00401299 |. |8B55 0C |mov edx, dword ptr [ebp+C]
0040129C |. |0FB600 |movzx eax, byte ptr [eax]
0040129F |. |3A02 |cmp al, byte ptr [edx] 关键 转变后的用户名与注册码做比较
004012A1 |. |75 1B |jnz short 004012BE
004012A3 |. |8B45 08 |mov eax, dword ptr [ebp+8]
004012A6 |. |8038 00 |cmp byte ptr [eax], 0 注册码没有到结束时,跳转
004012A9 |. |75 09 |jnz short 004012B4
004012AB |. |C745 FC 00000>|mov dword ptr [ebp-4], 0
004012B2 |. |EB 1B |jmp short 004012CF
004012B4 |> |FF45 08 |inc dword ptr [ebp+8]
004012B7 |. |8D45 0C |lea eax, dword ptr [ebp+C]
004012BA |. |FF00 |inc dword ptr [eax]
004012BC |.^\EB D8 \jmp short 00401296
比较明显的比较
所以就要符合 serial[i] = name[i]+5 就可以了
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
楼上真不得了!分析的这么清楚,本来给新手玩的,引来一群大牛啊。
|
能力值:
( LV4,RANK:50 )
|
-
-
8 楼
好多初学者都没有一个明确的思路,只是提供一下思路而已
看到翻译小组成员过来,挺高兴
|