前言:
学校上计算机课时,经常敲代码敲到一半就被老师广播屏幕,这很无奈。其实一种简单的方法是任务管理器里结束 StudentMain.exe 便可躲过屏幕广播。但无法接收文件,同时老师讲课重要点没听到。不是一种好办法,拿了点时间破解了极域,记录一下破解的过程发上博客。不是为了获得什么利益,破解只是为了破解本身。
修改了两个地方,爆破跳转使极域学生端可以任意密码进入设置页面和窗口化广播屏幕。窗口化可以边听课边写代码或者跟着老师的步骤走,如果不想听,最小化窗口就行了,脱离控制,方便!
环境
操作系统:Win7 x64位
极域版本:v4.0 2015豪华版
一、破解密码
打开olldbg,我这里使用是吾爱破解专版od,打开极域学生端的设置窗口,然后附加 StudentMain.exe 进程
附加后F9运行起来,在极域输入错误的密码进入,没有提示错误信息框,只是窗口左右摇几摇表示密码不正确,由此判断只有输入正确密码才有反应,信息收集的差不多了,我们探讨找到关键破解点的思路
遇到这种无错误提示框时,一般用两种方法:
由于第二种方法设置太过繁琐,舍之。我们采取第一种方法。
对于这样的编辑框中输注册码的程序我们要设断点首选的 API 函数就是 GetDlgItemText 及 GetWindowText。每个函数都有两个版本,一个是 ASCII 版,在函数后添加一个 A 表 示,如 GetDlgItemTextA,另一个是 UNICODE 版,在函数后添加一个 W 表示。如 GetDlgItemTextW。对于编译为 UNCODE 版的程序可能在 Win98 下不能运行,因为 Win98 并非是完全支持 UNICODE 的系统。而 NT 系统则从底层支持 UNICODE,它可 以在操作系统内对字串进行转换,同时支持 ASCII 和 UNICODE 版本函数的调用。一般 我们打开的程序看到的调用都是 ASCII 类型的函数,以“A”结尾。
GetWindowText 函数功能:
该函数将指定窗口的标题条文本(如果存在)拷贝到一个缓存区内。如果指定的窗口是一个控件,则拷贝控件的文本。但是,GetWindowText可能无法获取外部应用程序中控件的文本,获取自绘的控件或者是外部的密码编辑框很有可能会失败。
函数原型:Int GetWindowText(HWND hWnd,LPTSTR lpString,Int nMaxCount);
在命令窗口中输入
bp GetWindowTextW
然后回车,就成功了,我们在od下可以按Alt + B查看有没有成功下断点。
下完断点,点击确定按钮,这时,你会发现,还没点确定,鼠标移动到极域的窗口时就已经断下来了,为什么呢?
因为鼠标移动到窗口、或者点击某个按钮时,程序都会调用GetWindowTextW获取当前鼠标位置的焦点内容,这点我们可以不管,我们只想获取编辑框的内容,所以先让鼠标移动到确定按钮,然后回到OD按F9运行至没有断下来,点确定按钮,程序断下来第一次不是我们想要的,因为它还会获取按钮这个控件的标题。所以再运行一次,断下来时堆栈如图所示,class=‘Edit’表示获取编辑框的内容啦。
先说明一下,我输入了一个错误密码是“123”,而进入设置页面的正确密码是“up”。
好了,Ctrl + F9 执行到返回,然后F8一步步回到程序领空这个位置
输入的错误密码已经出现在寄存器了,摸索下面的代码,就发现了可疑点
0044FA4E . 68 F4884F00 push StudentM.004F88F4 ; UNICODE "mythware_super_password"
0044FA53 . 8D4C24 0C lea ecx,dword ptr ss:[esp+0xC]
0044FA57 . FF15 4CA04E00 call dword ptr ds:[<&MFC80U.#ATL::CStringT; mfc80u.#ATL::CStringT > >::Compare_1472
0044FA5D . 85C0 test eax,eax
0044FA5F . 74 66 je short StudentM.0044FAC7
F7步入0044FA57这个call分析代码如下,注意看堆栈位置
知道了这个call功能是判断输入的密码是不是mythware_super_password。return回到上层,继续分析。
0044FA49 E8 92F60700 call ; 获取编辑框内容
0044FA4E 68 F4884F00 push StudentM.004F88F4 ; UNICODE "mythware_super_password"
0044FA53 8D4C24 0C lea ecx,dword ptr ss:[esp+0xC]
0044FA57 FF15 4CA04E00 call dword ptr ds:[<&MFC80U.#1472>] ; 判断字符串是否相同函数
0044FA5D 85C0 test eax,eax
0044FA5F 74 66 je short StudentM.0044FAC7 ; 如果输入是mythware_super_password则跳转
0044FA61 8D4E 74 lea ecx,dword ptr ds:[esi+0x74]
0044FA64 FF15 949F4E00 call dword ptr ds:[<&MFC80U.#870>] ; 取出正确密码,放到eax
0044FA6A 50 push eax
0044FA6B 8D4C24 0C lea ecx,dword ptr ss:[esp+0xC]
0044FA6F FF15 4CA04E00 call dword ptr ds:[<&MFC80U.#1472>] ; 判断用户输入的密码是否正确
0044FA75 85C0 test eax,eax
0044FA77 EB 4E je short StudentM.0044FAC7 ; 如果密码正确则跳转
得出结论,将0044FA77地址的je指令改为jmp就能实现爆破密码。
0044FA77 /EB 4E jmp short StudentM.0044FAC7 ; je改成jmp输入任意密码也正确
另外,上述分析的“mythware_super_password”就是超级管理员密码,这个密码通杀任何同版本的极域。
改完后,我们就可以输入任意密码进入设置页面了。
二、实现窗口化
为了方便寻找关键断点,我同时用了两个虚拟机,一个学生端(被控端),一个教师端。安装包在网上便可以找到。
在被老师控制时,屏幕上有一条菜单栏,屏幕右上角有一个按钮可以选择全屏或者窗口化,但上课广播时被禁用了。
窗口化状态下是这样的
在教师端窗口化模式广播,按钮是可以用的。点击全屏广播后按钮就禁止了。突破点就是下断点拦截按钮禁用函数。即窗口化变回全屏广播会用到这个函数。
在OD命令窗口输入
bp EnableWindow
该函数的函数功能为:允许/禁止指定的窗口或控件接受鼠标和键盘的输入,当输入被禁止时,窗口不响应鼠标和按键的输入,输入允许时,窗口接受所有的输入。
下面是它的函数原型:BOOL EnableWindow(HWND hWnd,BOOL bEnable);
参数:
hWnd:被允许/禁止的窗口句柄。
bEnable:定义窗口是被允许,还是被禁止。若该参数为TRUE,则窗口被允许。若该参数为FALSE,则窗口被禁止。
返回值:如果窗口原来是被禁止的,返回值不为零;如果窗口原来不是被禁止的,返回值为零。若想获得更多的错误信息,可调用GetLastError函数。
窗口化广播模式 下断点 回到教师端虚拟机,点击全屏广播,再回到学生端,已经断下来了
Ctrl + F9执行到返回,F8几步回到程序领空。向上面顺藤摸瓜分析,寻找可以修改的地方。
01B9300C /74 1A je short LibDeskM.01B93028 ; 确定这里就是全屏化禁止按钮了
01B9300E |. |33C0 xor eax,eax
01B93010 |. |85F6 test esi,esi
将01B9300C地址的je改jmp,测试运行,全屏广播下按钮没有被禁用。说明爆破成功
01B9300C /EB 1A jmp short LibDeskM.01B93028 ; 确定这里就是全屏化禁止按钮了
极域无条件密码
原来是:
0044FA77 74 4E je short StudentM.0044FAC7
后来改:
0044FA77 EB 4E jmp short StudentM.0044FAC7
特征码:74 4E 8B 56 20 8D 4E 78
周围内容:
0044FA6A . 50 push eax
0044FA6B . 8D4C24 0C lea ecx,dword ptr ss:[esp+0xC]
0044FA6F . FF15 4CA04E00 call dword ptr ds:[<&MFC80U.#1472>] ; 进行密码比较
0044FA75 . 85C0 test eax,eax
0044FA77 74 4E je short StudentM.0044FAC7 ; 关键爆破点
0044FA79 . 8B56 20 mov edx,dword ptr ds:[esi+0x20]
0044FA7C . 8D4E 78 lea ecx,dword ptr ds:[esi+0x78]
极域窗口化(原理:下断点 bp EnableWindow)
DeskMonitor.dll + 0001300C 的数据可以改
原来是:
01B7300C 74 1A je short LibDeskM.01B73028
后来改:
0001300C EB 1A jmp short 00013028
特征码:74 1A 33 C0 85 F6
周围内容:
01B73001 . 8D4F 5C lea ecx,dword ptr ds:[edi+0x5C]
01B73004 . 85C9 test ecx,ecx
01B73006 . 74 20 je short LibDeskM.01B73028
01B73008 . 8379 20 00 cmp dword ptr ds:[ecx+0x20],0x0 ; 这个函数是判断是否为禁止按钮?
01B7300C 74 1A je short LibDeskM.01B73028
01B7300E . 33C0 xor eax,eax
01B73010 . 85F6 test esi,esi
根据得到的特征码可以自己写个内存修改工具(也可以下载下面链接里的),整个过程比较简单,只是爆破两个地方,没有技术可言。但学习这件事,不光光是输入,还要输出表达。接下来还会写一篇极域注册表密码的解密算法分析过程。欢迎关注。
另外,附上现成的程序及极域窗口化爆破后的dll,有需要的可以下载。dll使用方法是先结束极域进程,然后打开极域的文件目录,粘贴覆盖掉之前的dll,再打开极域,就能使用了,老师广播时点击右上角按钮。
破解方式一:替换dll
极域电子教室窗口化dll
csdn下载
https://download.csdn.net/download/koevas/10897440
百度云盘
链接:https://pan.baidu.com/s/1QiKa9H46wNRFI913OghKkg
提取码:763g
破解方式二:运行补丁程序
破解极域学生端程序
https://download.csdn.net/download/koevas/10897453
百度云盘
链接:https://pan.baidu.com/s/1cHj5KJhTmMwREAh2_cuqPQ
提取码:ukfs