极域电子教室学生端全屏广播分析及破解的编程实现

前期准备

虚拟机:VMWare 14 Pro
操作系统:(均为64位)
①Windows XP SP2系统 用于运行学生端以及进行分析
②Windows 7家庭普通版 用于运行教师端
③Windows 7旗舰版 用于运行学生端以及调试破解程序
(注:在win7下用od调试学生端会失败,因此用xp进行分析,由于学校系统用的win7,我要模拟一下真实环境,所以用了win7来调试破解程序)
极域软件:V6豪华版 以及 从学校拷贝过来的 v1.0 For Android版本
分析软件:Ollyice V1.1

分析学生端

首先,在Ollyice中载入学生端程序
极域电子教室学生端全屏广播分析及破解的编程实现_第1张图片
F9先运行一会
猜想全屏广播时必然会调用 SetForegroundWindow 方法,所以下断点
BPX SetForegroundWindow
极域电子教室学生端全屏广播分析及破解的编程实现_第2张图片
可以看到,已经下了很多断点
接着,在教师端先进行全屏广播,看它停在哪里
果然,它停住了
极域电子教室学生端全屏广播分析及破解的编程实现_第3张图片
看下面的汇编代码可知,它会判断寄存器EBP里的值,所以可以推测这是个循环消息处理的地方,经过几次实验可知,的确是这样的,而且全屏广播时EBP的值总是1,所以为了方便,这里设置断点条件 EBP==1
极域电子教室学生端全屏广播分析及破解的编程实现_第4张图片
而且还可以看到,教师端是可以选择是否进行全屏广播,所以可以判断学生端必然有个关键的判断,接着就是耐心的去找那个判断
一般的技巧就是F8跟着走,遇到CALL就停下来留心一下,如果进入某一个CALL后广播窗口出现了,则教师端关闭全屏广播,在那个地方按F7跟入,再重复以上步骤,直到遇到某个判断,满足条件 在全屏是进入(或不进入),而在小窗口广播时不进入(或进入),则那个判断就是关键判断
(注意,这步非常需要耐心,而且很累…)
找到关键判断之后,记录下地址,尝试将它改成JMP或NOP再进行测试,终于,我找到了地址,是431C14,将那个JE改成JMP就可以实现永远都是小窗口广播
极域电子教室学生端全屏广播分析及破解的编程实现_第5张图片
图中是我已经修改过的学生端(直接修改学生端程序,再保存的)

编程处理

我们已经知道了,将431C14那里的74改为EB即可实现永久小窗口,但是由于想要启动修改过的学生端需要杀死原版的学生端,这样做的话教师端会出现我的机器注销又迅速上线的提示,会引起怀疑,所以我决定通过Win32API来实现动态的写入内存

核心方法:WriteProcessMomery

那些找学生端PID和获取Handle的代码就不贴出来了,这里只贴一下核心代码

BOOL SetFullScreen(HANDLE hStudent, BOOL fullScreen)
{
	int updated = 0xEB;
	if (fullScreen)
		updated = 0x74;

	PSIZE_T pWritten = new SIZE_T;

	LPVOID address = (LPVOID)0x00431c14;
	WriteProcessMemory(hStudent, address, &updated, 1, pWritten);
	if (*pWritten == 1)
		return TRUE;
	return FALSE;

}

Next Step

接下来我会去研究通过修改系统API来实现这个功能,届时应该能实现在被全屏时也能窗口化,同时还能解除全局键盘钩子

参考

https://www.52pojie.cn/thread-542855-1-1.html

写在最后

这种方法还是存在局限性
1.不具备通用性
2.分析学生端的操作太复杂了
3.在已经被全屏广播后这招没用(即使是设置了用快捷键Ctrl键来执行破解)
初学Win32,可能有些地方可能还是做的不够好,望批评指正!

你可能感兴趣的:(极域系列)