• CE学习记录1


    主题

    春节放假终于有空学习下怎么制作外挂啦......学习写外挂大概是我一开始学习计算机的动力吧....只是一直似懂非懂..看教学视频各种不明白为什么....也没有专门的时间学习下怎么写....春节有空研究了下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_周期事件
    
    
    
    
    .如果真 (金钱选择框.选中)
    修改金钱值 ()
    .如果真结束
    View Code
  • 相关阅读:
    BZOJ1183 Croatian2008 Umnozak 【数位DP】*
    算法--斯坦纳树
    BZOJ2595 Wc2008 游览计划 【斯坦纳树】【状压DP】*
    BZOJ1833 ZJOI2010 count 数字计数 【数位DP】
    BZOJ1087 SCOI2005 互不侵犯King 【状压DP】
    BZOJ1026 SCOI2009 windy数 【数位DP】
    pytest灵魂产物
    django限流全局和单个视图
    论文阅读笔记四十一:Very Deep Convolutional Networks For Large-Scale Image Recongnition(VGG ICLR2015)
    某线 生成式模型预测算法实习生面试总结
  • 原文地址:https://www.cnblogs.com/abcwt112/p/6361652.html
Copyright © 2020-2023  润新知