【干货最多】逆向分析学生机房管理助手7.8随机进程名算法、极域U盘、网络、键盘限制

逆向分析7.8算法

先给个开幕雷击吧:

0

这真不知道怎么评价好呢,学生机房管理助手上一个版本还是7.5,在11月23号这天直接跳到了7.8,咱也不知道它是有中间昙花一现的两个版本呢,还是避讳什么,必须跳版本。

说实话,在我满怀期待反编译它之后,一股酸劲涌满我全身:作者开摆了。为什么呢?

上一个版本分析(逆向分析学生机房管理助手7.5随机进程名算法)中,我最终是在main.exe的“退出程序”这个窗体中找到退出算法的,于是这个版本下载好,当然是首先用.NETReactorSlayer脱壳。

脱完之后,打开dnSpy,按照从前的套路,直接进入main.exe的Form3,根据“退出”这个按钮的点击事件,定位到了method_3()方法。找到熟悉的退出逻辑:

1

核心逻辑和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看导出函数:

2

里面的这些函数顾名思义都能知道它们的意思。其中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个导出函数。现在,大伙知道原理如何了吧。

网络、键盘限制

待写,过几天再来看看吧~

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 极域课堂管理软件(v2016版)在启动时遇到“未找到可用的网络适配器,将以脱机模式启动”的问题。这个问题通常是由于以下几个原因导致的: 1. 网络适配器驱动问题:可能是网络适配器的驱动程序出现了故障或者需要更新。在这种情况下,我们可以尝试重新安装或更新网络适配器的驱动程序来解决问题。 2. 网络连接问题:可能是网络连接出现了问题,导致计算机无法识别到可用的网络适配器。我们可以尝试重新启动计算机和网络设备,或者检查网络连接是否正常。 3. 软件配置问题:可能是极域课堂管理软件的配置出现了问题,导致无法找到可用的网络适配器。在这种情况下,我们可以尝试重新配置软件,或者联系软件的技术支持团队寻求帮助。 无论是哪种原因导致的问题,我们都可以采取一些措施来解决。首先,我们应该确保计算机的网络适配器正常运行,并且能够正常连接到网络。如果网络适配器驱动程序需要更新,我们可以从官方网站下载最新的驱动程序来更新。如果问题仍然存在,我们可以尝试重新安装极域课堂管理软件。 总之,遇到“未找到可用的网络适配器,将以脱机模式启动”的问题,我们需要仔细检查网络适配器的状态,排除网络连接问题,并尝试更新或重新配置软件来解决。如果问题依然存在,我们可以寻求相关技术支持的帮助。 ### 回答2: 极域课堂管理软件(v2016)在启动时出现“未找到可用的网络适配器,将以脱机模式启动”的问题,这是因为软件无法检测到可用的网络适配器,导致无法与网络进行通信。 出现这个问题的原因可能有多种,例如网络适配器驱动程序未正确安装或已损坏,网络适配器硬件故障,或者软件本身存在bug。 解决这个问题的方法有以下几个步骤: 1. 检查网络适配器驱动程序是否正确安装。可以在设备管理器中查看网络适配器的状态,如果显示黄色感叹号或问号,则可能需要重新安装驱动程序。 2. 确保网络适配器硬件正常工作。可以尝试将网络适配器连接到其他设备上测试其是否正常工作。 3. 更新软件版本。有时,该问题可能是由软件本身的bug引起的。尝试更新到最新版本的极域课堂管理软件,看看是否能解决问题。 4. 使用其他网络适配器。如果有其他可用的网络适配器,可以尝试切换到其他适配器来测试软件是否可以正常工作。 5. 在网络设置中检查问题。检查网络设置是否正确,并确保网络连接正常。 如果以上方法都没有解决问题,建议联系极域客服团队寻求进一步的帮助。他们可以提供更具体的解决方案和技术支持。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值