逆向分析7.8算法
先给个开幕雷击吧:
这真不知道怎么评价好呢,学生机房管理助手上一个版本还是7.5,在11月23号这天直接跳到了7.8,咱也不知道它是有中间昙花一现的两个版本呢,还是避讳什么,必须跳版本。
说实话,在我满怀期待反编译它之后,一股酸劲涌满我全身:作者开摆了。为什么呢?
上一个版本分析(逆向分析学生机房管理助手7.5随机进程名算法)中,我最终是在main.exe的“退出程序”这个窗体中找到退出算法的,于是这个版本下载好,当然是首先用.NETReactorSlayer脱壳。
脱完之后,打开dnSpy,按照从前的套路,直接进入main.exe的Form3
,根据“退出”这个按钮的点击事件,定位到了method_3()
方法。找到熟悉的退出逻辑:
核心逻辑和7.5版本相比,只更改了一处:此前筛选的程序名称长度必须是10,而在这个版本中只要长度大于等于4都符合条件。此外对字符范围的限制仍是100~109,实际测试也确实如此。
于是代码就出来了,只需要更改一处,我就不花费时间贴出来了,大伙自己到上一个版本的博客里找代码吧,改动两处即可。
如果就为了一个已经摆烂的作者写一篇博客也太闲了,我的作风也不是这样的,于是就有了接下来对极域的分析。
解极域U盘限制
极域有几个功能,这些功能真的很ex,这回我们挑他三太子出来吧。首先是U盘限制,有些时候你想要用U盘里一些资料,却很不幸地 get a pretty access denied 拒绝访问……是不是想揍人的心都有了?
解除这个限制有两种方法,但实际上都是对极域的文件驱动作操作。它的驱动叫TDFileFilter.sys,经过IDA Pro分析,它调用FltRegisterFilter()
、FltCreateCommunicationPort()
等函数创建微型筛选器,对文件访问请求进行筛选,如果访问了U盘、CD光盘等,就会返回0xC0000022
,转换成Win32错误值(RtlNtStatusToDosErrorNoTeb()
)就是0x5
拒绝访问。
硬解禁
于是暴力的方法有了,就是直接停止并删掉这个驱动,使用cmd命令(这也是最简单的方法):
sc stop TDFileFilter
sc delete TDFileFilter
如果cmd被禁用了,还有powershell:
cd C:\Windows\System32\
.\sc stop TDFileFilter
.\sc delete TDFileFilter
用API就是这样的:
SC_HANDLE sc = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
SC_HANDLE hFilt = OpenService(sc, "TDFileFilter", SERVICE_STOP | DELETE);
SERVICE_STATUS ss = {};
ControlService(hFilt, SERVICE_CONTROL_STOP, &ss);
DeleteService(hFilt);
CloseServiceHandle(sc);
CloseServiceHandle(hFilt);
软解禁
极域的安装目录下有很多dll,其中大部分是依赖库,而以“LibTD”开头的那些dll则是极域的一些模块,它们有分工明确,后面的分析中我们都要用到它们。
而在它们之中有一个模块叫“LibTDUsbHook10.dll”,用IDA Pro看导出函数:
里面的这些函数顾名思义都能知道它们的意思。其中TDUsbFilterInit()
、TDUsbFiltFree()
、TDUsbFilterDone()
这三个函数就是我们需要的。依次查看它们实际执行了什么,再为我们所用,就是优雅地玩极域的最高境界。
反编译它们形成的伪代码如下:
HANDLE g_hPort;
HANDLE hObject;//这个有点迷惑,这俩玩意有啥关系?
BOOL TDUsbFilterInit()
{
return hObject != (HANDLE)-1 || sub_10001410() == 0;
}
HRESULT sub_10001410()
{
HRESULT result; // eax
HRESULT v1; // esi
char Buffer[260]; // [esp+0h] [ebp-108h] BYREF
result = 0;
if ( g_hPort == (HANDLE)-1 )
{
result = FilterConnectCommunicationPort(L"\\TDFileFilterPort", 0, 0, 0, 0, &g_hPort);
v1 = result;
if ( result )
{
memset(Buffer, 0, sizeof(Buffer));
sprintf(Buffer, "FilterConnectCommunicationPort Fail: errCode is %d", result);
OutputDebugStringA(Buffer);
return v1;
}
}
return result;
}
int TDUsbFiltFree()
{
int InBuffer[4]; // [esp+0h] [ebp-10h] BYREF
memset(&InBuffer[1], 0, 12);
InBuffer[0] = 8;
sub_100014A0(InBuffer);
return 1;
}
HRESULT __stdcall sub_100014A0(LPVOID lpInBuffer)
{
HRESULT v2; // esi
DWORD BytesReturned; // [esp+0h] [ebp-10Ch] BYREF
char Buffer[260]; // [esp+4h] [ebp-108h] BYREF
if ( g_hPort == (HANDLE)-1 )
{
OutputDebugStringA("TDFileFilter.sys Connect Fail,g_hPort is INVALID_HANDLE_VALUE.");
return -1;
}
else
{
BytesReturned = 0;
v2 = FilterSendMessage(g_hPort, lpInBuffer, 0x10u, 0, 0, &BytesReturned);
if ( v2 )
{
memset(Buffer, 0, sizeof(Buffer));
sprintf(Buffer, "FilterSendMessage Fail: errCode is %d", v2);
OutputDebugStringA(Buffer);
}
return v2;
}
}
HANDLE TDUsbFilterDone()
{
HANDLE result; // eax
result = hObject;
if ( hObject != (HANDLE)-1 )
{
result = (HANDLE)CloseHandle(hObject);
hObject = (HANDLE)-1;
}
return result;
}
向极域过滤端口发送消息,驱动程序收到消息后以为是极域在操控它,就会放开限制。
从中(输出内容)还可以看出,极域程序员变量名起得还挺规范
里面有很多判断句柄是否有效的多余代码,其实实际上发挥作用的代码就这些:
#include <fltuser.h>
//LibTDUsbHook10.dll
//连接过滤端口(TDUsbFilterInit)
HANDLE hPort;
HRESULT hResult = FilterConnectCommunicationPort(L"\\TDFileFilterPort", 0, NULL, 0, NULL, &hPort);
if(hResult){
//出错!一定要停止执行,不然会导致我们程序崩溃!
//下面错误代码有助于判断错误原因
//DWORD dwErrorCode = hResult & 0x0000FFFF;
return;
}
//发送消息(TDUsbFiltFree)
int lpInBuffer[4] = {8, 0, 0, 0};
hResult = FilterSendMessage(hPort, lpInBuffer, 16/*0x10u*/, NULL, 0, NULL);
//关闭句柄(TDUsbFilterDone)
CloseHandle(hPort);
现在流传着所谓“极域解禁USB代码”,被偷到B站等地方为大众所知,事实上就是先LoadLibrary()
加载LibTDUsbHook10.dll,然后调用这3个导出函数。现在,大伙知道原理如何了吧。文章来源:https://www.toymoban.com/news/detail-431772.html
网络、键盘限制
待写,过几天再来看看吧~文章来源地址https://www.toymoban.com/news/detail-431772.html
到了这里,关于【干货最多】逆向分析学生机房管理助手7.8随机进程名算法、极域U盘、网络、键盘限制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!