大航海时代online这个游戏禁用了标题栏的关闭按钮,只能从游戏里的菜单按钮关闭游戏,也不能直接ALT+F4。关游戏挺不方便的。所以简单修改一下,让游戏窗口启用关闭按钮。
大航海程序是VC++写的,简单搜一下就可以知道
//关闭按钮有效
::EnableMenuItem(::GetSystemMenu(m_hWnd,false),SC_CLOSE,MF_BYCOMMAND | MF_GRAYED);
//关闭按钮无效
::EnableMenuItem(::GetSystemMenu(m_hWnd,false),SC_CLOSE,MF_BYCOMMAND | MF_ENABLED);
————————————————
版权声明:本文为CSDN博主「jiangqin115」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jiangqin115/article/details/76850778
是 EnableMenuItem 函数控制的。再去微软官方文档 https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-enablemenuitem 看看EnableMenuItem函数的原型。函数有三个参数,第一个是菜单句柄不用管;第二个是要改变的菜单项,关闭按钮是SC_CLOSE,但SC_CLOSE在汇编里对应什么值还不知道,稍后再说;第三个是要设置的状态,灰色不可点击就是MF_GRAYED 0x00000001L,要改成MF_ENABLED 0x00000000L。
再看看SC_CLOSE是怎么解释的。WM_SYSCOMMAND 消息 https://docs.microsoft.com/en-us/windows/win32/menurc/wm-syscommand 里面有
SC_CLOSE 0xF060 | Closes the window. |
好。下面打开x64dbg,载入航海程序,下断点bp EnableMenuItem,F9运行,程序直接断在了这里
堆栈里的函数参数2 0019FE0C,正好是F060,对应SC_CLOSE,参数3 0019FE10是1,对应MF_GRAYED。再按一下F9,程序跑起来了,说明程序只调用了这一次EnableMenuItem函数,我们也只需要改一次就行了。如果调用多次,可以用条件断点,用中断表达式 [arg.get(1)]==0000F060。这样只会断下参数2是0000F060的情况。
返回到gvo.005292AB,把push 0x1改成push 0x0就可以了。
0052929B | 6A 01 | push 0x1 | 改0x0
0052929D | 68 60F00000 | push 0xF060 |
005292A2 | FF70 04 | push dword ptr ds:[eax+0x4] |
005292A5 | FF15 6429ED00 | call dword ptr ds:[<&EnableMenuItem>] |
改好保存,打开改好的程序,可以看到生效
文章评论
改好保存,打开改好的程序,可以看到生效
@lanzou呢 OKOK