王者荣耀外挂购买平台
CASE 精选文案
当前位置:精选文案

Title
王者荣耀外挂脚本竟能这样修改内核参数

发布时间:2024-08-17 22:05:44    作者:佚名    点击量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

在电脑核心这玩意儿里,调整参数就跟宇宙开关似的,随便动都可能引发大爆炸。今天我们就来看看这块有趣还挺有料的东西,就是能使inotify观察者数减少到零的代码。

int main() {
system("echo 0 > /proc/sys/fs/inotify/max_user_watches");
pthread_t pthread[1];
target_pid = findpid("com.tencent.tmgp.sgame");
if (target_pid == -1) {
exit(0);
}
long state =
get_module_base(target_pid, (char *)"libGameCore.so:bss") + 0x44D668;
if (state < 0xFFFFFFFFF) {
exit(1);
}
pthread_create(&(pthread[0]), NULL, &findpid1, NULL);
getscreen();
for (;;) {
if (readInt(state) == 1) {
usleep(200000);
print(state);
}
usleep(10000);
}
}

system("echo 0 > /proc/sys/fs/inotify/max_user_watches");

1.inotify:Linux的文件系统守护者

你知道inotify吗?其实,这个词看着挺高深,其实就是Linux的小秘书,专门盯着咱电脑里文件的动向。不论谁新建、编辑或者删了啥文件,inotify都能立马察觉到。所以,它在很多高大上的地方都有大用处,比如实时监控软件啦、自动化工具什么的。想象一下,如果没有inotify,咱们的电脑得有多瞎多慢

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
28
29
30
31
32
33

int findpid(const char *process_name) {
int id;
pid_t pid = -1;
DIR *dir;
FILE *fp;
char filename[32];
char cmdline[256];
struct dirent *entry;
if (process_name == NULL)
return -1;
dir = opendir("/proc");
if (dir == NULL) {
return -1;
}
while ((entry = readdir(dir)) != NULL) {
id = atoi(entry->d_name);
if (id != 0) {
sprintf(filename, "/proc/%d/cmdline", id);
fp = fopen(filename, "r");
if (fp) {
fgets(cmdline, sizeof(cmdline), fp);
fclose(fp);
if (strcmp(process_name, cmdline) == 0) {
pid = id;
break;
}
}
}
}
closedir(dir);
return pid;
}

2.iovec结构体:内存区域的管理大师

target_pid = findpid("com.tencent.tmgp.sgame");
if (target_pid == -1) {
exit(0);
}

long state =
get_module_base(target_pid, (char *)"libGameCore.so:bss") + 0x44D668;
if (state < 0xFFFFFFFFF) {
exit(1);
}

别说在Linux里面,读写文件没那么简单,特别是碰到数据分散问题时。这时候,有个名叫iovec的小伙伴挺身而出了!它就像个机智的管家能帮你整理内存地址和大小,从而提高I/O操作的效率。不管是网络编程的writev函数,还是readv函数,都离不开iovec的帮助。

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
28
29
30
31
32
33
34
35
36
37
38
39

3.process_vm_readv:跨越进程的内存读取

long get_module_base(pid_t pid, char *module_name) {
long startaddr = 0;
char *pm, om[64], path[256], line[1024];
bool bssOF = false, LastIsSo = false;
strcpy(om, module_name);
pm = strtok(om, ":");
module_name = pm;
pm = strtok(NULL, ":");
if (pm) {
if (strcmp(pm, "bss") == 0) {
bssOF = true;
}
}
sprintf(path, "/proc/%d/maps", pid);
FILE *p = fopen(path, "r");
if (p) {
while (fgets(line, sizeof(line), p)) {
if (LastIsSo) {
if (strstr(line, "[anon:.bss]") != NULL) {
sscanf(line, "%lx-%*lx", &startaddr);
break;
} else {
LastIsSo = false;
}
}
if (strstr(line, module_name) != NULL) {
if (!bssOF) {
sscanf(line, "%lx-%*lx", &startaddr);
break;
} else {
LastIsSo = true;
}
}
}
fclose(p);
}
return startaddr;
}

strcpy(om, module_name);
pm = strtok(om, ":");
module_name = pm; // 模块名
pm = strtok(NULL, ":"); // 段名

你们猜猜为什么在Linux这里,process_vm_readv可以当作那个瞬间转移魔法棒?就是因为它能够直接把其他进程的内存东西丢进咱们正在使用的程序里,就像是特技一样。这种情况不就是科幻电影里常看到的么,没想到真的能用上!所以,用了这个系统调用,咱们就能随时随地把别人的内存数据搬到自己的地方,省去了复制的麻烦,效率也提升不少!

1
2
3
4
5

4.权限与安全:process_vm_readv的双刃剑

if (pm) {
if (strcmp(pm, "bss") == 0) { // 需要的段是bss则设置bssOF为True
bssOF = true;
}
}

注意!进程间内存读的systemcallprocess_vm_readv用错了可是会出事的。要想用它,首先得是超级管理员(root),或者有权限mockitoCAP_SYS_PTRACE,这样就能绕过内核保护,直接读取其他程序的内存。虽然方便,但也存在风险。所以,用这玩意儿时可别大意。

sprintf(path, "/proc/%d/maps", pid);
FILE *p = fopen(path, "r");
if (p) {
while (fgets(line, sizeof(line), p)) {

我们来学习下怎么样用新的方法来代替那个复杂的功能。首先,看看/proc文件,再试试ptrace调用这个小窍门!

if (LastIsSo) {
if (strstr(line, "[anon:.bss]") != NULL) {
sscanf(line, "%lx-%*lx", &startaddr);
break;
} else {
LastIsSo = false;
}
}

你要是觉得process_vm_readv技能不够掌握的话,就试试/proc文件系统和ptrace调用。虽然没有前者那么高级,但有时候也是个很好的选择!就好像开车出门,跑高速公路固然更快,但小路上也有不一样的风景。

if (strstr(line, module_name) != NULL) {
if (!bssOF) {
sscanf(line, "%lx-%*lx", &startaddr);
break;
} else {
LastIsSo = true;
}
}

6.指针解引用:数据读取的神秘面纱

return startaddr;

在Linux操作系统里面,给指针解引用简直就跟看魔术一样有趣!瞧,这里先定义了一个固定的地址,然后又设置了另外一个地址,关键是还把其中的5个字节都换成了全F,最后只剩下最下面的5个字节。这不就是变魔术,让人看得眼花缭乱的。

1

7.效率与安全:权衡的艺术

pthread_create(&(pthread[0]), NULL, &findpid1, NULL);

在Linux里,效率VS安全很纠结。是该用process_vm_readv系统调用呢?来点儿实在的,通过/proc文件系统或ptrace调用怎么样?就像是走钢丝,可得小心别掉下来。不过,只要找到诀窍,就能稳妥应对了!

1
2
3
4
5
6
7
8

总结:

void *findpid1(void *arg) {
for (;;) {
if ((int)findpid("com.tencent.tmgp.sgame") == -1) {
exit(0);
}
sleep((int)1);
}
}

小伙伴们,看完咱们上回那个关于Linux内核的文章没?深入解析了inotify和process_vm_readv两个系统调用,你们应该已经都知道怎么用。这次学习可不只是技术层面的,更是对Linux系统的一次深度探索!那么问题来了,如何在保证效率的同时保障系统安全?快来评论区发表你们的看法,一起讨论这个有趣的话题!如果觉得这篇文章有用,别忘了点赞分享给别人,让更多人加入到我们的讨论中来!

1
2
3
4
5
6
7
8
9

void readBuffer(long addr, void *buffer, int size) {
struct iovec iov_ReadBuffer, iov_ReadOffset;
iov_ReadBuffer.iov_base = buffer;
iov_ReadBuffer.iov_len = size;
iov_ReadOffset.iov_base = (void *)addr;
iov_ReadOffset.iov_len = size;
syscall(SYS_process_vm_readv, target_pid, &iov_ReadBuffer, 1, &iov_ReadOffset,
1, 0);
}

返回列表

联系我们

contact us
Copyright © 2012-2023 迹步工作室版权所有  ICP备案编号:皖ICP备2024046622号-1