能力值:
( LV12,RANK:300 )
|
-
-
2 楼
可能是做了anti-debug
关键在于DlgProc这个窗口过程函数的内容。
最好把程序打包发上来。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
这个crackme是看雪论坛上的
忘了在哪里找的
我上传上来
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
处理窗口过程函数的代码一般在哪个节区里,在代码段里吗?
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
很流畅啊,没楼主形容的情况。
顺手爆破了,
代码见如下
004010F2 |. 68 00204000 PUSH abexcm5.00402000 ; |String1 = ""
004010F7 |. E8 51000000 CALL <JMP.&KERNEL32.lstrcmpiA> ; \lstrcmpiA
004010FC |. 83F8 00 CMP EAX,0
004010FF 74 16 JE SHORT abexcm5.00401117 ; 爆破点,汇编为JMP就好。
00401101 |. 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
00401103 |. 68 34244000 PUSH abexcm5.00402434 ; |error!
00401108 |. 68 3B244000 PUSH abexcm5.0040243B ; |the serial you entered is not correct!
0040110D |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
00401110 |. E8 56000000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
00401115 |. EB 16 JMP SHORT abexcm5.0040112D
00401117 |> 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
00401119 |. 68 06244000 PUSH abexcm5.00402406 ; |well done!
0040111E |. 68 11244000 PUSH abexcm5.00402411 ; |yep, you entered a correct serial!
00401123 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
00401126 |. E8 40000000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
我明白了....
0040100C |. 6A 00 push 0 ; /lParam = NULL
0040100E |. 68 29104000 push 00401029 ; |DlgProc = abexcm5.00401029
00401013 |. 6A 00 push 0 ; |hOwner = NULL
00401015 |. 6A 01 push 1 ; |pTemplate = 1
00401017 |. FF35 EC234000 push dword ptr [4023EC] ; |hInst = 00400000
0040101D |. E8 3D010000 call <jmp.&USER32.DialogBoxParamA> ; \DialogBoxParamA
00401022 |. 6A 00 push 0 ; /ExitCode = 0
00401024 \. E8 1E010000 call <jmp.&KERNEL32.ExitProcess> ; \ExitProcess
00401029 /. C8 000000 enter 0, 0
DlgProc 地址就是1029 ,跳过了exitprocess.
但是用OD怎么像正常运行那样
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
谢谢楼上的,我早把算法也看出来,就是开始不明白为什么OD 运行不下去.......
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
enter指令是什么用法,有谁知道帮忙告诉我.
|
能力值:
( LV12,RANK:300 )
|
-
-
9 楼
OD只需要F9就行了。
其实调用DialogBoxParamA的时候,程序就跑起来了,窗口就出现了,就进入了一个消息循环(处理消息的函数正是从00401029开始),也就是说DialogBoxParamA其实一直没有返回,直到用户点击窗口关闭按钮(或处理函数自己使用EndDialog等方法),窗口做完其他处理之后才退出消息循环(这时窗口已经没了),这时DialogBoxParamA才返回,才ExitProcess
因此,这和在OD中一直F8是不同的,遇到这种创建窗口的函数,应该跟进它处理消息的窗口过程。
|
能力值:
( LV12,RANK:300 )
|
-
-
10 楼
详细地来说,由于程序是在用户点击check按钮之后进行序列号正确与否的判断的,我们就应该顺着窗口处理消息的过程,找到相应的处理代码。
0040100C |. 6A 00 push 0 ; /lParam = NULL
0040100E |. 68 29104000 push 00401029 ; |DlgProc = abexcm5.00401029
00401013 |. 6A 00 push 0 ; |hOwner = NULL
00401015 |. 6A 01 push 1 ; |pTemplate = 1
00401017 |. FF35 EC234000 push dword ptr [4023EC] ; |hInst = NULL
0040101D |. E8 3D010000 call <jmp.&USER32.DialogBoxParamA> ; \DialogBoxParamA
从以上看到,00401029就是主窗口的消息处理函数,跟进去:
00401029 /. C8 000000 enter 0, 0
0040102D |. 817D 0C 11010>cmp dword ptr [ebp+C], 111 ; MSG=WM_COMMAND,当用户点击窗口中的按钮时,窗口过程就会收到这条消息
00401034 |. 75 07 jnz short 0040103D
00401036 |. E8 1B000000 call 00401056 ; 是WM_COMMAND则进入
0040103B |. EB 13 jmp short 00401050
……
00401050 |> \33C0 xor eax, eax ; return 0
00401052 |. C9 leave
00401053 \. C2 1000 retn 10
当用户点击check按钮时,主窗口收到WM_COMMAND消息,进入00401056处理:
00401056 /$ 837D 10 65 cmp dword ptr [ebp+10], 65 ; wparam==check按钮的ID
0040105A |. 74 10 je short 0040106C
……
0040106C |> \6A 25 push 25 ; /Count = 25 (37.)
0040106E |. 68 24234000 push 00402324 ; |Buffer = abexcm5.00402324
00401073 |. 6A 68 push 68 ; |ControlID = 68 (104.)
00401075 |. FF75 08 push dword ptr [ebp+8] ; |hWnd
00401078 |. E8 F4000000 call <jmp.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
得到Edit文本框中的字符(0x68为该Edit控件的ID)
0040107D |. 6A 00 push 0 ; /pFileSystemNameSize = NULL
0040107F |. 6A 00 push 0 ; |pFileSystemNameBuffer = NULL
00401081 |. 68 C8204000 push 004020C8 ; |pFileSystemFlags = abexcm5.004020C8
00401086 |. 68 90214000 push 00402190 ; |pMaxFilenameLength = abexcm5.00402190
0040108B |. 68 94214000 push 00402194 ; |pVolumeSerialNumber = abexcm5.00402194
00401090 |. 6A 32 push 32 ; |MaxVolumeNameSize = 32 (50.)
00401092 |. 68 5C224000 push 0040225C ; |VolumeNameBuffer = abexcm5.0040225C
00401097 |. 6A 00 push 0 ; |RootPathName = NULL
00401099 |. E8 B5000000 call <jmp.&KERNEL32.GetVolumeInformat>; \GetVolumeInformationA
取得硬盘卷名
0040109E |. 68 F3234000 push 004023F3 ; /StringToAdd = "4562-ABEX"
004010A3 |. 68 5C224000 push 0040225C ; |ConcatString = ""
004010A8 |. E8 94000000 call <jmp.&KERNEL32.lstrcatA> ; \lstrcatA
将卷名加上"4562-ABEX"
004010AD |. B2 02 mov dl, 2
004010AF |> 8305 5C224000>/add dword ptr [40225C], 1
004010B6 |. 8305 5D224000>|add dword ptr [40225D], 1
004010BD |. 8305 5E224000>|add dword ptr [40225E], 1
004010C4 |. 8305 5F224000>|add dword ptr [40225F], 1
004010CB |. FECA |dec dl
004010CD |.^ 75 E0 \jnz short 004010AF
对结果的前面四个字节进行处理
004010CF |. 68 FD234000 push 004023FD ; /StringToAdd = "L2C-5781"
004010D4 |. 68 00204000 push 00402000 ; |ConcatString = ""
004010D9 |. E8 63000000 call <jmp.&KERNEL32.lstrcatA> ; \lstrcatA
004010DE |. 68 5C224000 push 0040225C ; /StringToAdd = ""
004010E3 |. 68 00204000 push 00402000 ; |ConcatString = ""
004010E8 |. E8 54000000 call <jmp.&KERNEL32.lstrcatA> ; \lstrcatA
在得到的结果前面加上"L2C-5781"
004010ED |. 68 24234000 push 00402324 ; /String2 = ""
004010F2 |. 68 00204000 push 00402000 ; |String1 = ""
004010F7 |. E8 51000000 call <jmp.&KERNEL32.lstrcmpiA> ; \lstrcmpiA
将这一番处理的结果,和Edit控件中的字符比较
004010FC |. 83F8 00 cmp eax, 0
004010FF |. 74 16 je short 00401117
两者相同,则显示注册正确的对话框,不同则显示错误的对话框
00401101 |. 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
00401103 |. 68 34244000 push 00402434 ; |Title = "Error!"
00401108 |. 68 3B244000 push 0040243B ; |Text = "The serial you entered is not correct!"
0040110D |. FF75 08 push dword ptr [ebp+8] ; |hOwner
00401110 |. E8 56000000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA
00401115 |. EB 16 jmp short 0040112D
00401117 |> 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
00401119 |. 68 06244000 push 00402406 ; |Title = "Well Done!"
0040111E |. 68 11244000 push 00402411 ; |Text = "Yep, you entered a correct serial!"
00401123 |. FF75 08 push dword ptr [ebp+8] ; |hOwner
00401126 |. E8 40000000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA
0040112B |. EB 00 jmp short 0040112D
0040112D |$ 6A 00 push 0 ; /Result = 0
0040112F |. FF75 08 push dword ptr [ebp+8] ; |hWnd
00401132 |. E8 22000000 call <jmp.&USER32.EndDialog> ; \EndDialog
00401137 |. C9 leave
00401138 \. C2 1000 retn 10
这就是处理的全过程,顺藤摸瓜地下来。
当然,可以直接通过注册错误的对话框,通过字符串参考就可以轻松找到关键位置。但是这样的从头开始的分析,还是很有必要的,特别是对于没有注册错误提示的软件。
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
楼上的很有耐心,谢谢拉,你的消息注释是自己查VC头文件还是有插件,插件的话能不能上传共享一下...
|
|
|