【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填充
一样成功