首页
社区
课程
招聘
开源内存扫描工具 mypower,支持 Android/Linux
2023-5-17 14:23 14974

开源内存扫描工具 mypower,支持 Android/Linux

2023-5-17 14:23
14974

感言

虽然男人至死是少年,但是还是开始觉得自己老了,打游戏也有点力不从心了,于是打算把自己打游戏用到的一些代码工具发出来。给岁月以文明,给代码以生命!

源码仓库

Github仓库

程序说明

mypower是我用 C++ 仿制 scanmem 而来的。但是 mypower 包含了更多高级功能:
一、支持指针引用扫描。这个算是核心功能了,可以分析指针的引用路径。例如,我们扫描出了堆里的血量的指针,然后就可以用这个功能扫描出某个内存区域(通常是.bss或者.data)到血量的一系列指针和偏移量。假如是手机大型游戏,扫描起来会比较慢,这时则可以抓镜像到电脑端,用多核心电脑搭配内置的OpemMP支持进行多线程扫描。
二、支持导出内存镜像。这个可以在手机导出镜像然后拖到电脑上加载做静态分析。
三、命令交互支持数学表达式。这样方便做简单的计算。不需要计算器来回倒腾。
四、可扫描 Unity3D 对象,也可以一键分析指针的类和实例名,也支持字符串内容解析。

简单使用教程

目标进程源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <memory>
#include <vector>
 
struct Actor {
    int32_t hp;
};
 
struct World {
    std::vector<Actor> actors;
};
 
std::unique_ptr<World> world;
 
int main(int argc, char *argv[])
{
    world.reset(new World);
    std::cout << ".bss " << (void*)&world << std::endl;
    world->actors.push_back({});
    world->actors.at(0).hp = 300;
    while(1) {
        std::cout << "hp " << world->actors.at(0).hp << std::endl;
        getchar();
        world->actors.at(0).hp -= 1;
    }
    return 0;
}

首先运行目标进程,输出如下:

1
2
3
$ ./dummy
.bss 0x563db339b128
hp 300

接着运行 mypower ,用 findps 命令查找目标进程。
a
接着在搜索到的进程列表界面按ESC进入列表模式,选中进程后按 Enter 即可附加这个进程。也可以用命令 attach -p pid手动附加,
b
附加进程后,就可以用扫描命令扫描内存了。这里作为例子我们扫描32位整数scan -i =300。这行命令意识是扫描精确扫描32位整数300。如果要扫描大于300的32位整数可以运行scan -i >300
c
运行扫描命令的结果
d
很多结果明显是不对的,我们可以过滤一下,因为这时目标进程的内容300变成299了,所以我们输入命令filter <300把小于300的找出来。
e
这时结果,很显然[heap]这一行就是我们的要找的东西。
f
最后我们尝试一下搜索 world 变量的地址

1
ptr --mask 0xFFFFFFFFFFFFFC00 --depth-max 4 --offset-max 512 --result-max 512 0x563db339b000 0x563db339c000 0x563db53396d0

--mask 是内存块掩码,比如我们要搜索0x563db53396d0, 那么这个指针所处的内存块就是0x563db5339400(0x563db53396d0 & 0xFFFFFFFFFFFFFC00), 然后内存里每8个字节当作一个指针然后(指针 & 0xFFFFFFFFFFFFFC00) == 0x563db5339400的时候,程序就认为找到了对地址0x563db53396d0的引用。接着这个引用指针就会到做下一个目标地址进行下一轮搜索,直到这个指针落在指定的范围内。

 

--depth-max 意思是最多搜索多少级指针

 

--offset-max 意思是每级指针的最大偏移量

 

--result-max 是结构达到这个数量后停止扫描

 

0x563db339b000 0x563db339c000 是内存区域范围,比如给的是exe的bss段或data段,就是搜索全局变量到目标指针的引用路径。当搜索到落在这个区域的结果时,视为成功。

 

0x563db53396d0 是目标地址

 

g
就这样我们找到了全局变量world的地址。

1
2
3
4
5
From: 0x563db339b000-0x563db339c000 To: 0x563db53396d0
0x563db339b128 Value: 0x563db53392a0 Offset: 0
  0x563db53392a0 Value: 0x563db53396d0 Offset: 0
    0x563db53396d0
Time: 0s

后记

这个程序一直都是我自用的,开发理念就是能用就行,各方面都比较简陋,希望大家多多包含。


[培训]《安卓高级研修班(网课)》月薪三万计划

最后于 2023-5-18 13:41 被vrolife编辑 ,原因: 更新ptr命令参数说明
收藏
点赞10
打赏
分享
最新回复 (11)
雪    币: 2061
活跃值: (1431)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
youxiaxy 2023-5-18 05:33
2
0
很强大。支持!
雪    币: 247
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_iinxjsxk 2023-5-18 06:22
3
0
再贴上个实战的用图就好了
雪    币: 18614
活跃值: (27889)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
秋狝 2023-5-18 09:11
4
1
感谢分享
雪    币: 2093
活跃值: (1820)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
洪七公. 2023-5-18 09:17
5
0
雪    币: 83
活跃值: (212972)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
shinratensei 1 2023-5-18 09:51
6
0
tql,ceserver可不错
雪    币: 27
活跃值: (5010)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
不吃早饭 2023-5-18 11:59
7
0
emmmmmmm,不是认为楼主这套东西没用,开源点赞没话说,但是还是想问一下,它和CE以及GG修改器之间的区别是什么
雪    币: 0
活跃值: (170)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
走过_509423 2023-5-18 13:13
8
0
大佬 ,能解释一下这命令中的参数意义么?
ptr --mask 0xFFFFFFFFFFFFFC00 --depth-max 4 --offset-max 512 --result-max 512 0x563db339b000 0x563db339c000 0x563db53396d0
雪    币: 431
活跃值: (818)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
vrolife 2023-5-18 13:17
9
0
不吃早饭 emmmmmmm,不是认为楼主这套东西没用,开源点赞没话说,但是还是想问一下,它和CE以及GG修改器之间的区别是什么
没啥区别,个人觉得值得一提的也就是静态分析和多线程搜索指针,还有就是源码比较清晰好定制化。另外主要是我的下一篇文章要用到这工具
雪    币: 431
活跃值: (818)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
vrolife 2023-5-18 13:39
10
0
走过_509423 大佬 ,能解释一下这命令中的参数意义么? ptr --mask 0xFFFFFFFFFFFFFC00 --depth-max 4 --offset-max 512 --result-max 512  ...

ptr --mask 0xFFFFFFFFFFFFFC00 --depth-max 4 --offset-max 512 --result-max 512 0x563db339b000 0x563db339c000 0x563db53396d0 


--mask 是内存块掩码,比如我们要搜索0x563db53396d0, 那么这个指针所处的内存块就是0x563db5339400

(0x563db53396d0 & 0xFFFFFFFFFFFFFC00), 然后内存里每8个字节当作一个指针然后(指针 & 0xFFFFFFFFFFFFFC00) == 0x563db5339400的时候,程序就认为找到了对地址0x563db53396d0的引用。接着这个引用指针就会到做下一个目标地址进行下一轮搜索,直到这个指针落在指定的范围内。

--depth-max 意思是最多搜索多少级指针 

--offset-max 意思是每级指针的最大偏移量 

--result-max 是结构达到这个数量后停止扫描 

0x563db339b000 0x563db339c000 是内存区域范围,比如给的是exe的bss段或data段,就是搜索全局变量到目标指针的引用路径。当搜索到落在这个区域的结果时,视为成功。

0x563db53396d0 是目标地址 

最后于 2023-5-18 13:42 被vrolife编辑 ,原因:
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_hfayfkpi 2023-6-1 00:16
11
0
大佬有Android的使用案例嘛
雪    币: 431
活跃值: (818)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
vrolife 2023-6-2 11:33
12
0
mb_hfayfkpi 大佬有Android的使用案例嘛[em_51]
编译得到安卓版mypower后push到Android里,通过adb shell或者别的终端app以root运行,然后用法是一样的。
游客
登录 | 注册 方可回帖
返回