查看完整版本: [-- 【d3dx9_】系统如何决定加载哪个D3Dx9_XX? --]

-> 同人游戏创作/Doujin Games Workshop -> 【d3dx9_】系统如何决定加载哪个D3Dx9_XX? [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

h5nc 2009-09-10 15:57

【d3dx9_】系统如何决定加载哪个D3Dx9_XX?

简单说,我用我目前的SDK编译出来都加载D3Dx9_35.dll,我有没有方法让它强制加载_40.dll?最好通过更改常量&…………………………貌似
顺便如果我hook其中的函数,是不是不同的dll也要用该SDK来加载?


HMODULE hmod = LoadLibrary("d3dx9_40.dll");
GetProcAddress(hmod, "CreateTextureFromFileInMemoryEx");

顺便这个为什么得不到Address?怎么获取某个非export的函数在dll的地址?

我知道EntryPoint是001F1875,但是怎么找到加载过后的函数在的真正地址?

littlewater 2009-09-10 20:39
不导出怎么可能用API获得地址嘛= =
没有符号吧?

不过也许bind image然后再使用绝对地址CALL可能可以=v=+

鸡蛋灌饼 2009-09-10 21:10
装使用d3dx9_40的SDK,然后连接到它提供的lib上即可

h5nc 2009-09-10 21:13
莫非其实我只需要lib文件就可以了?
谁的版本是31、33、37、40的随便给我一个lib………………急用

鸡蛋灌饼 2009-09-10 21:25
引用第3楼h5nc于2009-09-10 21:13发表的  :
莫非其实我只需要lib文件就可以了?
谁的版本是31、33、37、40的随便给我一个lib………………急用

我这里只有38的(DirectX SDK (June 2008))
你可以试试看直接往d3dx9_40.dll上链接,Linux可以这么玩(不需要import library直接link against so),不知道MS的ld能不能这么搞

h5nc 2009-09-10 21:29
不是啊,我要inject我的detoursDll到已编译链接到40的exe上……
35的都可以挂上,别的版本的完全没反应……
所以我才想动态加载DLL,但是又找不到该函数地址……

简单说就是想hook一下CreateTexture类似函数

Advance 2009-09-10 23:05
D3DXCreateTextureFromFileInMemoryEx


你要玩HOOK,至少PE文件结构和ASM得了解一点吧……

h5nc 2009-09-10 23:32
我用detours成功hook到了自己编译出来的d3d9程序啊……

uox 2009-09-14 09:45
关于
GetProcAddress(hmod, "CreateTextureFromFileInMemoryEx");
得不到地址

你确定函数名正确么 XD
win下很多函数分ansi和unicode两版本 用后缀A W区分, 然后在header file里用define 定义成通用版本
建议仔细看看d3dx9.h里的定义


---分割线分割线分割线分割线分割线--

非export 函数 你只要能拿到运行时entry 地址就可以
不过这需要技术 == 因为entry adress可能会被重定位, 你需要解读dll image 规则
就是代码段映到那里 之类的信息

h5nc 2009-09-14 18:03
引用第8楼uox于2009-09-14 09:45发表的  :
关于
GetProcAddress(hmod, "CreateTextureFromFileInMemoryEx");
得不到地址
你确定函数名正确么 XD
.......


所以期望后半部分能有个例子出现……它是否有通用方法解读?

PS:我觉得有点问题了,就是我用detours植入的dll重新加载了d3dx9_40.dll,并寻找了它所带的函数位置……而并不是本身被植入程序加载的hmod……
我在思考如何找到其hmod………………………………………………

hook了LoadLibraryEx,发现没有d3dx9_40.dll,只有d3d9.dll……
其实系统调用d3dx9_40.dll也应该是走LoadLib吧……不太理解了……

想过某个想法:Hook到Direct3DCreate9,然后找到pD3D,不知道怎么hook其中的CreateDevice,然后取得pD3DDevice,然后再不知道怎么hook其中的CreateTexture相关…………………………好长……

uox 2009-09-15 00:03
比如 CreateTextureFromFileInMemoryEx
的 ansi版本是 CreateTextureFromFileInMemoryExA
unicode版是 CreateTextureFromFileInMemoryExW
看你传入的代表文件名字的参数是const char*还是const wchar_t *
凡是牵涉到文件名的函数基本都有这么两个版本

-----------------------------

hook CreateDevice
你自己要做一个IDirect3D9的interface, 在Direct3DCreate9的hook 函数中返回
那样app调用CreateDevice实际就是调用你的interface了
里面该干什么就有你说的算了

方法2, 获得Direct3DCreate9的返回后修改虚表
但不是很方便

------------------------------

系统不一定用了loadlibraryex, 或者在用这个的时候你的detour代码还没载入, 自然hook不到

Advance 2009-09-15 10:10
碰到这种问题不要想当然……

从输入表(包括EXE和DLL)导入的DLL是通过LdrpLoadImportModule加载、由LdrpWalkImportDescriptor负责查找DLL和填写IAT的(这是一个双向循环调用),而加载方式可以是映射known dlls或者从一个有效的磁盘位置加载独立DLL

h5nc 2009-09-15 11:39
引用第11楼Advance于2009-09-15 10:10发表的  :
碰到这种问题不要想当然……
从输入表(包括EXE和DLL)导入的DLL是通过LdrpLoadImportModule加载、由LdrpWalkImportDescriptor负责查找DLL和填写IAT的(这是一个双向循环调用),而加载方式可以是映射known dlls或者从一个有效的磁盘位置加载独立DLL


偶后来看到了这个export,貌似原来的TC插件设置不正确导致显示不出来……
不过既然如此,为什么我找不到这个函数地址呢?
我用同一个injection放入我的游戏成功hook到,别的游戏还没有成功过……区别之一是我们连接的dll不同……

CreateTextureFromFileInMemoryEx这个应该不牵扯文件名……似乎没有A和W的区别,我这里没看到……

我的判断是我hook的是我手头SDK中CreateTextureFromFileInMemoryEx的地址,恰巧对应35.dll的某个函数,于是成功
正常做法也许应根据该函数的名称查询该dll中的真实地址……

但这个判断在我的进一步试验却出现问题,我将35拷贝到目标游戏环境下并命名为40,这样我认为调用的地址就会一样……但依旧不成功

然后我觉得如果是DX8或者OLE的话应该不会有问题,我同样hook了相关函数,但依旧在别的游戏中从未成功过……我觉得可能做法上有些许问题……
但,d3dx9_40.dll和kernel32.dll有什么本质的区别么……

我目前触手下的函数们

  1. DetourAttach(&(PVOID&)TrueD3DXCreateTextureFromFileInMemoryEx, MyD3DXCreateTextureFromFileInMemoryEx);
    DetourAttach(&(PVOID&)TrueD3DXCreateTextureFromFileInMemory, MyD3DXCreateTextureFromFileInMemory);
    DetourAttach(&(PVOID&)TrueD3DXCreateTexture, MyD3DXCreateTexture);
    DetourAttach(&(PVOID&)TrueOleLoadPictureEx, MyOleLoadPictureEx);
    DetourAttach(&(PVOID&)TrueOleLoadPicture, MyOleLoadPicture);
    DetourAttach(&(PVOID&)TrueLoadLibraryEx, MyLoadLibraryEx);

258921 2009-09-15 12:50
引用第12楼h5nc于2009-09-15 11:39发表的  :
我的判断是我hook的是我手头SDK中CreateTextureFromFileInMemoryEx的地址,恰巧对应35.dll的某个函数,于是成功
正常做法也许应根据该函数的名称查询该dll中的真实地址……

你这么写会直接引用填充后的输入表里的地址,跟你SDK没什么关系就是。

Advance 2009-09-22 03:59
kernel32属于known dlls,加载方式是固定地址映射

你最好先去了解一下PE文件的构造和系统加载DLL的过程
或者如果你只想写好一个游戏,那么考虑放弃不熟悉的东西吧

h5nc 2009-09-22 08:52
引用第14楼Advance于2009-09-22 03:59发表的  :
kernel32属于known dlls,加载方式是固定地址映射
你最好先去了解一下PE文件的构造和系统加载DLL的过程
或者如果你只想写好一个游戏,那么考虑放弃不熟悉的东西吧


偶只是想知道有米有办法通过hook来导出某游戏资源而已……这些东西慢慢看吧
嘛。。无视掉吧。。最近在做某lua引擎的收尾,但由于用了修改过的hge,所以不知道在开源前应加入什么样的声明或修改,谁对这方面比较清楚呢……

franniss 2009-09-22 21:06
[那个游戏]我搞不鸟 H5加油胡克胡克

littlewater 2009-09-28 21:51
说起来,AVC你怎么设置OD显示函数的参数个数的^^?


查看完整版本: [-- 【d3dx9_】系统如何决定加载哪个D3Dx9_XX? --] [-- top --]


Powered by phpwind v8.7 Code ©2003-2011 phpwind
Time 0.018789 second(s),query:2 Gzip enabled