吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3278|回复: 23
收起左侧

[原创] step by step采用x86emu进行部分函数调试的方法破解crackme密码

  [复制链接]
gmg2719 发表于 2022-12-13 23:44
本帖最后由 gmg2719 于 2022-12-13 23:46 编辑

本文采用了《加密与解密》第4版的3.5.1的示例文件,因为很容易下载到,在这里就不再传源文件了,大家自行寻找下载这个crackme.exe。本文重点给出了如何不运行debugger,只采用cpu 模拟器x86emu 插件,结合IDA进行伪动态调试快速解码到密码。
Step1.打开exe文件(注意exe所在目录不能有中文,否则后面会报错),搜索所有字符串,找到OK字样的
image.png
step 2,找到引用的函数,如下, 这个函数就是关键了。将光标定到第一句话, 然后按下alt+f8打开x86emu插件
image.png
插件初始值如下
image.png
step3. 仔细观察一下,这个函数其实有三个参数,分别是
.text:00401040 hDlg            = dword ptr  4
.text:00401040 arg_4           = dword ptr  8
.text:00401040 arg_8           = dword ptr  0Ch

也就是意味着,我们调用这个函数的时候 要往堆栈里面压入这三个参数。所以需要点击插件的push Data按钮,函数压入模拟的参数,具体值是多少并不重要。主要是保持堆栈平衡。
image.png

比如压入如上几个值作为参数实际值(中间用空格分开)
点击确定后,可见ESP进行相应的调整。
image.png

step4, 往下观察一下,我们如何才能到达OK那一步呢? 我们可以采用最粗暴的方法,因为x86emu在保证stack平衡的前提下,可以任意跳过你想跳过的函数或者不必要的代码,那么我们可以采用step按钮执行如下指令(也可以将光标放在00401071,点击run to cursor达到这一步)
.text:00401040                 sub     esp, 14h
.text:00401043                 xor     eax, eax
.text:00401045                 mov     ecx, dword_403034
.text:0040104B                 mov     dl, byte_403038
.text:00401051                 mov     [esp+14h+var_B], eax
.text:00401055                 mov     [esp+14h+var_7], eax
.text:00401059                 mov     [esp+14h+String], 0
.text:0040105E                 mov     [esp+14h+var_3], al
.text:00401062                 mov     eax, [esp+14h+arg_4]
.text:00401066                 sub     eax, 10h
.text:00401069                 mov     dword ptr [esp+14h+String2], ecx
.text:0040106D                 mov     [esp+14h+var_10], dl
text:00401071                 jz      loc_401162
执行完毕后对应的窗口内容如下:
image.png
到达这里后,我们有必要判断EFLAGS么,其实必要性不大,我们从结构来看,只要一路往下运行,遇到条件转移就忽略,就能最终达到OK的效果。
所以下一步我们点击skip按钮,直接忽略jz

step6, 同理对于如下代码的所有jz和jnz都直接点skip按钮。
.text:00401071                 jz      loc_401162
.text:00401077                 sub     eax, 100h
.text:0040107C                 jz      loc_401121
.text:00401082                 dec     eax
.text:00401083                 jnz     loc_40116D
.text:00401089                 mov     eax, [esp+14h+arg_8]
.text:0040108D                 and     eax, 0FFFFh
.text:00401092                 sub     eax, 3EAh
.text:00401097                 jz      short loc_401105
.text:00401099                 sub     eax, 0Bh
.text:0040109C                 jnz     short loc_401116
.text:0040109E                 mov     ecx, [esp+14h+hDlg]
.text:004010A2                 lea     eax, [esp+14h+String]
step7,  下面来到如下代码,如下代码是调用API去获取对话框输入的,因为这个其实对于我们不重要,因为程序没有真正被运行。所以我们要让x86emu直接忽略掉这个函数的调用过程,方法是将光标放到text:004010B5,然后点击jump to cursor按钮,这样,中间的代码就直接跳过去,不参与模拟过程。

text:004010A6                 push    0Bh             ; cchMax
.text:004010A8                 push    eax             ; lpString
.text:004010A9                 push    3E8h            ; nIDDlgItem
.text:004010AE                 push    ecx             ; hDlg
.text:004010AF                 call    ds:GetDlgItemTextA
.text:004010B5                 lea     edx, [esp+14h+String2]
执行完毕后的界面如下了
image.png

step8, 下面是关键的部分啦,因为调用了字符串比对函数,我们现在的目的就是看比对的目标字符串是多少?
点击两次step按钮,运行完如下粗体的指令.

.text:004010B5                 lea     edx, [esp+14h+String2]
.text:004010B9                 lea     eax, [esp+14h+String]
.text:004010BD                 push    edx             ; lpString2
.text:004010BE                 push    eax             ; lpString1
.text:004010BF                 call    ds:lstrcmp
.text:004010B9                 lea     eax, [esp+14h+String]

再次查看x86emu的界面
image.png

可见两个字符串指针, EAX=0x0012FFAC, EDX=0x0012FFA4. 这两个里面必定有一个指向的是真实密码,另一个指向的我们输入的值(因为我们没有真正输入,所以这个是无效的)
按下G键,分别跳转到两个地址,我们看内容

image.png


image.png

可以看到EDX指向的是一个字符串,转换为ASCII就是1899. 因为是little-endian,所以应该反过来是9981. 那么正确的密码应该是9981.

至此为止,我们没有运行这个程序全部,就是模拟了它的片段就得到了密码。可以说是一种新的途径。这个方法对于病毒分析还是更安全的,因为程序没有真正在电脑上运行。而且可以让你对于可以的函数更聚焦,可以自己控制很多系统级的参数,对于没有必要的API就可以直接跳过。

下面试一下我们的破解结果。大功告成。
image.png

免费评分

参与人数 8吾爱币 +14 热心值 +8 收起 理由
Hmily + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
笙若 + 1 + 1 谢谢@Thanks!
hiplease + 1 + 1 谢谢@Thanks!
tuya123 + 1 + 1 我很赞同!
zpp + 1 + 1 我很赞同!
loo1221ool + 1 + 1 用心讨论,共获提升!
Eapoul + 1 + 1 热心回复!
Ll001 + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Eapoul 发表于 2022-12-14 08:36
专业,学习了
wan456 发表于 2022-12-14 00:23
具体值是多少并不重要。主要是保持堆栈平衡。就跟处理bug一样,平衡是王道
dou520dou 发表于 2022-12-14 07:49
aa2923821a 发表于 2022-12-14 08:38
学习一下!
ijack2001 发表于 2022-12-14 13:37

學習一下!
ghjnb 发表于 2022-12-14 13:51
學習一下!
lhp462 发表于 2022-12-14 15:29
是不是可以用于运行任意函数,感觉还挺方便的
s1112819 发表于 2022-12-14 15:32
感谢分享,学习一下
GaryGan01 发表于 2022-12-14 20:45
谢谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-24 03:51

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表