深受网游写一个吊吧(三) – 启动外挂下

前方的稿子**[让网游写一个悬吧 ** 启航外挂及](http://www.cnblogs.com/killmyday/archive/2012/06/16/2551975.html)****介绍了输入法注入的方法,本文解释第二种方法。

 

一对打限制于多,可能会见拿输入法注入也经受用掉……这个上即便需另外想办法了。其实我们的目的非常简单,就是如果让无晓得我们挂有的玩,在某个时刻以悬挂作为娱乐之一个零件加载进来。输入法注入是操作系统强制填给游戏之,当然游戏有权利挑选不要。那么我们可以据此暴力解决,强制游戏加载外挂:

1.        
比如用缓冲区溢起漏洞(参考文章 如何以缓冲区溢起的次错误来运行黑客程序
和 争采取缓冲区溢起的次序不当来运转黑客程序(续))。

2.        
还有就是是于娱乐每次都见面执行之函数上挂个钩子
,但是一般的Windows钩子都见面叫玩受用掉……而本文的艺术是Hook
DirectX EndScene函数,即游戏于绘图结束晚调用的函数,而且游戏会在同等秒内不时调用这个函数,简直就是是管其当消息队列使!

 

WOW – 运DirectX
EndScene注入技术

本条方式可为此在WOW
3.3.5.13930达成,现在曾经颇了,有趣味的冤家可以好加一个3.3.5.13930底私服试试。据说有多智可以注入(DirectX
EndScene函数在d3d9.dll文件中):

1、 在戏文件夹里放一个d3d9.dll,因为Windows是优先找找游戏之干活目录再寻找system32文件夹的,所以会加载到由定义的d3d9.dll。

2、 直接当戏耍启动前把system32文本夹着之d3d9.dll换成团结的。

3、 使用IDA直接拿走EndScene的地点,并且在玩乐启动后,修改是地址之汇编码,使该优先调用我们的函数,再由我们的函数将控制权交还给真实的EndScene程序。

4、 在他挂里启动游戏,启动时优先用游乐经过暂停,执行同样多样Hook操作:

a)        
先Hook LoadLibrary以便在耍加载d3d9.dll底时候;

b)        
再Hook d3d9.dll里的Direct3DCreate9函数,

c)        
再通过Hook过的Direct3DCreate9函数获取D3D9的指针,

d)        
从D3D9指针处Hook D3D9->CreateDevice函数,以博取指向设备的指针Device。

e)        
再从Device指针处Hook Device->EndScene函数。

5、 在Windows操作系统里创建一个好之Device。

6、 或者虽是动SetWindowsHookEx
API安装一个系级别的Hook,然后我们的外挂就会见为加载进每一个过程!参考文档:http://www.woodmann.com/forum/archive/index.php/t-11023.htm

 

此处自己光所以过第4栽方式,因此本文也只介绍第4种植方法,这里我们因而到EasyHook这个库房,这个库房允许我们使用C#代码Hook系统API。EasyHook的用法很简短:

1、 在富含Hook函数的托管DLL里,创建一个看似,实现了EasyHook.IEntryPoint这个接口。

2、 在类的构造函数里建及宿主进程的连接。

3、 然后以IEntryPoint.Run函数里,注册你的Hook,下面是坐CreateFile这个系统API为条例:

 1、    public void Run(RemoteHooking.IContext InContext, String InChannelName)

2、    {
3、       CreateFileHook = LocalHook.Create(
4、           LocalHook.GetProcAddress(“kernel32.dll”, “CreateFileW”),
5、           new DCreateFile(CreateFile_Hooked),
6、           this);
7、    
8、       CreateFileHook.ThreadACL.SetExclusiveACL(new Int32[] {0});
9、    }

 

在第5行里,那个DCreateFile就是CreateFile在C#倍受的委托表现方法,因为是经过函数指针的章程实施的,因此会面声明成一个寄。

4、 最后以他挂里,使用下的代码注册Hook:

1、 static void Main(string[] args)
2、 {
3、     Config.Register(
4、     “A FileMon like demo application.”,
5、     “FileMon.exe”,
6、     “FileMonInject.dll”);
7、 
8、     RemoteHooking.IpcCreateServer<FileMonInterface>(
9、         ref ChannelName, WellKnownObjectMode.SingleCall);
10、 
11、    RemoteHooking.Inject(
12、        Int32.Parse(args[0]),
13、        “FileMonInject.dll”,
14、        “FileMonInject.dll”,
15、        ChannelName);

16、 } 

5、 代码里,还有一个着重的地方,就是Hook后获的指针是一个COM接口,即以到之是一个虚函数表,因此当Hook
EndScene方法的时刻,就是将这COM接口的EndScene的虚函数指针换成我们协调的,如下表的接口定义和替换方法:

1、    public unsafe class D3D9
2、    {
3、        [StructLayout(LayoutKind.Sequential, Pack = 4)]
4、        public struct IDirect3DDevice9
5、        {
6、            public IntPtr** VFTable;
7、        }
8、    }
9、    public IDirect3DDevice9(D3D9.IDirect3D9* InNativeIDirect3D9, 
10、    D3D9.IDirect3DDevice9* InNativeIDirect3DDevice9)
11、    {
12、    NativeIDirect3D9 = InNativeIDirect3D9;
13、    NativeIDirect3DDevice9 = InNativeIDirect3DDevice9;

14、    OverrideFunctions();
15、    }

16、    public D3D9.IDirect3D9* NativeIDirect3D9 
17、    { 
18、    get; private set; 
19、    }

20、    public D3D9.IDirect3DDevice9* NativeIDirect3DDevice9 
21、    {
22、    get; private set; 
23、    }

24、    private void OverrideFunctions()
25、    {
26、    OriginalEndScene = NativeIDirect3DDevice9->VFTable[0][42];

27、    RealEndScene =
28、    (DelegateEndScene)Marshal.GetDelegateForFunctionPointer(
29、    OriginalEndScene, typeof (DelegateEndScene));

30、    MyEndScene = EndScene;
31、    IntPtr PointerToMyEndScene = Marshal.GetFunctionPointerForDelegate(MyEndScene);

32、    NativeIDirect3DDevice9->VFTable[0][42] = PointerToMyEndScene;
33、    }

34、    public uint EndScene(D3D9.IDirect3DDevice9 Device)
35、    {
36、    // 防止多线程访问
37、    lock (LuaInterface.dataLock)
38、    {
39、    // 先开我们团结一心之政工,然后再用控制权转移给真正的EndScene函数

40、    return RealEndScene(Device);
41、    }

42、    } 

论以第37履 – 41履,就是于EndScene调用的下,先举行我们的作业,然后再次管控制权交给真正的EndScene。而第26执行,EndScene函数IDirect3DDevice9的第42个函数,因为在第3实践,代码都用IDirect3DDevice9接口(实际就是是一个虚函数表)当成一个普通的C/C++结构体处理 – 而且是32号机上的结构体(如果一旦支持64各项反一下哪怕可了),而第6实践代码,就是把这个虚函数表当作一个平凡的数组处理。不过据称在DirectX10里早就将EndScene去丢了……

 

这种方法,网上一度有完全的源代码,请以斯下载(这个代码和本文讲解使用的代码是差的,因此产生趣味之朋友可以自行钻研下的代码):

https://github.com/spazzarama/Direct3DHook

 

如若EasyHook的施用方法和详尽原理,请参考文档:

http://www.codeproject.com/Articles/27637/EasyHook-The-reinvention-of-Windows-API-hooking 

 

末了要大家对调剂技术感兴趣的话,可以考虑买入本人之新书: 应用程序调试技术,这套视频除了教学调试之艺外,还尽量完整地讲学了大用的技巧,这是坐调试技术好的话,需要根基功与背景知识扎实才行。

 

未完待续……