查看: 5110|回复: 44
收起左侧

[金山] 求教金山bips驱动 这个地方不明白

  [复制链接]
zhq445078388
发表于 2012-7-9 11:24:51 | 显示全部楼层 |阅读模式
本帖最后由 zhq445078388 于 2012-7-9 11:33 编辑

我一直很好奇 因为作为浏览器来说 所有的动作都发生在自己的进程空间
也就是说 只需要制作一个进程内的Hook就可以很有把握的获取所有恶意行为了
但是金山的猎豹却使用了驱动程序架设了 bips
震撼之余 随手逆下
然后在入口处 就让我有点奇怪了
最起初的代码是:
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
  NTSTATUS result;
  PVOID RtlGetVersionadd;
  NTSTATUS tmpresult;

  if ( InitSafeBootMode )
  {
    result = STATUS_ACCESS_DENIED;    //判定是否安全模式 安全模式拒绝加载
  }
这都是很正常的
然后 判断不是安全模式 继续加载
else
  {
    systemver = 284;
       
    dword_2E104 = 255;
       
    RtlGetVersionadd = MmGetSystemRoutineAddress(&SystemRoutineName);//取RtlGetVersion地址
       
    dword_2E0E8 = (int)RtlGetVersionadd;
       
    if ( RtlGetVersionadd )
       
      RtlGetVersionadd(&systemver);//调用RtlGetVersion将结果存入
          
    tmpresult = sub_132F3();//搜索内存特征


注意一点
那就是SystemRoutineName 是啥内容

.data:000202C4 ; UNICODE_STRING SystemRoutineName
.data:000202C4 SystemRoutineName UNICODE_STRING <1Ah, 1Ch, offset aRtlgetversion>
.data:000202C4                                         ; DATA XREF: DriverEntry:loc_11EC1o
.data:000202C4                                         ; "RtlGetVersion"

也就是说 SystemRoutineName 是 RtlGetVersion
那么 使用MmGetSystemRoutineAddress取得的就是RtlGetVersion这个API的地址
下面的调用 很明显就是在使用这个API了
那么 根据RtlGetVersion的原型 我们很清楚 其实他的参数就是存储系统版本信息的一个结构体
也就是 OSVERSIONINFOW
那么 我给他命名为 systemver

然后下面的那个调用是在内存中搜索特征码
win32k.sys/fltmgr.sys/ntdll.dll/csrss.exe
根据经验 我认为这里是在定位 但是我们不管他 这不是我这次想说的重点
重点是
if ( tmpresult >= 0 )
    {
      ::DriverObject = DriverObject;
          
      getsysVersion();
          
      DeviceObject = (PDEVICE_OBJECT)sub_11F65();

对了 就是这里 getsysVersion(); 这个函数
这个函数 我跟进去看的时候 就有疑惑了
之前已经RtlGetVersion了.
这里..
NTSTATUS getsysVersion()
{
  NTSTATUS result;
  ULONG BuildNumber;
  ULONG MinorVersion;
  ULONG MajorVersion;

  BuildNumber = 0;
  MajorVersion = 0;
  MinorVersion = 0;
  result = PsGetVersion(&MajorVersion, &MinorVersion, &BuildNumber, 0);
  
  if ( MajorVersion == 5 )
  {
    result = MinorVersion;
    if ( !MinorVersion )
    {
      sysversion = 1;
      return result;
    }
    result = MinorVersion - 1;
       
    if ( MinorVersion == 1 )
    {
      sysversion = 2;
      return result;
    }
    result = MinorVersion - 2;
       
    if ( MinorVersion == 2 )
    {
      sysversion = 3;
      return result;
    }
  }
  else
  {
    if ( MajorVersion == 6 )
    {
      result = MinorVersion;
      if ( !MinorVersion )
      {
        sysversion = 4;
        return result;
      }
      result = MinorVersion - 1;
          
      if ( MinorVersion == 1 )
      {
        sysversion = 5;
        return result;
      }
    }
  }
  sysversion = 0;
  return result;
}

这里再次获取系统版本  并将结论 保存进sysversion 这个全局变量

不过 这个函数的判断并不全 这里看起来仅仅是对xp win7做了处理
但是 个人觉得还是有点怪 为啥一个系统版本要确定两次的?


PsSetCreateProcessNotifyRoutine((PCREATE_PROCESS_NOTIFY_ROUTINE)NotifyRoutine, 0);
这看起来 没什么问题..但是却也有问题.
那就是PsSetCreateProcessNotifyRoutine获取进程启动信息
为什么不在r3 自己的进程里面挂相关api呢? 挂自己进程 大大减少运算量 还更精准 更敢报了啊
防止不好影响 加权1 防止被什么爬虫抓到

/tiao眼镜鱼
发表于 2012-7-9 11:34:55 | 显示全部楼层
这个有嗲难度,等高人解答
Ventureminking
发表于 2012-7-9 12:10:30 | 显示全部楼层
小白看不懂
22667999
发表于 2012-7-9 12:10:40 | 显示全部楼层
楼主牛啊,猎豹驱动给你逆出来了~
Ψ坏¢脾气ッ
发表于 2012-7-9 12:12:52 | 显示全部楼层
小白飘过 完全看不懂
酱紫啊~
发表于 2012-7-9 12:13:54 | 显示全部楼层
小白表示看不懂
330978104
发表于 2012-7-9 12:33:03 | 显示全部楼层
真的看不懂...
青春虎
发表于 2012-7-9 12:39:12 来自手机 | 显示全部楼层
小白看不懂,看看官人怎么说
chen821101
发表于 2012-7-9 12:47:00 | 显示全部楼层
不懂
zhq445078388
 楼主| 发表于 2012-7-9 12:48:26 | 显示全部楼层
22667999 发表于 2012-7-9 12:10
楼主牛啊,猎豹驱动给你逆出来了~

牛什么牛 这是ida出来的
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2025-1-18 15:49 , Processed in 0.143908 second(s), 16 queries .

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

快速回复 客服 返回顶部 返回列表