目标程序
程序下载:CRACKME.7z
解压密码:9unk
任务目标:寻找正确序列号
观察程序
程序有两个文本框(这时应该考虑到 GetDlgItemTextA)、按钮。
尝试输入任意用户名和密码,然后弹出报错信息 “no luck there,mate!”(应该想到 MessageBoxA)。
分析步骤
运行程序到主模块
在使用快捷键 “Ctrl+N” 进入符号标签页
选择主进程模块
在右侧显示函数 API
双击 MessageBoxA 后,在该处设置断点,然后运行程序。
输入 name/serial 后,点击 “OK”,此时程序停在 MessageBoxA 函数入口处(在寄存器窗口下方有个 stdcall 窗口,这些是 MessageBoxA 函数的参数值)。
此时程序在 user32.dll 模块中,这里按 “F9” 继续运行程序。此时程序会弹出了报错信息。
我们继续运行程序,点击 “确认” 按钮,此时程序停在了 user32.dll 模块的 ret10 处。
上面的 ret10 说明 MessageBoxA 函数已经运行到函数结尾,我们继续按 “F8” 单步步过,进入主模块。此时程序已经在主模块 ret 指令处。向上观察,可以看到注册成功的信息,稍微关注一下它的内存地址。
“F8” 继续运行程序,认真观察找到关键跳转。
从关键跳转向上看,发现上面有个 cmp 指令,这应该是在明文判断 serial 是否正确,这是最关键的部分。继续向上看发现我们输入的 name 和 serial。name 和 serial 分别有个 call 指令,这应该是判断 name 和 serial 是否符合要求。
在 cmp 指令处设置断点,并把之前设置的断点删除。
“F9” 继续运行程序,发现 EAX=00005740;EBX=00001F074
,eax 是根据 name 生成的正确秘钥,ebx 也是根据 key 生成的错误秘钥。
后面涉及到算法,就不继续分析了。
这里直接使用爆破法,使用 空格键 修改关键跳转。然后在使用快捷键 “Ctrl+P” 调出补丁窗口,点击 “修补文件”,并将文件保存为 “Crack1.exe”
总结
ANSI
各个国家 PC 机的语言编码都不一样,为了使 PC 机支持更多的语言所以使用 ANSI 编码。可以理解为 ANSI 编码是一个别称,它其实是根据系统的语言不同(比如简中 locale 下是 GBK),系统就会自动选择把文本等设为 GBK 编码。
API
GetDlgItemText
GetDlgItemText 中 Get 取得,Dlg 是 Dialog(对话框)的简写,Item 项,Text 文字,即调用这个函数以获得与对话框中的控件相关的标题或ANSI文本。
MessageBox
MessageBox 就是弹出一个消息对话框。
A
A 表示 ANSI 编码。主要是以前 win9x 不是真正的 32 位系统,它使用的 API 函数都是使用 ANSI 编码。但是到了纯 32 位系统模式用的是 unicode 编码,这就导致了 win98 程序在纯 32 位系统上不兼容。
微软为了解决这个问题,就是使用两种类型的函数。ANSI 就在函数后面用 A 表示,unicode 则是在后面加上 W。当纯 32 位系统执行 ANSI 程序的时候,就会把 A 类型的函数转换成 W 类型的函数,然后在执行。而 win9x 系列遇到 unicode 函数时则执行相反的过程。
refence
- 本文标题:x64dbg-函数参考
- 本文作者:9unk
- 创建时间:2020-12-07 11:00:07
- 本文链接:https://9unkk.github.io/2020/12/07/x64dbg-han-shu-can-kao/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!