文档库 最新最全的文档下载
当前位置:文档库 › 对一个简单程序的破解

对一个简单程序的破解

[原创]对一个简单程序的破解
文章标题:[原创]对一个简单程序的破解顶部 千寂孤城 发布于:2006-06-1911:47 [楼主][原创]对一个简单程序的破解
文章作者:千寂孤城
信息来源:邪恶八进制信息安全团队今天朋友给我一个CrackMe一类的小程序叫我看看,不知道他哪儿弄来的。打开看看再说,界面非常简单,就一个用户名输入框和一个序列号输入框,外加一个Check按钮。随便乱输,用户名qjgc,序列号qjgc,点Check。咚的一声弹个对话框出来(不是通用对话框,有点麻烦):用户名要大于四个!好严格,我刚好4个都不行。OK,用户名qjgcq,再check。咚的一声,那个对话框又来了,这次上面写的是:注册码错误。这两个对话框外形完全一样,估计是同一个过程,就是变了变显示的字符串。
好了,了解得差不多了,反正是CrackMe,不用查壳了,直接载入OD,查找参考文本字串,没找到什么有用的东西,意料之中。接着打开模块中的名称看看,因为对话框弹出来时那咚的一声太耳熟了,又不是通用对话框。果然找到了:名称位于TraceMe,条目36
地址=004040AC
区段=.rdata
类型=输入 (已知)
名称=USER32.MessageBeep查看调用树:Calltree,条目0
调用来自=TraceMe.0040122F
函数过程=USER32.MessageBeep
注释=OK,转到0040122F去,简单分析了一下,附近代码如下:00401173 . 6A51 push 51 ;/Count=51(81.)
00401175 . 51 push ecx ;|Buffer
00401176 . 6A6E push 6E ;|ControlID=6E(110.)
00401178 . 56 push esi ;|hWnd
00401179 . FFD7 call edi ;\GetDlgItemTextW
0040117B . 8D9424EC0000>lea edx,[esp+EC]
00401182 . 6A65 push 65 ;/Count=65(101.)
00401184 . 52 push edx ;|Buffer
00401185 . 68E8030000 push 3E8 ;|ControlID=3E8(1000.)
0040118A . 56 push esi ;|hWnd
0040118B . 8BD8 mov ebx,eax ;|
0040118D . FFD7 call edi ;\GetDlgItemTextW
0040118F . 66:837C244C>cmp wordptr[esp+4C],0
00401195 . 7476 je short0040120D
00401197 . 83FB05 cmp ebx,5
0040119A . 7C71 jl short0040120D
0040119C . 8D44244C lea eax,[esp+4C]
004011A0 . 53 push ebx
004011A1 . 8D8C24F00000>lea ecx,[esp+F0]
004011A8 . 50 push eax
004011A9 . 51 push ecx
004011AA . E871010000 call 00401320
004011AF . 8B3DBC404000mov edi,[<&USER32&

#46;GetDlgItem>] ; USER32.GetDlgItem
004011B5 . 83C40C add esp,0C
004011B8 . 85C0 test eax,eax
004011BA . 7437 je short004011F3
004011BC . 8D54240C lea edx,[esp+C]
004011C0 . 52 push edx ;/String2
004011C1 . 68E4544000 push 004054E4 ;|String1=TraceMe.004054E4
004011C6 . FF1560404000call [<&KERNEL32.lstrcpyW>] ;\lstrcpyW
004011CC . 6A00 push 0 ;/Enable=FALSE
004011CE . 6A6E push 6E ;|/ControlID=6E(110.)
004011D0 . 56 push esi ;||hWnd
004011D1 . FFD7 call edi ;|\GetDlgItem
004011D3 . 8B1DA4404000mov ebx,[<&USER32.EnableWindow>] ;|USER32.EnableWindow
004011D9 . 50 push eax ;|hWnd
004011DA . FFD3 call ebx ;\EnableWindow
004011DC . 6A00 push 0 ;/Enable=FALSE
004011DE . 68E8030000 push 3E8 ;|/ControlID=3E8(1000.)
004011E3 . 56 push esi ;||hWnd
004011E4 . FFD7 call edi ;|\GetDlgItem
004011E6 . 50 push eax ;|hWnd
004011E7 . FFD3 call ebx ;\EnableWindow
004011E9 . 68E8030000 push 3E8 ;/ControlID=3E8(1000.)
004011EE . 56 push esi ;|hWnd
004011EF . FFD7 call edi ;\GetDlgItem
004011F1 . EB33 jmp short00401226
004011F3 > 8D442434 lea eax,[esp+34]
004011F7 . 50 push eax ;/String2
004011F8 . 68E4544000 push 004054E4 ;|String1=TraceMe.004054E4
004011FD . FF1560404000call [<&KERNEL32.lstrcpyW>] ;\lstrcpyW
00401203 . 68E8030000 push 3E8
00401208 . 56 push esi
00401209 . FFD7 call edi
0040120B . EB19 jmp short00401226
0040120D > 8D4C241C lea ecx,[esp+1C]
00401211 . 51 push ecx ;/String2
00401212 . 68E4544000 push 004054E4 ;|String1=TraceMe.004054E4
00401217 . FF1560404000call [<&KERNEL32.lstrcpyW>] ;\lstrcpyW
0040121D . 6A6E push 6E ;/ControlID=6E(110.)
0040121F . 56 push esi ;|hWnd
00401220 . FF15BC404000call [<&USER32.GetDlgItem>] ;\GetDlgItem
00401226 > 50 push eax ;/hWnd
0

0401227 . FF15A8404000call [<&USER32.SetFocus>] ;\SetFocus
0040122D . 6A00 push 0 ;/BeepType=MB_OK
0040122F . FF15AC404000call [<&USER32.MessageBeep>] ;\MessageBeep
00401235 . 8B15E0544000mov edx,[4054E0]
0040123B . 6A00 push 0 ;/lParam=NULL
0040123D . 6860104000 push 00401060 ;|DlgProc=TraceMe.00401060
00401242 . 56 push esi ;|hOwner
00401243 . 6A79 push 79 ;|pTemplate=79
00401245 . 52 push edx ;|hInst=>NULL
00401246 . FF15C8404000call [<&USER32.DialogBoxParamW>] ;\DialogBoxParamW很简单了,一目了然,果然是就一个框框但是显示的字符串可能不同。GetDlgItemTextW应该是在得到用户名和注册码,所以在0040118D下断,几翻调试后得出结论:得到用户名和注册码后,00401197处比较用户名是否小于5,是就跳到0040120D去把字符串变成“用户名要大于四个!”,然后“咚”一声,接着框框出来了。同样,在004011BA处跳到004011F3后字符串变成“注册码错误”,再“咚”,出框。那么可以断定004011AA处就是关键Call了,因为是CrackMe,还是去看看算法吧。单步步入:00401320 /$ 8B54240C mov edx,[esp+C]
00401324 |. 55 push ebp
00401325 |. 8B6C240C mov ebp,[esp+C]
00401329 |. 56 push esi
0040132A |. 33F6 xor esi,esi
0040132C |. 33C0 xor eax,eax
0040132E |. 83FA03 cmp edx,3
00401331 |. 7E29 jle short0040135C
00401333 |. 53 push ebx
00401334 |. 57 push edi
00401335 |. 8D4D06 lea ecx,[ebp+6]
00401338 |. 8D7AFD lea edi,[edx-3]
0040133B |> 83F807 /cmp eax,7
0040133E |. 7E02 |jle short00401342
00401340 |. 33C0 |xor eax,eax
00401342 |> 33D2 |xor edx,edx
00401344 |. 33DB |xor ebx,ebx
00401346 |. 8A9030504000|mov dl,[eax+405030]
0040134C |. 8A19 |mov bl,[ecx]
0040134E |. 0FAFD3 |imul edx,ebx
00401351 |. 03F2 |add esi,edx
00401353 |. 83C102 |add ecx,2
00401356 |. 40 |inc eax
00401357 |. 4F |dec edi
00401358 |.^75E1 \jnz short0040133B
0040135A |. 5F pop edi
0040135B |. 5B pop ebx
0040135C |> 56 push esi ;/<%ld>
0040135D |. 6878504000 push 00405078 ;|Format="%ld"
00401362 |. 55 push ebp ;|s
00401363 |. FF159C404000call [<&USER32.wsprintfW>] ;\wsprintfW
00401369 |. 8B442418 mov eax,[e

sp+18]
0040136D |. 83C40C add esp,0C
00401370 |. 55 push ebp ;/String2
00401371 |. 50 push eax ;|String1
00401372 |. FF1504404000call [<&KERNEL32.lstrcmpW>] ;\lstrcmpW
00401378 |. F7D8 neg eax
0040137A |. 1BC0 sbb eax,eax
0040137C |. 5E pop esi
0040137D |. 40 inc eax
0040137E |. 5D pop ebp
0040137F \. C3 retn呵呵,算法出来了,并不复杂。单步执行时可以看到String2="2318",也就是说用qjgcq算出来的注册码是2318。测试一下,果然,“咚”的一声后:恭喜注册成功!本来该结束了,但是千寂孤城有个不良习惯,凡是破解一个程序一定要暴力破解才有快感,否则总是有点不爽:004011BA 7437 je short004011F3这行NOP掉,注册码无论是什么都正确
0040119A 7C71 jl short0040120D这行也砍了,于是用户名长度可以小于5了,但是不能为0。
00401195 7476 je short0040120D为了完美一点,这行一起宰了,用户名可以为0了。OK,暴完收工。(c)Copyleft2003-2007,EvilOctalSecurityTeam.
ThisfileisdecompiledbyanunregisteredversionofChmDecompiler.
Regsiteredversiondoesnotshowthismessage.
YoucandownloadChmDecompilerat:https://www.wendangku.net/doc/0717559759.html,/


相关文档