CGnetsw修改器

CGnetsw修改器

断网的原理

通过删除本机路由,并写入cg平台自己的ip于hosts文件,实现只能访问CG平台的功能。

关闭程序后,将本机路由进行恢复,实现正常上网。

程序分析

通过ida联合动调,找到断网函数的位置:

image-20211216192901951

这个函数执行之后实现本机断网。

修改思路:将函数nop之后平衡堆栈,使程序正常运行

2020版

这是我遇到的第一版的断网程序

image-20211216193056827

gcc编译,32位,无壳

IDA中查看winmain函数

image-20211216193345120

大体分析:

  1. 首先进行一个ip地址的获取放在String中,如果没有获取到正确的ip,那么就将CG平台的主ip进行赋值(各个学校有不同的ip地址)。

  2. 然后进行日志记录(这里不是很清楚为什么记录日志)。

  3. v14和下面的语句实现了一个字符的拼接功能,用处不大。
  4. v15和SetWindowTextW函数实现了窗口的初始化,没啥用。
  5. 下面对hosts表进行了修改,然后进去了deleteip函数。

deleteip函数中,找到删除本机路由的函数

image-20211216194126785

删除路由的函数成功返回0,也就是说这里不能执行判断里面的内容

image-20211216194236740

看到这里的汇编代码

image-20211216194336541

eax一定为 “ 1 ” ,也就是0x401edd处的跳转实现,否则程序就会意外终止或者不能达到效果。

这里看到函数的调用规则__cdecl ,这里思路将delete函数nop掉,这样没有调用函数,esp就通过-0恢复,(我认为对程序的修改越小越好,所以就没有将sub esp , 4全nop掉)。再看到下面的test eax,eax ,若把delete函数nop之后,eax == 1 这里显然如果要跳转的话需要=0,所以这里直接将test指令修改为cmp指令,他俩指令的占字节位是一样的。

给出脚本:

这里我通过C语言直接修改文件中相对的机器码来实现

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
#include<stdio.h>
#include<stdlib.h>

char nop_cmp[]={0x90 ,0x90 ,0x90 ,0x90 ,0x90 ,0x83 ,0xEC ,0x00 ,0x39};
//这是将程序修改之后对应的机器码

int main()
{
FILE* p;
p=fopen("CGnetsw.exe","r+");
if (p==NULL)
{
printf("文件打开失败,请手动填写文件名\n");
char name[64];
scanf("%s",name);
p=fopen(name , "r+");
}
fseek(p,0x12d5,SEEK_SET);
//要修改的机器码对应文件头的偏移
for(int i=0;i<9;i++)
{
fwrite(&nop_cmp[i],sizeof(char),1,p);
}
printf("success\n");
fclose(p);

return 0;
}

这样文件就可以远程欺骗CG平台,同时本地也可以上网。(经实测得到)

2021版

CG平台对程序进行了改版,临近期末,便不再深究改了哪里,直接寻找关键函数

大体分析:

依旧是32位无壳GCC编译的小程序

image-20211216200044105

ida中查看,程序明显的改动是先进行修改hosts,删除路由,然后再生成窗口。

思路同上一版本相似,但是main函数中多出一个判断

image-20211216200304369

这个判断经过分析实测,在win10系统中第一次运行会进行重启电脑的操作,产生的压缩包内有两个注册表文件,猜测这里应该是为了适应不同版本的功能。

压缩包内文件:

image-20211216200443647

时间有点古怪,可能是我电脑运行过老程序的问题,这里不做深究。

看到下面依旧是进行dns的修改,然后删除本机路由

image-20211216200629735

这里的三联ip串包括:cg平台的ip,本机的dns服务器地址,114.114.114.114(三大运营商通用dns服务器地址),三个地址通过逗号连接。

给出脚本:

进入关键函数,和2020版基本一样,这里只需要更改一下去年的偏移即可

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
#include<stdio.h>
#include<stdlib.h>

char nop_cmp[]={0x90 ,0x90 ,0x90 ,0x90 ,0x90 ,0x83 ,0xEC ,0x00 ,0x39};
//这是将程序修改之后对应的机器码

int main()
{
FILE* p;
p=fopen("CGnetsw.exe","r+");
if (p==NULL)
{
printf("文件打开失败,请手动填写文件名\n");
char name[64];
scanf("%s",name);
p=fopen(name , "r+");
}
fseek(p,0x1f15,SEEK_SET);
//要修改的机器码对应文件头的偏移,这里是2020和2021不一样的地方
for(int i=0;i<9;i++)
{
fwrite(&nop_cmp[i],sizeof(char),1,p);
}
printf("success\n");
fclose(p);

return 0;
}

虽然对程序进行了升级,但是关键地方还是老样子,没有远程验证,这个我估计以后会加上去。

总结

希望大家认真考试,不要总是想着这些歪门邪道。攻防无界