【OD&x64dbg破解01】簡單爆破序列號驗證
本文內容是一個簡單的TraceMe,來自看雪的一個程序。
輸入用戶名和序列號,點擊Check,來判斷是否登錄賬號
輸入假碼,點擊Check,會提示序列號錯誤
話不多說,載入OD,先使用最簡單的字符串查詢方法
可以看到,有很多的假提示。那么這個程序可能就不能使用字符串方法來定位破解的程序位置了
使用API斷點好了。先來分析一下流程:
輸入用戶名序列號->程序獲取內容->判斷內容
從獲取內容的序列號來斷點,選擇插件->API斷點設置工具
獲取文本框內容的函數是GetDlgItemText
GetDlgItemTextA為ASCII版本的函數,GetDlgItemTextW為Unicode版本的函數
下好斷點,點擊運行,輸入用戶名和序列號,點擊Check
就會來到系統領空,這個是系統的API函數位置,執行到返回,可以使用Ctrl+F9執行到返回,在按一下F8,就回到了程序領空
可以看到兩個call,這個估計是獲取文本框內容的,分別獲取用戶名和序列號。
為了進一步驗證,使用F8走,可以看到在不遠處,將文本框內容,applek入棧了
執行到004011E4地址,可以看到序列號和用戶名都入棧了,并且分別寄存在EAX和EDX
接下來就會進行比較了,可以看到call一個函數,這個函數一般來說就是驗證函數了。并且在下面還有一個test函數,就是驗證是否正確的語句。并且緊跟著一個je
驗證函數如下
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
執行到 004011F5? je short TraceMe.0040122E
如果不修改的話,會直接提示失敗了。程序為了迷惑我們,可以看到幾個成功的字樣。。。
那么先讓je不跳,直接使用nop填充,結果提示成功了
使用Xdbg64破解
按照上面的方法,只需要設置API斷點即可,原版的X64dbg沒有插件,這兒直接使用命令設置斷點
這個命令OD也能使用bpx GetDlgItemTextA
輸入
回車,即可添加斷點,可以看到斷點已經設置
接下來的方法和OD是一樣的了,在跳轉的函數,選擇右鍵->二進制->用NOP填充
一樣成功