免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
内容参考于:易道云信息技术研究院
上一个内容:83.游戏改造-窗口化
首先使用 Ollydbg.exe 调试 83.游戏改造-窗口化 它生成的exe文件
45C970通过下图红框位置可以函数 hWnd => 000705C6,可以把45C970看成是窗口句柄(HWND类型)
GetWindowLongA函数获取窗口样式
GetWindowLongA函数官方说明
AdjustWindowRectEx函数根据客户端矩形的所需大小计算窗口矩形的所需大小,计算窗口大小,就是计算窗口大小因为窗口有标题栏有菜单有这些东西的窗口大小是不一样的不是说多大就多大,假设要保证窗口的画面是一个高度要额外计算的,就是窗口的画面是640*480如果不额外计算640*480包含了标题和菜单,如果额外计算了那么画面是640*480但是整个窗口的大小是超过640*480具体多大是要看菜单和标题的大小
然后 AdjustWindowRectEx它的入参,下图栈顶是一个内存地址,这个内地址也是栈中的内存地址
栈中的位置看下图红框
执行完 AdjustWindowRectEx函数之后,大小就会变了,看下图红框,变大了
然后函数刚开始的四个MOV到这可以看出它实际上是一个 RECT结构
然后继续往下看,可以看到它调用了 SetWindowPos 函数
SetWindowPos更改子窗口、弹出窗口或顶级窗口的大小、位置和 Z 顺序。 这些窗口根据屏幕上的外观进行排序,就是设置窗口的大小和显示位置,然后它窗口化和全屏用的是两种方式全屏用的 SetDisplayMode函数,窗口化用的是SetWindowPos函数,完全是两种不同的技术所以之前改的分辨率不会起作用
然后窗口化的分辨率是在下图红框位置修改,修改为 0x780 * 0x438(1920 * 1080)
然后有一个点 再调用AdjustWindowRectEx函数时栈中的数据也可看出很显然是一个 RECT结构,然后还可以看出其它参数的结构,这些结构都是通过它前面的哪几个函数得到的
然后设置完窗口又做了
然后执行到RETN让它返回
返回之后,这里是一系列的 Direct操作让代码执行到RETN的位置让它返回
返回
返回之后,有比较色深的代码, Screen BPP must be 16 bit中文意思是 屏幕BPP必须为16位,也就是色深必须是16位
新保存色深的变量
现在已确定的内存地址作用:可以看出它们可能是一个结构体,因为挨着都很近
43D740是窗口化,类型是unsigned,准确说应该是bool类型,true(值是1)是全屏,false(值是0)窗口化
43D75C是Direct指针,类型是unsigned
4391F0是屏幕高度,分辨率,类型是unsigned
4391EC是屏幕宽度,分辨率,类型是unsigned
4391F8是色深,类型是unsigned
4391FC是色深,类型是unsigned
4579C0是HWND窗口句柄
修改之后效果图:
保存修改后的代码方式
然后选择复制到可执行文件
然后选全部复制
然后选择保存数据到文件