Very_good 发表于 2022-3-29 22:40

简单逆向某平台驱动

emmm今天在玩某平台的时候,发现重启电脑后驱动会自动加载(并没有运行平台),我就发现这是一个很流氓的行为,因为你不知道他驱动在干些啥,于是决定简单逆向一下
用到的工具:IDA,PChunter,CE

首先定位驱动入口,将驱动dump出来,首先看一下入口



说实话IDA这个默认配色还是看得不太舒服,上CE看吧,后边的图除了反编译的图我都用ce



这个就舒服太多了,很明显可以看到入口被vm了

既然被vm了索性就不分析入口了

我们首先看看驱动干了啥吧   用ark工具也就是pchunter来看

创建了三个系统回调用来收集信息 分别是进程,线程,最后一个比较少见,跟图片有关,盲猜是截图或者是检测透视窗口的



创建了一个obj钩子一般都是用来保护游戏,防止被第三方读写



我就只分析一个进程的吧,要具体分析太杂太累,只是简单带过几笔

首先上IDA



这就是有关进程的回调,如果一句一句看,得累死

我们简单看看具体框架就行

我们很明显发现两条绿色的线,点进去F5看看



很明显可以看到

if ( !KeGetCurrentIrql() )
{
    if ( a3 )
    {


就是这两个判断

在内核中,KeGetCurrentIrql()是返回当前的IRQL


然后进行取反操作,也就是KeGetCurrentIrql()返回值为0时才往下执行。

再下来就是a3,a3为一个参数,这里应该是一个开关,而负责a3的应该是对战平台或者游戏,与驱动进行通讯修改a3的值

逆向思路:直接jmp,找到游戏或者平台通讯处,使其一直写入a3=0等等

一张一张图截图有点累,直接cv大法吧

if ( !KeGetCurrentIrql() )
{
    if ( a3 )
    {
      Process = 0i64;
      ProcessHandle = 0i64;
      v11 = 0;
      P = 0i64;
      if ( PsLookupProcessByProcessId(a2, &Process) >= 0 )// 返回指向进程的EPROCESS结构的引用指针
      {
      if ( ObOpenObjectByPointer(Process, 0x200u, 0i64, 0, 0i64, 0, &ProcessHandle) >= 0 )// 返回对象的句柄
      {
          if ( ZwQueryInformationProcess(       // 收集进程信息
               ProcessHandle,
               ProcessBasicInformation,
               ProcessInformation,
               0x30u,
               &ReturnLength) >= 0 )
          {
            _mm_lfence();


一直到这里   下面

if ( (int)sub_FFFFF8028D19D748(a2, &P) >= 0 )

我们进入这个函数看看

__int64 __fastcall sub_FFFFF8028D19D748(void *a1, PVOID *a2)
{
NTSTATUS v3; // ebx
PVOID PoolWithTag; // rax
PEPROCESS Process; // BYREF
ULONG ProcessInformationLength; // BYREF
HANDLE ProcessHandle; // BYREF

v3 = PsLookupProcessByProcessId(a1, &Process);
if ( v3 >= 0 )
{
    v3 = ObOpenObjectByPointer(Process, 0, 0i64, 0, 0i64, 0, &ProcessHandle);
    if ( v3 >= 0 )
    {
      v3 = ZwQueryInformationProcess(ProcessHandle, ProcessImageFileName, 0i64, 0, &ProcessInformationLength);
      if ( v3 == -1073741820 )
      {
      PoolWithTag = ExAllocatePoolWithTag(NonPagedPool, ProcessInformationLength, 0x66667061u);
      *a2 = PoolWithTag;
      if ( PoolWithTag )
      {
          v3 = ZwQueryInformationProcess(
               ProcessHandle,
               ProcessImageFileName,
               PoolWithTag,
               ProcessInformationLength,
               &ProcessInformationLength);
          if ( v3 < 0 )
          {
            ExFreePoolWithTag(*a2, 0x66667061u);
            *a2 = 0i64;
          }
      }
      }
      ZwClose(ProcessHandle);
    }
    ObfDereferenceObject(Process);
}
return (unsigned int)v3;
}


没什么好看的,主要是看一下

if ( v3 == -1073741820 )

v3是ZwQueryInformationProcess的返回值

在ZwQueryInformationProcess的返回值中-1073741820也就是STATUS_INFO_LENGTH_MISMATCH输入参数长度不匹配

也就是说这个函数是检测ZwQueryInformationProcess状态的

下边到分析完感觉也没有什么地方要单独拎出来将直接cv分析结果把

**** Hidden Message *****


其他几个地方就不分析了,知道了他的执行过程,逆向就很简单了,有很多可以过掉这个的方法

具体也不多说了,想分析的朋友可以自己去分析一下,这只是驱动层,他平台或者游戏本身也有检测的

那个比较简单,挂钩一些重要的函数即可。

最后祝大家身体健康,疫情期间勤带口罩少外出,也希望疫情早点结束

jESuY 发表于 2022-3-29 22:42

谢谢分享

NkjsCOYQeKqH 发表于 2022-3-29 22:51

火前留名!我相信一定会火!

tiEo943 发表于 2022-3-29 23:05

谢谢分享

VXBlSUP138 发表于 2022-3-29 23:10

感谢楼主

aDzvkl 发表于 2022-3-29 23:28

谢谢分享

oYmfLF8 发表于 2022-3-29 23:34

回复,顶帖,赚币,谢谢楼主

KrvHoE6 发表于 2022-3-29 23:34

被标题吸引进来了,回复看看

KcthLpNC593 发表于 2022-3-29 23:55

谢谢分享

zwVqG0972 发表于 2022-3-30 00:00

感谢楼主
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 简单逆向某平台驱动