【OD&x64dbg破解01】簡單爆破序列號驗證
本文內(nèi)容是一個簡單的TraceMe,來自看雪的一個程序。

輸入用戶名和序列號,點擊Check,來判斷是否登錄賬號
輸入假碼,點擊Check,會提示序列號錯誤

話不多說,載入OD,先使用最簡單的字符串查詢方法
可以看到,有很多的假提示。那么這個程序可能就不能使用字符串方法來定位破解的程序位置了

使用API斷點好了。先來分析一下流程:
輸入用戶名序列號->程序獲取內(nèi)容->判斷內(nèi)容
從獲取內(nèi)容的序列號來斷點,選擇插件->API斷點設(shè)置工具

獲取文本框內(nèi)容的函數(shù)是GetDlgItemText
GetDlgItemTextA為ASCII版本的函數(shù),GetDlgItemTextW為Unicode版本的函數(shù)

下好斷點,點擊運行,輸入用戶名和序列號,點擊Check
就會來到系統(tǒng)領(lǐng)空,這個是系統(tǒng)的API函數(shù)位置,執(zhí)行到返回,可以使用Ctrl+F9執(zhí)行到返回,在按一下F8,就回到了程序領(lǐng)空
可以看到兩個call,這個估計是獲取文本框內(nèi)容的,分別獲取用戶名和序列號。

為了進(jìn)一步驗證,使用F8走,可以看到在不遠(yuǎn)處,將文本框內(nèi)容,applek入棧了

執(zhí)行到004011E4地址,可以看到序列號和用戶名都入棧了,并且分別寄存在EAX和EDX

接下來就會進(jìn)行比較了,可以看到call一個函數(shù),這個函數(shù)一般來說就是驗證函數(shù)了。并且在下面還有一個test函數(shù),就是驗證是否正確的語句。并且緊跟著一個je

驗證函數(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
如果不修改的話,會直接提示失敗了。程序為了迷惑我們,可以看到幾個成功的字樣。。。

那么先讓je不跳,直接使用nop填充,結(jié)果提示成功了

使用Xdbg64破解
按照上面的方法,只需要設(shè)置API斷點即可,原版的X64dbg沒有插件,這兒直接使用命令設(shè)置斷點
這個命令OD也能使用bpx GetDlgItemTextA
輸入

回車,即可添加斷點,可以看到斷點已經(jīng)設(shè)置

接下來的方法和OD是一樣的了,在跳轉(zhuǎn)的函數(shù),選擇右鍵->二進(jìn)制->用NOP填充

一樣成功

