【OD&x64dbg破解01】簡單爆破序列號(hào)驗(yàn)證
本文內(nèi)容是一個(gè)簡單的TraceMe,來自看雪的一個(gè)程序。
輸入用戶名和序列號(hào),點(diǎn)擊Check,來判斷是否登錄賬號(hào)
輸入假碼,點(diǎn)擊Check,會(huì)提示序列號(hào)錯(cuò)誤
話不多說,載入OD,先使用最簡單的字符串查詢方法
可以看到,有很多的假提示。那么這個(gè)程序可能就不能使用字符串方法來定位破解的程序位置了
使用API斷點(diǎn)好了。先來分析一下流程:
輸入用戶名序列號(hào)->程序獲取內(nèi)容->判斷內(nèi)容
從獲取內(nèi)容的序列號(hào)來斷點(diǎn),選擇插件->API斷點(diǎn)設(shè)置工具
獲取文本框內(nèi)容的函數(shù)是GetDlgItemText
GetDlgItemTextA為ASCII版本的函數(shù),GetDlgItemTextW為Unicode版本的函數(shù)
下好斷點(diǎn),點(diǎn)擊運(yùn)行,輸入用戶名和序列號(hào),點(diǎn)擊Check
就會(huì)來到系統(tǒng)領(lǐng)空,這個(gè)是系統(tǒng)的API函數(shù)位置,執(zhí)行到返回,可以使用Ctrl+F9執(zhí)行到返回,在按一下F8,就回到了程序領(lǐng)空
可以看到兩個(gè)call,這個(gè)估計(jì)是獲取文本框內(nèi)容的,分別獲取用戶名和序列號(hào)。
為了進(jìn)一步驗(yàn)證,使用F8走,可以看到在不遠(yuǎn)處,將文本框內(nèi)容,applek入棧了
執(zhí)行到004011E4地址,可以看到序列號(hào)和用戶名都入棧了,并且分別寄存在EAX和EDX
接下來就會(huì)進(jìn)行比較了,可以看到call一個(gè)函數(shù),這個(gè)函數(shù)一般來說就是驗(yàn)證函數(shù)了。并且在下面還有一個(gè)test函數(shù),就是驗(yàn)證是否正確的語句。并且緊跟著一個(gè)je
驗(yàn)證函數(shù)如下
00401340 /$ 55 push ebp 00401341 |. 8B6C24 0C mov ebp,dword ptr ss:[esp+0xC] ; TraceMe.004011EA 00401345 |. 56 push esi 00401346 |. 57 push edi 00401347 |. 8B7C24 18 mov edi,dword ptr ss:[esp+0x18] 0040134B |. B9 03000000 mov ecx,0x3 00401350 |. 33F6 xor esi,esi 00401352 |. 33C0 xor eax,eax 00401354 |. 3BF9 cmp edi,ecx 00401356 |. 7E 21 jle short TraceMe.00401379 00401358 |. 53 push ebx 00401359 |> 83F8 07 /cmp eax,0x7 0040135C |. 7E 02 |jle short TraceMe.00401360 0040135E |. 33C0 |xor eax,eax 00401360 |> 33D2 |xor edx,edx 00401362 |. 33DB |xor ebx,ebx 00401364 |. 8A1429 |mov dl,byte ptr ds:[ecx+ebp] 00401367 |. 8A98 30504000 |mov bl,byte ptr ds:[eax+0x405030] 0040136D |. 0FAFD3 |imul edx,ebx 00401370 |. 03F2 |add esi,edx 00401372 |. 41 |inc ecx 00401373 |. 40 |inc eax 00401374 |. 3BCF |cmp ecx,edi 00401376 |.^ 7C E1 \jl short TraceMe.00401359 00401378 |. 5B pop ebx ; user32.GetDlgItemTextA 00401379 |> 56 push esi ; /<%ld> = 0x0 0040137A |. 68 78504000 push TraceMe.00405078 ; |%ld 0040137F |. 55 push ebp ; |s = 0012F968 00401380 |. FF15 9C404000 call dword ptr ds:[<&USER32.wsprintfA>] ; \wsprintfA 00401386 |. 8B4424 1C mov eax,dword ptr ss:[esp+0x1C] 0040138A |. 83C4 0C add esp,0xC 0040138D |. 55 push ebp ; /String2 = "applek" 0040138E |. 50 push eax ; |String1 = NULL 0040138F |. FF15 04404000 call dword ptr ds:[<&KERNEL32.lstrcmpA>] ; \lstrcmpA 00401395 |. F7D8 neg eax 00401397 |. 1BC0 sbb eax,eax 00401399 |. 5F pop edi ; user32.GetDlgItemTextA 0040139A |. 5E pop esi ; user32.GetDlgItemTextA 0040139B |. 40 inc eax 0040139C |. 5D pop ebp ; user32.GetDlgItemTextA 0040139D \. C3 retn
執(zhí)行到 004011F5? je short TraceMe.0040122E
如果不修改的話,會(huì)直接提示失敗了。程序?yàn)榱嗣曰笪覀儯梢钥吹綆讉€(gè)成功的字樣。。。
那么先讓je不跳,直接使用nop填充,結(jié)果提示成功了
使用Xdbg64破解
按照上面的方法,只需要設(shè)置API斷點(diǎn)即可,原版的X64dbg沒有插件,這兒直接使用命令設(shè)置斷點(diǎn)
這個(gè)命令OD也能使用bpx GetDlgItemTextA
輸入
回車,即可添加斷點(diǎn),可以看到斷點(diǎn)已經(jīng)設(shè)置
接下來的方法和OD是一樣的了,在跳轉(zhuǎn)的函數(shù),選擇右鍵->二進(jìn)制->用NOP填充
一樣成功