本文内容是一个简单的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填充

一样成功

课件下载

https://storage.tirr.com.cn/s/1d9tjy4b

发表评论

共有 0 条评论