160 - 23 Chafe.1
環(huán)境
Windows xp sp3
工具
exeinfope
ollydbg
查殼
用exeinfoe查殼
測(cè)試
可以從左下角狀態(tài)欄看出serial是無效的
直接OD載入字符串搜索
00401274 |. /75 17 jnz XChafe_1.0040128D 00401276 |. |6A 00 push 0x0 ; /Timerproc = NULL; Case 1 (WM_CREATE) of switch 0040123F 00401278 |. |6A 01 push 0x1 ; |Timeout = 1. ms 0040127A |. |68 CA0000>push 0xCA ; |TimerID = CA (202.) 0040127F |. |FF75 08 push [arg.1] ; |hWnd 00401282 |. |E8 A10200>call <jmp.&USER32.SetTimer> ; \SetTimer 00401287 |. |33C0 xor eax,eax 00401289 |. |C9 leave 0040128A |. |C2 1000 retn 0x10 0040128D |> \3D 130100>cmp eax,0x113 00401292 |. 75 50 jnz XChafe_1.004012E4 00401294 |. E8 BA0100>call Chafe_1.00401453 ; Case 113 (WM_TIMER) of switch 0040123F 00401299 |. 0FBE05 66>movsx eax,byte ptr ds:[0x403166] 004012A0 |. 3A05 6731>cmp al,byte ptr ds:[0x403167] 004012A6 |. 75 06 jnz XChafe_1.004012AE ; 這里不能相同 004012A8 |. 33C0 xor eax,eax 004012AA |. C9 leave 004012AB |. C2 1000 retn 0x10 004012AE |> A2 673140>mov byte ptr ds:[0x403167],al ; 可以看出[0x403167]的值要為0x10 004012B3 |. 83F8 10 cmp eax,0x10 ; 這里要相同 004012B6 |. 74 16 je XChafe_1.004012CE 004012B8 |. 68 653040>push Chafe_1.00403065 ; /Text = "Your serial is not valid." 004012BD |. FF35 7C31>push dword ptr ds:[0x40317C] ; |hWnd = NULL 004012C3 |. E8 660200>call <jmp.&USER32.SetWindowTextA> ; \SetWindowTextA 004012C8 |. 33C0 xor eax,eax 004012CA |. C9 leave 004012CB |. C2 1000 retn 0x10 004012CE |> 68 7F3040>push Chafe_1.0040307F ; /Text = "YES! You found your serial!!" 004012D3 |. FF35 7C31>push dword ptr ds:[0x40317C] ; |hWnd = NULL 004012D9 |. E8 500200>call <jmp.&USER32.SetWindowTextA> ; \SetWindowTextA因?yàn)榻缑鏇]有點(diǎn)擊確認(rèn)的按鈕,加上那個(gè)SetTimer函數(shù),可以猜測(cè)是用程序自己檢測(cè)serial是否正確。
可以猜到[0x4012AE]里面的[0x403167]的值是根據(jù)serial是否正確才會(huì)為0x10
搜索程序,觀察哪里使得[0x403167]地址的內(nèi)容發(fā)生改變
可以猜出,只要實(shí)現(xiàn)4個(gè)add byte ptr ds:[0x403166],0x4 ,就可以使得[0x403167]的值為0x10
跟隨這4個(gè)add,查看相應(yīng)的條件。
不難看出,ecx為保存name的字符數(shù)組的長(zhǎng)度,將沒有字符的部分用0填充。
所以這里的條件是只要輸入了name就能使得[0x403166]加0x4了
這里可以看作是這個(gè)程序的算法核心,因?yàn)檫@里有一個(gè)循環(huán),它是用來計(jì)算[0x403188]的值,具體的計(jì)算方法為:
設(shè)x0為[0x403188]的初值,有:
x1 = (x0 + 1) xor k
x2 = (x1 + 1) xor k
x3 = (x3 + 1) xor k
…
xn = (xn-1 + 1) xor k
這個(gè)xn就是在循環(huán)結(jié)束的時(shí)候[0x403188]的值。k的話是輸入的name,每次取name的4個(gè)字節(jié),來進(jìn)行異或,每次取完直接后,下一次取得4個(gè)字節(jié)會(huì)往后移動(dòng)1個(gè)字節(jié)。
00401475 . 6A 00 push 0x0 ; /IsSigned = FALSE 00401477 . 8D45 FC lea eax,dword ptr ss:[ebp-0x4] ; | 0040147A . 50 push eax ; |pSuccess 0040147B . 6A 64 push 0x64 ; |ControlID = 64 (100.) 0040147D . FF35 7031>push dword ptr ds:[0x403170] ; |hWnd = 001402A8 ('TEXme v1.0',class='TEXcls') 00401483 . E8 640000>call <jmp.&USER32.GetDlgItemInt> ; \GetDlgItemInt 00401488 . A3 883140>mov dword ptr ds:[0x403188],eax 0040148D . 837D FC 0>cmp dword ptr ss:[ebp-0x4],0x0 00401491 . 74 07 je XChafe_1.0040149A ; 這里判斷輸入框是否有值,此時(shí)EAX為輸入的值得16進(jìn)制,字符不計(jì)算在內(nèi) 00401493 . 8005 6631>add byte ptr ds:[0x403166],0x4 ; 且字符串長(zhǎng)度在10以內(nèi) 0040149A > C9 leave 0040149B . C3 retn這段代碼是將輸入的serial轉(zhuǎn)成數(shù)值,并且將這個(gè)值存儲(chǔ)到[0x403188],顯然這個(gè)就是剛剛的x0,也就是
[0x403188]的初值,這里的數(shù)值均為16進(jìn)制。
這里是將循環(huán)過后計(jì)算得出的[0x403188]的值加上0x9112478,即[0x403188]+0x9112478
后面有個(gè)test,所以這里的計(jì)算結(jié)果為1 0000 0000,可以使得eax的值為0
所以程序的算法過程可以輕易的出了:
1.判斷是否輸入了name和serial,都有的話就加0x8
2.然后循環(huán)計(jì)算一個(gè)值,計(jì)算出來后加0x4
3.將計(jì)算出來的值再加上一個(gè)數(shù),如果結(jié)果滿足條件的話就加0x4
4.如果上面的條件都滿足了,就會(huì)顯示正確的提示。
注冊(cè)機(jī):
char c[20];unsigned int * p;unsigned int k = 0xF6EEDB88;memset(c,0,sizeof(c));scanf("%s",c);int len = strlen(c);k -= 0xf - len;for(int i=len-1;i>=0;i--){p = (unsigned int*)&c[i];k = (k-1)^*p;}printf("%u",k-1); //這里減1輸出是因?yàn)樽詈螽惢蛩愠鰜淼闹禐閤0+1的值總結(jié)
以上是生活随笔為你收集整理的160 - 23 Chafe.1的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 160 - 22 CarLitoZ.1
- 下一篇: 地下城与勇士为什么开始游戏之后就自动退出