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

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 13069|回复: 22
收起左侧

[调试逆向] 【原创】CEAA的使用--Run!ZombieFoods! 游戏的分析

  [复制链接]
syncking 发表于 2019-8-8 21:32
本帖最后由 syncking 于 2019-8-9 16:40 编辑

Run!ZombieFoods! 游戏的分析

工具

  1. Cheat Engine 6.8.1
  2. OD

前言

本人小白一个,对逆向感兴趣。懂一点汇编,就是那种只能看懂mov指令的那种。一直以来学到的都没记录下来,写这篇文章算是一个实践总结。

来源

前天看论坛的一篇文章。文章链接
https://www.52pojie.cn/thread-1004493-1-1.html
用CE分析的一个游戏。
里面有一个不是很理解的地方。存放"汉堡"的地址是直接写在汇编中的。也就是一个立即数。
看下图就是那个游戏分析"汉堡"时的一个截图。("汉堡"是游戏里面的一个消耗品)

1

1

图中10DA1EEC地址就是保存"汉堡"的。

第一直觉告诉我这是就是存放"汉堡"的基址。因为它在汇编语句用是一个立即数。应该每次重启游戏都不会变。当时就想这"游戏好简单"哪,下载下来分析一下。顺便做一个CT。
看下面评论也是众说纷纭的看的心里痒痒。想马上下载看一下。

对,没错。下载游戏后过来被教育了。

第一次见这样的代码。没见过这样玩的啊。

就刚刚上图那个标红的那条汇编指令的立即数会变。每次打开游戏都会变。

mov ecx,[10DA1EEC]

哎!刚刚还想着这游戏分析简单的。顿时懵了。这怎么定位基址呢。
基址直接就写在了汇编语句中,还会变。算了,小白不想那么多了。

想着想着。就跑偏了。
想知道这是怎么回事,上网搜也搜不到啊。

不知道为什么脑袋里突然就出现了一段代码

#include <windows.h>
#include <stdio.h>
int *p = (int *)malloc(sizeof(int));
int main(){
    *p = 1;
    while(true){
        printf("*p now is: %d\n", *p);
        (*p)++;
        Sleep(1000);
    }
    return 0;
}

这样是不是就会实现那个游戏的汇编指令那样。每次打开程序p的地址都会变。

Too young To simple。根本就不是。

这个程序反汇编后这下图这个样子。
代码也不多,语句也简单对着源码一看就明白。

3

3

好吧,搞清这件事有点难,放一放。再回来看看怎么分析游戏的"汉堡"吧。

尝试

看看这游戏也不甘心。再看看吧。

之后看见论坛有人回复的评论说用aobscan可以解决。

之后就有了以下思路(挖坑)
> 0. 先学习一下ce的自动汇编和aobscan
> 1. 找一个特征码
> 2. 寻找定位"汉堡"地址的关键位置
> 3. 编写代码,把"汉堡"地址,放到一个指定的内存地址中
> 4. 之后就可以用人造指针修改"汉堡"的数量

找特征码

说实话第一次找特征码没经验走了很多弯路。
找特征码不仅仅要能定位到特定位置,还要能方便使用。

先把"汉堡"的地址给找到,基本上两次精确搜索就找到了。

第一次搜索

4

4

第二次搜索

5

5

找出是什么访问了这个地址

6

6

❓❓解释一下为什么是 用"找出是什么访问了这个地址"而不是"找出是什么改写了这个地址"

用"访问"在访问这个数据的时候就会执行注入的代码。

用"改写"只有在数据改变的时候才会执行注入的代码。

我们需要在访问的时候就要获取到"汉堡"的地址。(就是鼠标在游戏窗口里面的时候)

7

7

寻找定位"汉堡"地址的关键位置

这里选第一个

8

8

这里提取出来的特征码是这样的

8B C8 8B 85 B8 FD FF FF 83 EC 08 51 50 39 00 E8 ?? ?? ?? ?? 83 C4 10 8B 05 ?? ?? ?? ?? 85 C0 0F

这里可以验证一下
如下图测试:

13

13

之后用AOB注入

选择:内存浏览器窗口->工具->自动汇编

9

9

接着选择:自动汇编窗口->模板->AOB注入

10

10

11

11

14

14

接着分配到当前CT表

12

12

这里是自动生成的代码,自己没写一行代码

15

15

有必要解释一下这里的代码

label(标签名):让标签名可以被当作一个地址使用。

alloc(分配的内存标签名, 字节数):使用方式同LABEL,同时分配内存,指向被分配的内存地址。

dealloc(分配的内存标签名):释放使用ALLOC分配的内存空间。。

registersymbol(符号名):将符号名加入到使用者自定义的符号表中。该符号名可以在作弊列表以及内存浏览中,被视为一个地址使用。符号名被使用前必须在脚本中先宣告。

unregistersymbol(符号名):从使用者自定义符号表中,删除此符号名。即使符号名不存在,也不会产生错误信息。

aobscan(符号名, 字节数组):在内存中搜寻给定的字节数组〈支援通配符〉,并将找到的地址附给指定的符号名。如果没有找到地址,自动汇编脚本不会运行。通配符:使用??或*代表未知字节。

解释代码

16

16

编写功能代码

17.1

17.1

使用人造指针

18

18

未激活前的状态

19

19

激活后状态

20

20

再提升

上面的方法有点麻烦

还要找特定注入点

注入点选错了,麻烦的很,并且还要找一段一直执行的代码,代码不执行就没办法执行注入的代码。总而言之麻烦。

所以选择另一种方法:

创建线程

这次选择"CT表框架代码"模板

21

21

话不多说上代码

22

22

createthread(地址):于目标进程中,在指定的地址创建线程。

这个段代码里面注册了一个blood2的符号,在手动的添加地址的时候可以当成一个地址使用

总结

这次分析下来自我解决问题能力感觉是有所提升的。比如说CEAA的学习使用。

看着这个文章操作下来很顺利。其实踩了不少坑。

  1. 比如说这个特征码那5个地址本人全部试了个遍。找了将近一上午,毕竟是第一次,也不知道注意什么。比如:注入点不要选择变动的地方 ,那什么是变动的,等问题
  2. 提升里面的createthread 写代码的最后要加上一个ret 等
  3. 前面工具里面有OD,看文章里面是没有用到分析游戏上,其实不是,在找特征码的时候一直都是ce和od交叉使用。毕竟小白一个,以后分析就有经验了。

现在看起来这些问题没人告诉我,我就是要找一上午。要不是闲,我估计这次分析分析一半就又结束了,为什么说又呢,因为现在学东西太浮躁了,都是学到半途放弃了。有一点狗熊掰棒子,掰一个丢一个的意思。这个不好啃就换下一个,到最后一个也没吃透。

这次就算是一次记录吧,同时也知道了发帖子真正的不容易啊。自己挑错改正真心麻烦。心累💔

现在看起来一天的学习,现在能手写一些简单的CEAA代码了。

加油!!!💪💪💪

第一次发帖,有错之处欢迎指正。

成品

附件里面有做好的CT

23

23

这里先开启方式1,方式2就会失效。

先开启方式2,方式1却不会失效。

可以思考一下这是为什么 。

如果你明白了。就说明你看懂了。

完结



游戏下载链接: https://pan.baidu.com/s/1HfEMC9007HyUAB0UlRleGg 提取码: k6xi

Run!ZombieFoods!.zip (1.49 KB, 下载次数: 55)

免费评分

参与人数 4威望 +1 吾爱币 +11 热心值 +3 收起 理由
Hmily + 1 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
qwe30245868913 + 1 热心回复!
smile1110 + 2 + 1 谢谢@Thanks!
jiangcs98 + 1 + 1 我很赞同!

查看全部评分

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

 楼主| syncking 发表于 2019-8-9 18:27
本帖最后由 syncking 于 2019-8-9 18:29 编辑
alicc 发表于 2019-8-9 18:00
用法意思我是理解的。我的意思
比如:
原指令: 非CALL地址处理

对于你举得这个例子  这两个作弊没什么区别

第一个作弊代码,加上push  pop  只不过是用上了堆栈,
你用堆栈这就要考虑堆栈平衡,用了push就要用pop,堆栈不平衡,之后数据错的可是不是一点半点。可以说是失之毫厘差之千里。

第二个作弊代码,不用push pop没有用堆栈。当然也没改变什么寄存器。不影响后面的执行



举个例子:
eax = 1
t = eax      push eax  
省略。。。。(对eax的一顿操作)
eax = t       pop eax
这之后  eax 仍然是1, 如果用到了eax ,新插入的代码对eax也没什么影响。当然也不会都后面造成影响。
这个t就是堆栈的抽象。用堆栈就要时刻考虑平衡。


用push  eax  pop eax 说到底是为了不影响后面使用eax。
建议你看一下堆栈的工作原理。
 楼主| syncking 发表于 2019-8-9 16:29
本帖最后由 syncking 于 2019-8-9 16:30 编辑
alicc 发表于 2019-8-9 15:39
话说 作弊指令  加了  push 然后弹出pop。怎么做有什么好处?维持时间久了不会崩溃嘛?  以前一直加的,后面 ...

push eax 是为了把eax存入堆栈,pop eax把堆栈的第一个数据弹出堆栈给eax。

[Asm] 纯文本查看 复制代码
mov eax, X   ;比如X是某个函数的地址
push 1
push 2
push 3
call eax



如果说你在push 1 的地方开始代码注入

代码1
[Asm] 纯文本查看 复制代码
newmem:
push eax
mov eax, 1
pop eax


代码2
[Asm] 纯文本查看 复制代码
newmem:
mov eax, 1



代码1执行完,eax存的仍然是某个函数的地址, 再执行call 仍然是没问题的。
代码2执行完,eax存的是1, 再执行call 是有问题的。
张继天 发表于 2019-8-8 22:18
刚好想学习下这个,却发现好多图挂了。希望楼主及时更新修复下
张继天 发表于 2019-8-8 22:22
这一刷新图出来了。难不成刚才是我网络的问题
SuperMG 发表于 2019-8-8 22:52
很好玩的游戏就是感觉烂尾了
 楼主| syncking 发表于 2019-8-9 07:12
张继天 发表于 2019-8-8 22:22
这一刷新图出来了。难不成刚才是我网络的问题

第一次发帖不太熟悉, 这用的是  markdown 编辑的不知道怎么插入附件图片。图片是上传到图床上了。可能是图床不稳定。等熟悉了我看看能不能把图片换成附件图片
 楼主| syncking 发表于 2019-8-9 07:25
张继天 发表于 2019-8-8 22:22
这一刷新图出来了。难不成刚才是我网络的问题

图片已经全部替换成附件图片的形式了
莫丶莫欺少年穷 发表于 2019-8-9 14:50
没游戏下载链接?
alicc 发表于 2019-8-9 15:37
如果你这教程3年前出了。当时我也不会导出求人。。。。
alicc 发表于 2019-8-9 15:39
本帖最后由 alicc 于 2019-8-9 15:48 编辑

话说 作弊指令  加了  push 然后弹出pop。怎么做有什么好处?维持时间久了不会崩溃嘛?  以前一直加的,后面感觉什么用没出现崩溃什么的,就没加了。
什么都只会一点 发表于 2019-8-9 15:57
感谢分享相关的基址找法,虽说没看懂,不过我觉得我可以先从CE自动汇编脚本开始学起。
您需要登录后才可以回帖 登录 | 注册[Register]

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

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

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

GMT+8, 2024-3-29 13:19

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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