首页
社区
课程
招聘
[原创]TX某游戏内存加载d3d9的一个HOOK思路
发表于: 2016-9-17 13:08 17836

[原创]TX某游戏内存加载d3d9的一个HOOK思路

2016-9-17 13:08
17836

首先声明:本帖内容仅供技术交流,不涉及任何与过保护、作弊功能等任何违法行为有关的内容。

玩儿过TX某F的同学应该知道,某F在vista以上系统会加载d3d9.dll,而xp环境下就不加载d3d9.dll了,而且模块列表里也找不到d3d9.dll,这是为什么呢?
(因为没有xp系统的真机,所以就不放测试截图了)

有些同学以为*F是加载了D3D\\d3d9xpsp3.dll这个文件,其实不是,这个文件只是*f用来做内存校验的


真正的d3d9.dll被打包进了cross****Base.dll中,在运行时解密出来当做内存dll加载,所以你只能在模块列表里看到一个d3d8thk.dll(因为这是d3d9.dll的依赖库)。

那碰到这种内存dll的情况该如何做d3d hook呢?ida打开d3d9xpsp3.dll看一看,找到我们最亲切的D3DCreateDevice9同学


加载符号之后基本就能看个大概了

IDirect3D9 *__stdcall Direct3DCreate9(UINT SDKVersion)
{
  HMODULE v1; // eax@3
  FARPROC v2; // eax@4
  UINT v4; // eax@6
  BYTE Data[4]; // [sp+0h] [bp-108h]@1
  CHAR OutputString; // [sp+4h] [bp-104h]@10

  if ( GetD3DRegValue(4, "LoadDebugRuntime", Data, 4) )
  {
    if ( *(_DWORD *)Data )
    {
      v1 = LoadLibraryA("d3d9d.dll");
      if ( v1 )
      {
        v2 = GetProcAddress(v1, "Direct3DCreate9");
        if ( v2 )
          return (IDirect3D9 *)((int (__stdcall *)(_DWORD))v2)(SDKVersion);
      }
    }
  }
  v4 = SDKVersion & 0x7FFFFFFF;
  if ( (SDKVersion & 0x7FFFFFFF) != 31 && (v4 < 0x20 || v4 > 0x20 && v4 < 0x84) )
  {
    StringCbPrintfA(
      &OutputString,
      0x100u,
      "\nD3D ERROR: D3D header version mismatch.\nThe application was compiled against and will only work with D3D_SDK_VERSION (%d), but the currently installed runtime is version (%d).\nRecompile the application against the appropriate SDK for the installed runtime.\n\n",
      SDKVersion & 0x7FFFFFFF,
      32);
    OutputDebugStringA(&OutputString);
    return 0;
  }
  if ( !operator new(0x47B8u) )
    return 0;
  return (IDirect3D9 *)CEnum::CEnum(SDKVersion);
}
if ( !RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\DirectDraw\\GammaCalibrator", 0, 1u, &phkResult) )
*((_DWORD *)v2 + 4520) = 0;
  *((_DWORD *)v2 + 4521) = 0;
  *((_DWORD *)v2 + 4522) = 0;
  *((_DWORD *)v2 + 4523) = 0;
mov     [ebx+46A0h], esi
.text:4B66ADA7                 mov     [ebx+46A4h], esi
.text:4B66ADAD                 mov     [ebx+46A8h], esi
.text:4B66ADB3                 mov     [ebx+46ACh], esi
.text:4B66ADB9                 call    ds:__imp__RegOpenKeyExA@20

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 3
支持
分享
最新回复 (15)
雪    币: 8989
活跃值: (6205)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
分享技术是一种美德,感谢楼主。
2016-9-17 13:25
0
雪    币: 159
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
前排支持.
通过注册表来确定hook吗?

然而..最头疼的就是..
不知道什么时候进行hook时机 = =
2016-9-17 14:17
0
雪    币: 110
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不知道先于游戏主动加载d3d9,游戏有什么反应
2016-9-17 16:05
0
雪    币: 12848
活跃值: (9142)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
5
xp的话他不会使用你的d3d9,而是使用壳里面自带的d3d9,vista以上的话自己优先加载没问题,也可以hook,只不过会被检测到就是了
2016-9-17 16:19
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
技术帖,给LZ点个赞
2016-9-17 22:55
0
雪    币: 9941
活跃值: (2143)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
这思路还不错
2016-9-17 23:37
0
雪    币: 324
活跃值: (60)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
我去,大赞啊
2016-9-18 08:19
0
雪    币: 76
活跃值: (28)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
大屌刷新了我的世界观
2016-11-24 14:58
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
10
好复杂,现在不都是user mode显卡过滤的时代么?
2016-11-25 08:29
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
最近我也在弄 = = 只不过我是弄df的。。。一空一起交流和,新的TCJ模块太厉害了
2016-12-3 11:31
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
真正的d3d9.dll被打包进了cross****Base.dll中,d3d9做校验,内存加载dll,优先于d3d9加载HOOK,我试了,经我验证,可以,但是还是会被目录下的d3d9校验,推测进RING0HOOKD3D对应函数直接过掉F,绝地,从而实现ABCD。
2017-11-24 22:19
0
雪    币: 1485
活跃值: (1135)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
现在检测技术比单纯保护技术强很多。驱动很容易绕过,但检测有点难。重点研究应该是检测
2018-2-25 09:29
0
雪    币: 97
活跃值: (157)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
楼上说得对,检测就是最好的保护了。
2018-2-26 11:57
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
谢谢分享
2018-2-28 08:16
0
雪    币: 76
活跃值: (41)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
16
感谢分享!
2018-3-1 11:28
0
游客
登录 | 注册 方可回帖
返回
//