最近在学re,正好记录一下解题思路和x64dbg的使用。
目录
运行程序
首先运行exe文件,发现菜单中的Menue
功能被禁用了,无法点击。所以,现在的目标就是修改程序,使菜单有效。
搜索API
由于该文件是32位的exe文件,所以应该是使用了windows系统的API函数。上网搜索,推测该程序应该是使用了EnableMenuItem
函数。
所以,现在可以直接在用户模块中按ctrl+N
查找该符号。
找到user32.EnableMenuItem
。说明该程序确实调用了动态库USER32.dll
中的EnableMenuItem
寻找调用者位置
点击上述符号,在该API入口下断点,开始调试。
执行到断点处,观察栈中存储的返回值,这便是源程序调用该API的位置,点击便跳转到调用者的位置call dword ptr ds:[<EnableMenuItem>]
打上补丁
EnableMenuItem 函数 (winuser.h) - Win32 apps | Microsoft Learn
BOOL EnableMenuItem(
[in] HMENU hMenu,
[in] UINT uIDEnableItem,
[in] UINT uEnable
);
观察windows的API文档,该函数有3个参数。而我们需要的是第3个参数uEnable
,因此只需将该参数改为MF_ENABLED 0x00000000L
,也就是0
观察反汇编,看到这里的三个push
指令,这便是在压栈传递参数,而这里使用的函数调用标准应该是stdcall
,所以参数是从右向左传递。因此第一个push
指令对应的便是参数uEnable
方法一
将push 1
改为push 0
方法二
直接将三条push
指令和call
指令patch为nop
,让程序不调用该API