吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 48986|回复: 101
收起左侧

[游戏安全] 制作游戏修改器 - 植物大战僵尸阳光修改

  [复制链接]
Silent_DXX 发表于 2016-12-11 22:58
本帖最后由 Silent_DXX 于 2016-12-12 08:02 编辑

制作游戏修改器
加入52破解也有一段时间了, 今天给大家带了一个教程. 第一是为了分享, 第二为了记录下来, 在将来不会忘记怎么去做.
本次教程从最基础的内容开始, 讲述如何去制作一个游戏修改器的全部过程, 从分析内存数据开始到破解器的开发等出发做起.
0x00:
  • 使用工具
    Cheat Engine 5.6.1
  • 将要修改游戏
    PlantsVsZombies.exe - 植物大战僵尸
  • 修改器开发环境
    MingW and gcc
注:
VC等IDE也可以.
相关文件会在后面添加下载链接
0x01:
使用CE查询分析游戏内存数据
首先打开游戏, 开始游戏, 然后暂停游戏.
搜狗截图20161211111738.png

这时候使用CE打开PlantsVsZombies.exe进程
搜狗截图20161211153233.png
搜狗截图20161211153424.png

在CE中输入当前阳光值的大小, 默认一开始是50, 点击首次查询
会出现很多地址, 别担心, 我们进一步继续挖掘.
搜狗截图20161211153646.png

再回到游戏里面, 等待收集一个阳光值.
搜狗截图20161211153914.png

再到CE中输入75点击再次扫描, 现在的结果比较好了, 只有一个值了.
搜狗截图20161211154117.png

双击这个地址, 添加到地址列表里面, 验证找的对不对, 可以修改这个地址的值,
在游戏中查看阳光值是否发生变化, 在这里我就不再演示了.
搜狗截图20161211154301.png

这个地址上面右击选择, 找出是什么改写了了这个地址
搜狗截图20161211155510.png

回到游戏中去种一颗植物, 会在列表中找到一个操作.
搜狗截图20161211155629.png
点击详细信息
搜狗截图20161211155727.png

可以看到一些汇编代码, 和寄存器的值. 我们先记录下来
  • EAX=0000004B
  • EBX=00000032
  • ECX=FFFFFFFF
  • EDX=20C8DCA8
  • ESI=00000019
  • EDI=20C8DCA8
  • EBP=0018FB94
  • ESP=0018FAE8
  • EIP=00433F8C
  • Probable base pointer =20C8DCA8
  • 00433f82 - jg 00433f90
  • 00433f84 - sub esi,ebx
  • 00433f86 - mov [edi+00005578],esi
  • 00433f8c - mov al,01
  • 00433f8e - pop esi

其中有一个mov指令, 这个是写入内存值的操作, 偏移是0x5578, 那么其实它写入的地址为EDI+0x5578
这个我看一下EDI寄存器的值是: 0x20C8DCA8
  • 00433f86 - mov [edi+00005578],esi

我们再次回到CE中勾选hex, 输入EDI寄存器的值, 点击新的扫描
这次找到的东西也不少, 也是比较麻烦的, 只能根据经验和多次尝试了.
这里有一个小技巧, 首先去找那些和别的地址不太一样的地址, 比如我在这里就比较轻松的找到了.
搜狗截图20161211163114.png

好了, 到了这一步, 我们点击手动添加地址, 勾选指针, 输入我们找的那个地址和上面的偏移值.
搜狗截图20161211163018.png
如果是这样的, 说明我们找的没错
搜狗截图20161211163352.png

下一步, 我们在第二个指针上面右击, 这次选择找出是什么访问了这个地址
搜狗截图20161211163647.png

选择第一个, 切换到游戏里面
搜狗截图20161211163654.png

很快在列表里面出现好多访问
搜狗截图20161211164442.png

我们选择其中任意一个地址, 看一下详细信息, 找到可能值为ESI寄存器的值, 我们去查询一下, 出现我们想要的结果了
图中我们看到了地址为绿色的, 第一个绿色的地址就是我们要找的地址.  
我们再次记录一下这个
我们找到的地址是: 0x7794F8 偏移: 0x868
  • EAX=023BB760
  • EBX=20D1A534
  • ECX=09B802B6
  • EDX=00A50002
  • ESI=00000021
  • EDI=20C8DCA8
  • EBP=00189760
  • ESP=0018968C
  • EIP=00476667
  • Probable base pointer =023BB760
  • 0047665e - int 3
  • 0047665f - int 3
  • 00476660 - cmp dword ptr [eax+00000868],00
  • 00476667 - jne 0047666c
  • 00476669 - xor al,al
下一步, 手动添加地址
勾选指针, 输入我们找到的地址: 0x7794F8, 偏移0x868
再点击添加指针, 输入偏移0x5578, OK.
搜狗截图20161211165132.png
最后的结果, 可以在第三个地址修改值, 看看游戏中的阳光值变化.

搜狗截图20161211165501.png
第一步完成了, 找到了我们最终要使用的地址和偏移值.
  • 我们的要找的正确的内存地址的计算方式: *(*(*(0x7794f8) + 0x868) + 0x5578)

0x02:
修改器的开发, 我们这里使用C语言
首先了解一下做修改器的关键API:
  • BOOL ReadProcessMemory(
  • HANDLE hProcess,
  • PVOID pvAddressRemote,
  • PVOIDpvBufferLocal,
  • DWORD dwSize,
  • PDWORDpdwNumBytesRead
  • );
  • 参数:
  • hProcess                [in]远程进程句柄, 被读取者
  • pvAddressRemote         [in]远程进程中内存地址, 从具体何处读取
  • pvBufferLocal           [out]本地进程中内存地址, 函数将读取的内容写入此处
  • dwSize                  [in]要传送的字节数, 要写入多少
  • pdwNumBytesRead         [out]实际传送的字节数, 函数返回时报告实际写入多少
  • BOOL WriteProcessMemory(
  • HANDLE hProcess,
  • LPVOID lpBaseAddress,
  • LPVOID lpBuffer,
  • DWORD nSize,
  • LPDWORD lpNumberOfBytesWritten
  • );
  • 参数:
  • hProcess            [in]远程进程句柄, 被读取者
  • lpBaseAddress       [in]要写的内存首地址, 再写入之前, 此函数将先检查目标地址是否可用, 并能容纳待写入的数据.
  • lpBuffer            [in]指向要写的数据的指针.
  • nSize               [in]要写入的字节数.
  • 返回值
  • 非零值代表成功.

0x03:原理
修改器的基本原理就是读取游戏线程的内存数据, 根据我们之前找到的计算方式, 在最后得到地址写入阳光值.
关键代码实现
  •     DWORD d1, d2;
  •     // 得到0x7794f8地址的内存值, 其值保存到d1, d2为真实读到数据的大小, 这里如果不为4则读取错误
  •     ReadProcessMemory(hProc, (void *)0x7794f8, &d1, 4, &d2);
  •     printf("0x%X 0x%X\n", d1, d2);
  •     // 得到上面地址+0x868的内存值
  •     ReadProcessMemory(hProc, (void *)(d1+0x868), &d1, 4, &d2);
  •     printf("0x%X 0x%X\n", d1, d2);
  •     // 要写入阳光值的地址
  •     ads_ps = d1+0x5578;
  •     // 得到上面地址+0x5578的内存值
  •     ReadProcessMemory(hProc, (void *)(d1+0x5578), &d1, 4, &d2);
  •     // 输出当前阳光值的大小
  •     printf("%d 0x%X\n", d1, d2);
  •     printf("ads_ps: 0x%X\n", ads_ps);
  •     // 在我计算出来的地址里面写入阳光值的大小
  •     WriteProcessMemory(hProc,(void *)ads_ps, &value, 4, NULL);    //写内存

0x04:
最后来一个效果图, 希望这个教程会帮助大家学习
搜狗截图20161211210658.png

0x05:

下载地址:
PlantsVsZombies: http://pan.baidu.com/s/1kVDck5L 密码: 7ooj
修改器源码: http://pan.baidu.com/s/1c1HJRu4 密码: wa2n

解压密码: 52pojie





搜狗截图20161211155351.png
dc459cea-58cf-4a7c-81ab-83e8a757032b.png

免费评分

参与人数 20威望 +1 吾爱币 +12 热心值 +19 收起 理由
wind706 + 1 + 1 热心回复!
wentwent + 1 + 1 我很赞同!
610100 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
海天一色001 + 1 + 1 谢谢@Thanks!
mssaf + 1 + 1 很不错
a2711716 + 1 + 1 谢谢@Thanks!
robin1896 + 1 + 1 我很赞同!
kpking + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
abcde654321 + 1 + 1 热心回复!
开始的复活节 + 1 + 1 我很赞同!
Found.Inheritor + 1 我很赞同!
liphily + 1 + 1 我很赞同!
郯国一丁 + 1 + 1 我很赞同!
FredCen + 1 谢谢@Thanks!
威武霸气潇洒涛 + 1 谢谢@Thanks!
cj风穿越 + 1 谢谢@Thanks!
sunlewuyou + 1 这种实用性文章,微信推送到后马上前来学习!谢谢!
李莹莹 + 1 我很赞同!
a1270832428 + 1 请问大牛 我前面一样 用CE自带生成修改器 可以用 关闭游戏 第二次打开就.
Hmily + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| Silent_DXX 发表于 2016-12-12 19:06 来自手机
a1270832428 发表于 2016-12-12 18:58
我用CE自带生成的修改器  第二次打开游戏 就没用了  请问为什么?

你找到的应该不是动态地址吧,每次游戏存储的地址都不一样,需要找到基址+偏移值,才能每次得到正确的地址。上面的教程就是如何去找基址和偏移值的,你可以看看。

免费评分

参与人数 1热心值 +1 收起 理由
a1270832428 + 1 热心回复!

查看全部评分

 楼主| Silent_DXX 发表于 2017-6-1 17:50
Cyntec 发表于 2017-6-1 17:00
楼主,图里面那个灰色的023BBFC8是怎样写进去的?我用的CE只能输入一个地址,点击添加指针后只出来添加偏移 ...

灰色部分是CE自己算出来的, 自己是写不进去的。

指针                  值                   偏移         计算
0x7794F8         0x23BB760     0x868      0x23BB760 + 0x868 = 0x023BBFC8

解释: 内存0x7794F8是一个指针变量, 它指向一个地址:0x23BB760,  所以0x023BBFC8就是0x23BB760加上偏移0x868的内存值。

图片3.jpg
a1270832428 发表于 2016-12-12 18:58
我用CE自带生成的修改器  第二次打开游戏 就没用了  请问为什么?  
ga0x1ang 发表于 2016-12-12 19:15 来自手机
看看思路,。。学习
s19996 发表于 2016-12-12 22:26 来自手机
很给力,好久没用ce了。
qiandog 发表于 2016-12-13 00:11
好贴,必须顶起来啊
kang1023 发表于 2016-12-13 09:35
前来膜拜   虽说看不懂代码
dgh584544242 发表于 2016-12-13 11:25
看看玩,不错的分享
n15865386136 发表于 2016-12-13 16:35 来自手机
超级给力
a1270832428 发表于 2016-12-13 17:57
Silent_DXX 发表于 2016-12-12 19:06
你找到的应该不是动态地址吧,每次游戏存储的地址都不一样,需要找到基址+偏移值,才能每次得到正确的地 ...

请问这个。。。  怎么搞。。。
2.png
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-3-29 03:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表