免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
内容参考于:易道云信息技术研究院
上一个内容:82.游戏改造-修改分辨率
逆向窗口化的思路:
首先使用Ollydbg工具打开 82.游戏改造-修改分辨率 它保存的文件
打开之后跟随入口点
首先游戏得到命令行也是通过api,然后先找获取命令行的api,如果不用api会在PEB结构中获取,用API的方式最简单,然后 GetCommandLineA 函数就是用来获取命令行的,在Ollydbg中往下滑可以看到它确实调用了获取命令行的函数,下图红框
然后在调用 GetCommandLineA 函数 位置打断点看看执行完的EAX,可以看到内存地址的值是我们游戏的路径和命令行,然后把游戏路径写到了一个全局变量54E1F0中
然后在想一下如果我们写获取命令行的代码肯定是得到全局变量54E1F0对它进行拆分,因为得到的命令行字符串是游戏路径加命令的数据所以一定会拆分,拆分之后判断这个字符串是不是window,然后也就是会写if(变量a == "window"),然后"window"在c/c++中叫字符常量,字符常量在内存中有专门的区域存放相当于一个全局变量但是这个东西不让改,但是在内存中有一个专属的内存空间,然后利用这个特性那么在专属区域中一定有window这个字符串,利用Olldbg工具的插件可以进行查找
window是char类型的字符串所以用查找ASCII的方式找,右击可以搜索字符串
然后下图位置就找到了,然后双击它可以调转到代码位置
双击之后的截图
断点到下图红色位置然后单步分析
得到 -window 命令
然后再往下是一个圈圈套圈圈的代码,可能是一个循环
完整版注释
然后下图红框位置调用的函数比较奇怪
奇怪的代码,由下面的代码可以分析出当前游戏是被人破解过的,一段正常编写的代码是不可能会出现NOP的,也不可能判断之后不跳转这样的代码,还有判断之后必跳转这样的代码是不可能出现的,所以我们的游戏是被破解过的,破解的证据就在下图中,当年要玩是要插入光盘才可以玩的,
然后返回继续往下看,然后现在跟我关系最大的就是EBP,因为判断了window之后EBP等于了0,然后就找EBP在哪用了,然后看下图红框是在 82.游戏改造-修改分辨率 它里面修改分辨率时用到的,然后这里也push了一个EBP,所以第三个参数是用来控制要不要窗口化的
然后把EBP设置值的地方强制让它等于0,然后备份一个exe文件
右击选择复制到可执行文件-》所有修改
然后选择全部复制
然后选择保存数据到文件
然后运行它就会发现不用写window命令就看窗口化了,最后别忘了创建快捷方式并且设置16位色深
运行之后发现设置的分辨率失效了,后面写窗口化时如何修改分辨率