根据上一篇 使用Python读写游戏1 中,使用Python win32库,对一款游戏进行了读内存 操作。
今天来写一下对内存进行写的操作
正文
要进行32位的读写,首先了解一下要用到的几个函数,通过百度找到的,大多都是C/C++的资料。
更详细的分析看上一篇。
写入函数 是 WriteProcessMemory
1 | 此函数能写入某一进程的内存区域(直接写入会出Access Violation错误,故需此函数)。 |
VC++声明
1 | BOOL WriteProcessMemory( |
返回值
如果函数成功,则返回值为非零
如果函数失败,则返回值为0(零)。若要获取扩展错误信息,请调用GetLastError,如果请求的写操作跨入进程中无法访问的区域,则函数将失败。
对单机植物大战僵尸进行读取与写入操作
对植物大战僵尸分析,请看
首先是对阳光数量的读取
阳光的基址偏移是:
1 | 阳光:PlantsVsZombies.exe+2A9EC0+768+5560 |
读写操作,与上一篇文章写法相似
1 | # -*- coding: utf-8 -*- |
sun 分解写法:
1 | def main(): |
写
根据之前的分析,植物大战僵尸可以开启自动收集功能。具体的地址是
1 | 自动收集:PlantsVsZombies.exe+3158B 初始值:5274496 修改后:22051712 |
声明一个函数
1 | def WriteMemeryInt(_address,Data): |
代码分析:
1 | WriteProcessInt(int(hGameHandle),_address,ctypes.byref(ctypes.c_ulong(Data)),4,None) |
修改植物大战僵尸阳光数量
1 | def _modifySunshine(): |
sun_write 分解写法:
1 | def _modifySunshine(): |
运行代码
1 | # -*- coding: utf-8 -*- |
基本代码就这些了,接下来按照我写C的格式,把代码格式改一下,因为看起来真的挺乱的
先把FindWindow 等基础操作用函数给封装
1 | # -*- coding: utf-8 -*- |
在开始写功能,先是读取阳光数量和修改阳光数量:
1 | def _modifySunshine(hGameHandle): |
接着,根据分析,有自动收集阳光功能,基址是:
1 | 自动收集:PlantsVsZombies.exe+3158B 初始值:5274496 修改后:22051712 |
1 | def _collectSunshine(hGameHandle): |
接下来是秒杀功能,因为不一定每次都守得住
普通僵尸秒杀基址:
1 | 秒杀普通僵尸: PlantsVsZombies.exe+13178A 初始值:1284214911 修改后:1284214928 |
1 | def _Seckill(hGameHandle): |
除了普通僵尸,还有头盔僵尸:
头盔僵尸基址:
1 | 秒杀带护甲: PlantsVsZombies.exe+13186D 初始值:1347618942 修改后:1347653776 |
1 | def _SecKillHelmet(hGameHandle): |
完整代码:
1 | # -*- coding: utf-8 -*- |
运行代码:
结尾
借用一句看到很不错的话:
技术不分对错.人性才分善恶.
学习逆向的人必须身心放正.
身心放正之人手握屠龙刀,也是保家卫民.