首页
社区
课程
招聘
[旧帖] [求助]程序怎么运行下去 0.00雪花
发表于: 2008-5-20 16:57 4058

[旧帖] [求助]程序怎么运行下去 0.00雪花

2008-5-20 16:57
4058


是个汇编写的crackme,程序却可以正常运行下去,为什么OD反汇编后一运行就死.....

很疑惑

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

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
2
可能是做了anti-debug
关键在于DlgProc这个窗口过程函数的内容。
最好把程序打包发上来。
2008-5-20 17:16
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这个crackme是看雪论坛上的

忘了在哪里找的

我上传上来
上传的附件:
2008-5-20 17:58
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
处理窗口过程函数的代码一般在哪个节区里,在代码段里吗?
2008-5-20 18:10
0
雪    币: 200
活跃值: (10)
能力值: ( 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
2008-5-20 18:12
0
雪    币: 206
活跃值: (10)
能力值: ( 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怎么像正常运行那样
2008-5-20 18:14
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
谢谢楼上的,我早把算法也看出来,就是开始不明白为什么OD 运行不下去.......
2008-5-20 18:17
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
enter指令是什么用法,有谁知道帮忙告诉我.
2008-5-20 18:19
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
9
OD只需要F9就行了。
其实调用DialogBoxParamA的时候,程序就跑起来了,窗口就出现了,就进入了一个消息循环(处理消息的函数正是从00401029开始),也就是说DialogBoxParamA其实一直没有返回,直到用户点击窗口关闭按钮(或处理函数自己使用EndDialog等方法),窗口做完其他处理之后才退出消息循环(这时窗口已经没了),这时DialogBoxParamA才返回,才ExitProcess

因此,这和在OD中一直F8是不同的,遇到这种创建窗口的函数,应该跟进它处理消息的窗口过程。
2008-5-20 18:37
0
雪    币: 722
活跃值: (123)
能力值: ( 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

这就是处理的全过程,顺藤摸瓜地下来。

当然,可以直接通过注册错误的对话框,通过字符串参考就可以轻松找到关键位置。但是这样的从头开始的分析,还是很有必要的,特别是对于没有注册错误提示的软件。
2008-5-20 19:06
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
楼上的很有耐心,谢谢拉,你的消息注释是自己查VC头文件还是有插件,插件的话能不能上传共享一下...
2008-5-21 16:24
0
游客
登录 | 注册 方可回帖
返回
//