逆向分析学生机房管理助手7.5随机进程名算法

本文详细介绍了如何逆向分析学生机房管理助手7.5版本的随机进程名算法。通过分析守护进程jfglzs.exe和主界面main.exe,找到了关闭进程的方法,揭示了程序在启动、蓝屏和退出时的逻辑。通过遍历进程和特定条件筛选,成功定位并关闭了目标进程。
摘要由CSDN通过智能技术生成

敬告作者:你这么天天更新的,其实很少有老师愿意给每台电脑关掉还原、更新软件、开启还原,真正更新率低得离谱,也没啥新功能,仅仅为了不被杀就绞尽脑汁更新算法,开销大,性价比低。如果你看到这篇文章,希望你好好考虑更新一些造福更多人的软件,而不是纠结于这个!

学生机房管理助手更新了7.5版本,原先我预备最近就发布已破解7.4的极域工具包,结果这么个,又又又增加了工作量!

这次狠活多,抓紧上车~

惯常的做法

首页

先看看运行的进程有哪些:

0
又是prozs.exe和jfglzs.exe。

我在博客全网首发!逆向分析学生机房管理助手7.4随机进程名算法中用NETReactorSlayer脱壳,而7.5的也如此。

1
给prozs脱壳后,用dnSpy打开:

2
3
定位到Form1_Load()方法,摆在眼前的,有熟悉的日期、求余、拼接,但是多了一个算法Math.Round(),它们重复赋值给text变量,那么毫无疑问,生效的一定是后面的。

有VB基础的读者可以看出,后者是随机的,每次启动都不同,与日期没有多大关系。
那么这样的话,我们没有进程名算法,如何找到关闭进程的方法?

从守护进程找起

既然进程名完全随机,那么它的守护进程jfglzs.exe、主界面main.exe、卸载程序uninstall.exe等都是如何找到它的呢?

我们知道prozs.exe(分析对象)与jfglzs.exe具有互相守护的关系,识别到对方被关就会蓝屏(有些时候则是不声不响地重新启动对方)。

所以这一步,我们脱壳、反编译jfglzs.exe。在源码中搜索相关关键词,我们就能找到它蓝屏的时候的代码:

4
这里启动蓝屏窗口,然后启动Timer(它负责置顶窗口、限制鼠标ClipCursor()并发出哔哔声)。

但在这里,我们找不到启动条件,需要分析调用链,而由于我懒 这程序写得太ex,分析有些困难,就没找调用处。

小助手自己可以关闭小助手

我们被蓝屏,或者在主界面选择“退出程序”,输入密码,就能退得干干净净,这又是怎么做到的呢?这边,我脱壳并反编译了主界面main.exe。

dnSpy拖进程序,可以看到两个窗口Form1Form3。前者是主界面,后者便是“退出程序”的窗口。

此处为找到退出逻辑的过程:
构造函数Form3()->初始化方法InitializeComponent()->确定按钮Button1->单击事件method_0()
在单击事件中,程序先判断密码是否正确(密码是md5,不可还原),然后调用退出方法method_3()
这个方法就是我们的目标,它杀掉了jfglzs.exe、proze.exe(就是我们要的算法),停止了zmserv服务。

在开始,读取了已获取到的prozs.exe名字,然后就是杀进程。好奇名字怎么来的:

5
这很显然不是我们要的,毕竟人家都随机了,还能找到人家名字,想想都不可能。

再往下看,发现了遍历进程的可疑代码:

6

它便是目标代码所在地。由于prozs随机进程算法设定的长度是10,因此在这里先筛选名字长度为10的进程。随机算法的特别限制使每一个字符不小于100不大于109(即范围是字母d到字母m,含,可以看看题首图是不是这样)。根据这些特性,我们就能筛查出prozs.exe的真面目。尽管难免会误杀,但符合这些限制的进程是少之又少,可以放心。

结论

改写成c++:

#include <windows.h>
#include <tlhelp32.h>
//以上为所需头文件

DWORD prozsPid;
//以下为7.5版本逻辑
PROCESSENTRY32 pe;
pe.dwSize = sizeof(PROCESSENTRY32);
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (Process32First(hSnapshot, &pe)) {
	do {
		//筛选长度为10的进程名(不包含末尾“.exe”)
		if (strlen(pe.szExeFile) == 14) {
			//遍历字符
			for (int j = 0; j < 10; j++) {
				char n7 = pe.szExeFile[j];
				//符不符合d-m之间
				if (!(n7 >= 100 && n7 <= 109))goto IL_226;
			}
			//就是你!
			prozsPid = pe.th32ProcessID;
			break;
		}
		IL_226:
		;
	} while (Process32Next(hSnapshot, &pe));
}
CloseHandle(hSnapshot);

最后算出prozsPid的值就是prozs.exe的进程ID,和jfglzs.exe同时结束,并停止zmserv服务,便可以关闭小助手。

全文完。
这篇文章属全网首发,很多问题都是我自己解决的,写得那么辛苦,大伙给个点赞或收藏鼓励一下我吧!您的支持是我更新的动力。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值