能力值:
( LV2,RANK:10 )
|
-
-
2 楼
学习了~~~
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
请教下楼主,在分析算法时,进入注册码提取时,是不是每个call都要进入去看啊?
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
谢谢!学习
|
能力值:
(RANK:2210 )
|
-
-
5 楼
最初由 SeaHome 发布 请教下楼主,在分析算法时,进入注册码提取时,是不是每个call都要进入去看啊? 不用的,最好记住你输入的注册码和注册名的位数.
注意寄存器的值,有的CALL就是取注册信息的位数.就没必要跟进去看了.
当步过有的CALL时,寄存器和堆栈的内容会发生很大的变化,这时最好跟进去看看
呵呵~只是我的一点心得,
最重要的还是多多练习
|
能力值:
( LV9,RANK:970 )
|
-
-
6 楼
其实这个程序也没有什么很大的陷阱,只是程序在启动的时候,HOOK了MessageBoxA这个API,把它改到了0x0040103D,用到了最常见的5BYTE的JMP跳转的小把戏。
HOOK API的地方:
00401281 |. 68 F8364000 push 004036F8 ; /FileName = "user32.dll"
00401286 |. E8 3D030000 call <jmp.&kernel32.LoadLibraryA> ; \LoadLibraryA
0040128B |. A3 0D394000 mov [40390D], eax
00401290 |. 8D1D F8364000 lea ebx, [4036F8]
00401296 |. B8 7373654D mov eax, 4D657373
0040129B |. 50 push eax
0040129C |. E8 BC020000 call 0040155D
004012A1 |. 8903 mov [ebx], eax
004012A3 |. 83C3 04 add ebx, 4
004012A6 |. B8 42656761 mov eax, 61676542
004012AB |. 50 push eax
004012AC |. E8 AC020000 call 0040155D
004012B1 |. 8903 mov [ebx], eax
004012B3 |. 83C3 04 add ebx, 4
004012B6 |. B8 0041786F mov eax, 6F784100
004012BB |. 50 push eax
004012BC |. E8 9C020000 call 0040155D
004012C1 |. 8903 mov [ebx], eax
004012C3 |. 68 F8364000 push 004036F8 ; /ProcNameOrOrdinal = "MessageBoxA"
004012C8 |. FF35 0D394000 push dword ptr [40390D] ; |hModule = 77D10000 (user32)
004012CE |. E8 EF020000 call <jmp.&kernel32.GetProcAddress> ; \GetProcAddress ;得到MessageBoxA的地址
004012D3 |. A3 11394000 mov [403911], eax ;保存MessageBoxA这个地址
004012D8 |. 8B1D 09394000 mov ebx, [403909] ; asm_cm01.0040103D
004012DE |. 83C0 05 add eax, 5
004012E1 |. 2BD8 sub ebx, eax
004012E3 |. 8D0D 15394000 lea ecx, [403915]
004012E9 |. C601 E9 mov byte ptr [ecx], 0E9 //以上是做JMP的5 BYTES的跳转,跳转地址是asm_cm01.0040103D
004012EC |. 41 inc ecx ; asm_cm01.00403915
004012ED |. 8919 mov [ecx], ebx
004012EF |. 6A 00 push 0 ; /pBytesWritten = NULL
004012F1 |. 6A 05 push 5 ; |BytesToWrite = 5
004012F3 |. 68 15394000 push 00403915 ; |Buffer = asm_cm01.00403915
004012F8 |. FF35 11394000 push dword ptr [403911] ; |Address = 77D5050B
004012FE |. FF35 1A394000 push dword ptr [40391A] ; |hProcess = 0000005C (window)
00401304 |. E8 CB020000 call <jmp.&kernel32.WriteProcessMemory> ; \WriteProcessMemory
//通过修改MessageBoxA的入口,修改成5BYTE的JMP,达到Hook这个API到自己代码的目的。
00401309 |. C9 leave
0040130A \. C2 0400 retn 4
调用部分:
00401467 |> \A3 FC384000 mov [4038FC], eax
0040146C |. 33C9 xor ecx, ecx
0040146E |> 8D15 F8304000 /lea edx, [4030F8]
00401474 |. 0FB61C11 |movzx ebx, byte ptr [ecx+edx]
00401478 |. 881D 04394000 |mov [403904], bl
0040147E |. 41 |inc ecx
0040147F |. 51 |push ecx
00401480 |. 0FAF0D FC3840>|imul ecx, [4038FC]
00401487 |. 83C1 17 |add ecx, 17
0040148A |. 83F1 0F |xor ecx, 0F
0040148D |. 33D9 |xor ebx, ecx
0040148F |. 8BC1 |mov eax, ecx
00401491 |. 8D0D F8324000 |lea ecx, [4032F8]
00401497 |. 030D 00394000 |add ecx, [403900]
0040149D |. 51 |push ecx
0040149E |. 50 |push eax ; /<%u>
0040149F |. 68 12304000 |push 00403012 ; |Format = "%u"
004014A4 |. 51 |push ecx ; |s
004014A5 |. E8 D0000000 |call <jmp.&user32.wsprintfA> ; \wsprintfA
004014AA |. 83C4 0C |add esp, 0C
004014AD |. 59 |pop ecx
004014AE |. 51 |push ecx ; /String
004014AF |. E8 2C010000 |call <jmp.&kernel32.lstrlenA> ; \lstrlenA
004014B4 |. 0105 00394000 |add [403900], eax
004014BA |. 59 |pop ecx
004014BB |. 803D 04394000>|cmp byte ptr [403904], 0
004014C2 |.^ 75 AA \jnz short 0040146E
004014C4 |. 68 F4010000 push 1F4 ; /Count = 1F4 (500.)
004014C9 |. 68 F8344000 push 004034F8 ; |Buffer = asm_cm01.004034F8
004014CE |. 68 EA030000 push 3EA ; |ControlID = 3EA (1002.)
004014D3 |. FF75 08 push dword ptr [ebp+8] ; |hWnd
004014D6 |. E8 B7000000 call <jmp.&user32.GetDlgItemTextA> ; \GetDlgItemTextA
004014DB |. 66:0BC0 or ax, ax
004014DE |. 75 1E jnz short 004014FE
004014E0 |. 6A 00 push 0 ; /LanguageID = 0 (LANG_NEUTRAL)
004014E2 |. 6A 00 push 0 ; |Style = MB_OK|MB_APPLMODAL
004014E4 |. 68 76304000 push 00403076 ; |Title = "Lesco's first assembler crackme"
004014E9 |. 68 D8304000 push 004030D8 ; |Text = "Enter a serial"
004014EE |. 6A 00 push 0 ; |hOwner = NULL
004014F0 |. E8 AF000000 call <jmp.&user32.MessageBoxExA> ; \MessageBoxExA
004014F5 |. B8 01000000 mov eax, 1
004014FA |. C9 leave
004014FB |. C2 1000 retn 10
004014FE |> 68 F8324000 push 004032F8 ; /String2 = ""
00401503 |. 68 F8344000 push 004034F8 ; |String1 = ""
00401508 |. E8 CD000000 call <jmp.&kernel32.lstrcmpA> ; \lstrcmpA
0040150D |. 0BC0 or eax, eax
0040150F |. 75 15 jnz short 00401526
00401511 |. 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
00401513 |. 68 76304000 push 00403076 ; |Title = "Lesco's first assembler crackme"
00401518 |. 68 96304000 push 00403096 ; |Text = "Congrats, u did it!!!"
0040151D |. 6A 00 push 0 ; |hOwner = NULL
0040151F |. E8 7A000000 call <jmp.&user32.MessageBoxA> ; \MessageBoxA ;这里全都Hook到asm_cm01.0040103D
00401524 |. EB 13 jmp short 00401539
00401526 |> 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
00401528 |. 68 76304000 push 00403076 ; |Title = "Lesco's first assembler crackme"
0040152D |. 68 AC304000 push 004030AC ; |Text = "This serial sucks!!!"
00401532 |. 6A 00 push 0 ; |hOwner = NULL
00401534 |. E8 65000000 call <jmp.&user32.MessageBoxA> ; \MessageBoxA ;这里全都Hook到asm_cm01.0040103D
00401539 |> 6A 00 push 0 ; /ExitCode = 0
0040153B |. E8 76000000 call <jmp.&kernel32.ExitProcess> ; \ExitProcess
00401540 |> 837D 14 00 cmp dword ptr [ebp+14], 0
00401544 |. 74 0E je short 00401554
00401546 |. 8B55 10 mov edx, [ebp+10]
00401549 |. C1EA 10 shr edx, 10
0040154C |. EB 06 jmp short 00401554
0040154E |> 33C0 xor eax, eax
00401550 |. C9 leave
00401551 |. C2 1000 retn 10
真正的比较是在asm_cm01.0040103D里面进行的,这里我只是说一下这个程序中用到的小把戏。
|
能力值:
(RANK:2210 )
|
-
-
7 楼
恩!太好了,认真学习了。。。
对于我这样的菜鸟可就是大陷阱了
|
能力值:
( LV9,RANK:970 )
|
-
-
8 楼
|
能力值:
(RANK:2210 )
|
-
-
9 楼
等我玩加密算法的时候
还得多多指教呢。。。
|
能力值:
( LV9,RANK:970 )
|
-
-
10 楼
最初由 逍遥风 发布 等我玩加密算法的时候 还得多多指教呢。。。
欢迎交流,QQ 448089717
|
能力值:
( LV6,RANK:90 )
|
-
-
11 楼
此CRACKME与操作系统有关,且算法不一样:
在Win98下可运行 name: lovetc code: 18443832585278
在Win2000下不能运行
在WinXP下可运行 name: lovetc code: b484C8646ea16E429507962
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
支持 & 学习了```
|
能力值:
( LV4,RANK:50 )
|
-
-
13 楼
强啊。以前我自己还有这个思路来着,原来高手早用过啦~
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
谢谢楼主啊。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
看晕了 还得从基础开始了
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
支持 & 学习了```
支持 & 学习了```
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
又总结了一下思路.
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
天啊~! 佩服
我这两天刚学,随便找了一个足彩软件,跟踪了半天
居然还找不到自己输入的注册信息 晕阿
我对照这od入门1,2看了半天 也看不懂问题在哪儿:(
|