主题

春节放假终于有空学习下怎么制作外挂啦......学习写外挂大概是我一开始学习计算机的动力吧....只是一直似懂非懂..看教学视频各种不明白为什么....也没有专门的时间学习下怎么写....春节有空研究了下cheat engine学习了下怎么修改内存里的值达到作弊的效果....希望后期能和E语言结合在一起写成真正的外挂....(笑)

这篇文章主要记录下今天的研究成果..

效果

主机999元...装不了啥其他游戏....装了个红警3做测试...

最终效果如下:

学习过程

要修改某个值,比如金钱,首先应该找到储存金钱的内存地址...

比如这个金钱可能就是存在了一个int类型的变量里....

但是int money,这个money肯定是被包装在其他DTO或者什么VO对象里的.不可能是个static的变量(其实java static的变量我都找了半天没有找到基址..)...(CE里的黑色的地址,是new出来的.)

所以如果用这个地址的话,下次运行游戏就不行了,因为new可能会在内存另一块空间分配money...所以要找到一个相对于程序的静态的变量(也可能是那种编译的时候就能确定要怎么分配内存的变量),并且从这个变量可以找到money的地址.

然后比如你要修改money,money外层被player对象包裹着..那修改money肯定是player.money=xxx.那只要找到player就能找到money了..player外层又会被什么别的对象包裹...一层一层向外找就OK了.

看看是哪个指针会修改这个money地址里的值.

发现会把eax的值写入money的地址里.eax是16进制的268A=10进制的9866

然后money的地址是0412FD7C这个是通过esi+04得出的,esi的值是0412FD78.

所以说player.money调用的时候先取player的地址,再+04计算出money的地址,进而得出money地址里的值.

所以说会有一个指针指向player(esi的值).

所以继续搜索0412fd78.

然后类似于这个步骤,一层一层向外层对象查找.

找到最外层不变的基址(指针)以后再根据指针间的关联一层层推回来..

这样子找到了基址(指针),通过基址再去找money的地址(多级指针最终指向money的地址),不管游戏重启多少次,都不需要重新再找地址的.也是也外挂必备的吧..

感想

超级超级有成就感....顺便强行复习了一下汇编....强行复习了下C++指针.....哈哈...

后续

用E语言结合前面找到的地址做了个小外挂...

效果:http://ojz58eu0w.bkt.clouddn.com/ra3_e.wmv

成品:http://oksnab29j.bkt.clouddn.com/ra3_%E9%87%91%E9%92%B1%E7%94%B5%E5%8A%9B%E4%BF%AE%E6%94%B9.exe

代码:

.版本 2
.支持库 shellEx .程序集 窗口程序集_启动窗口
.程序集变量 f1
.程序集变量 f2
.程序集变量 进程ID .子程序 为标签框注册热键 f1 = 注册热键 (取窗口句柄 (), 电力标签.取窗口句柄 (), 0, #F1键)
f2 = 注册热键 (取窗口句柄 (), 电力标签.取窗口句柄 (), 0, #F2键)
' 不知道为啥调用2次注册热键以后,如果绑定到的标签不同,前一次注册的标签会失效....全部都绑定到第2次注册的标签上了= =..原因不明... .子程序 __启动窗口_创建完毕 为标签框注册热键 ()
进程ID = 进程取ID (“ra3_1.12.game”) .子程序 _电力标签_反馈事件, 整数型, , 金钱和电子的热键
.参数 参数一, 整数型
.参数 参数二, 整数型 .如果真 (参数一 = f2)
电力选择框.选中 = 取反 (电力选择框.选中)
.如果真结束 .如果真 (参数一 = f1)
金钱选择框.选中 = 取反 (金钱选择框.选中)
.如果真结束 .子程序 修改金钱值
.局部变量 修改值
.局部变量 指针1
.局部变量 指针2
.局部变量 指针3
.局部变量 指针4
.局部变量 指针5 ' 调试输出 (金钱值)
修改值 = 到数值 (编辑框1.内容)
指针1 = 读内存整数型 (进程ID, 十六到十 (取进程基址 (进程ID)) + 十六到十 (“8E8C9C”))
指针2 = 读内存整数型 (进程ID, 指针1 + 十六到十 (“28”))
指针3 = 读内存整数型 (进程ID, 指针2 + 十六到十 (“e4”))
指针4 = 读内存整数型 (进程ID, 指针3 + 十六到十 (“0”))
指针5 = 指针4 + 十六到十 (“4”)
写内存整数型 (进程ID, 指针5, 修改值) .子程序 修改电力值
.局部变量 修改值
.局部变量 指针1
.局部变量 指针2
.局部变量 指针3
.局部变量 指针4 ' 调试输出 (金钱值)
修改值 = 到数值 (编辑框2.内容)
指针1 = 读内存整数型 (进程ID, 十六到十 (取进程基址 (进程ID)) + 十六到十 (“8E8C9C”))
指针2 = 读内存整数型 (进程ID, 指针1 + 十六到十 (“28”))
指针3 = 读内存整数型 (进程ID, 指针2 + 十六到十 (“74”))
指针4 = 指针3 + 十六到十 (“4”)
写内存整数型 (进程ID, 指针4, 修改值) .子程序 _时钟2_周期事件 .如果真 (电力选择框.选中)
修改电力值 ()
.如果真结束 .子程序 _时钟1_周期事件 .如果真 (金钱选择框.选中)
修改金钱值 ()
.如果真结束

CE学习记录1的更多相关文章

  1. Quartz 学习记录1

    原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...

  2. Java 静态内部类与非静态内部类 学习记录.

    目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...

  3. Apache Shiro 学习记录4

    今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...

  4. UWP学习记录12-应用到应用的通信

    UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...

  5. UWP学习记录11-设计和UI

    UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...

  6. UWP学习记录10-设计和UI之控件和模式7

    UWP学习记录10-设计和UI之控件和模式7 1.导航控件 Hub,中心控件,利用它你可以将应用内容整理到不同但又相关的区域或类别中. 中心的各个区域可按首选顺序遍历,并且可用作更具体体验的起始点. ...

  7. UWP学习记录9-设计和UI之控件和模式6

    UWP学习记录9-设计和UI之控件和模式6 1.图形和墨迹 InkCanvas是接收和显示墨迹笔划的控件,是新增的比较复杂的控件,这里先不深入. 而形状(Shape)则是可以显示的各种保留模式图形对象 ...

  8. UWP学习记录8-设计和UI之控件和模式5

    UWP学习记录8-设计和UI之控件和模式5 1.日历.日期和时间控件 日期和时间控件提供了标准的本地化方法,可供用户在应用中查看并设置日期和时间值. 有四个日期和时间控件可供选择,选择的依据如下: 日 ...

  9. UWP学习记录7-设计和UI之控件和模式4

    UWP学习记录7-设计和UI之控件和模式4 1.翻转视图 使用翻转视图浏览集合中的图像或其他项目(例如相册中的照片或产品详细信息页中的项目),一次显示一个项目. 对于触摸设备,轻扫某个项将在整个集合中 ...

随机推荐

  1. 如何拿到半数面试公司Offer——我的Python求职之路(转载)

    从八月底开始找工作,短短的一星期多一些,面试了9家公司,拿到5份Offer,可能是因为我所面试的公司都是些创业性的公司吧,不过还是感触良多,因为学习Python的时间还很短,没想到还算比较容易的找到了 ...

  2. 深入理解UE4宏定义—— GENERATED_BODY

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/72834164 作者:car ...

  3. ng 依赖注入

    将依赖的对象注入到当前对象,直接去使用依赖的对象即可. 降低耦合度.提高开发速度.. 文件压缩:yui-compressor有两种方案:①CLI(command line interface)java ...

  4. php str_pad() 用法

    $temp = str_pad("    ", 10000); for($i=0;$i<20;$i++){    echo $temp;    echo $i;    sle ...

  5. bulkcopy实现批量插入与更新

    public static void UpdateData<T>(List<T> list, string TabelName) { DataTable dt = new Da ...

  6. python之pandas数据筛选和csv操作

    本博主要总结DaraFrame数据筛选方法(loc,iloc,ix,at,iat),并以操作csv文件为例进行说明 1. 数据筛选 a b c (1)单条件筛选 df[df[] # 如果想筛选a列的取 ...

  7. 使用 ip 进行系统网络配置

    检查是否有安装iproute工具 rpm -qa | grep iproute 查看所有可用接口 ip link show 启用或禁用接口 ip link set down eth1 ip link ...

  8. 项目中使用的图片上传方法,base64存本地

    //生成健康报告 public function uploadJkbg(Request $r) { $data = $r->all(); $jkbg['jkbg_ctime'] = time() ...

  9. nginx 安装echo模块

    学习资源: https://www.cnblogs.com/xwupiaomiao/p/7997938.html https://blog.csdn.net/hb1707/article/detail ...

  10. jetty中war包解压路径

    这是个很奇怪的问题,如果下载好了jetty直接放入war包运行,项目会被解压到C盘的临时文件夹中.但是如果你在${JETTY_HOME}文件夹,也就是jetty解压后的根目录中新建,注意是新建一个wo ...