论坛风格切换切换到宽版
  • 8418阅读
  • 17回复

【d3dx9_】系统如何决定加载哪个D3Dx9_XX? [复制链接]

上一主题 下一主题
离线h5nc
 
发帖
2724
樱饼
0
博丽神社的喝茶券(威望)
2
春度
738
交易币
0
只看楼主 倒序阅读 楼主  发表于: 2009-09-10
简单说,我用我目前的SDK编译出来都加载D3Dx9_35.dll,我有没有方法让它强制加载_40.dll?最好通过更改常量&…………………………貌似
顺便如果我hook其中的函数,是不是不同的dll也要用该SDK来加载?


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

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

我知道EntryPoint是001F1875,但是怎么找到加载过后的函数在的真正地址?
[ 此帖被h5nc在2009-09-10 20:27重新编辑 ]

0x073《東方弾置場》开发版即将问世
【Leah】引擎问世
同人STG《叛境东方游》已经腰斩
《叛之境界无双篇》已死
离线littlewater
发帖
793
樱饼
5
博丽神社的喝茶券(威望)
1
春度
59
交易币
0
只看该作者 1楼 发表于: 2009-09-10
不导出怎么可能用API获得地址嘛= =
没有符号吧?

不过也许bind image然后再使用绝对地址CALL可能可以=v=+
水水
离线鸡蛋灌饼
发帖
2847
樱饼
0
博丽神社的喝茶券(威望)
0
春度
280
交易币
0
只看该作者 2楼 发表于: 2009-09-10
装使用d3dx9_40的SDK,然后连接到它提供的lib上即可
我一定是需要寻找自我了……
离线h5nc
发帖
2724
樱饼
0
博丽神社的喝茶券(威望)
2
春度
738
交易币
0
只看该作者 3楼 发表于: 2009-09-10
莫非其实我只需要lib文件就可以了?
谁的版本是31、33、37、40的随便给我一个lib………………急用

0x073《東方弾置場》开发版即将问世
【Leah】引擎问世
同人STG《叛境东方游》已经腰斩
《叛之境界无双篇》已死
离线鸡蛋灌饼
发帖
2847
樱饼
0
博丽神社的喝茶券(威望)
0
春度
280
交易币
0
只看该作者 4楼 发表于: 2009-09-10
引用第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
发帖
2724
樱饼
0
博丽神社的喝茶券(威望)
2
春度
738
交易币
0
只看该作者 5楼 发表于: 2009-09-10
不是啊,我要inject我的detoursDll到已编译链接到40的exe上……
35的都可以挂上,别的版本的完全没反应……
所以我才想动态加载DLL,但是又找不到该函数地址……

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

0x073《東方弾置場》开发版即将问世
【Leah】引擎问世
同人STG《叛境东方游》已经腰斩
《叛之境界无双篇》已死
离线Advance
发帖
2680
樱饼
0
博丽神社的喝茶券(威望)
2
春度
427
交易币
0
只看该作者 6楼 发表于: 2009-09-10
D3DXCreateTextureFromFileInMemoryEx


你要玩HOOK,至少PE文件结构和ASM得了解一点吧……
离线h5nc
发帖
2724
樱饼
0
博丽神社的喝茶券(威望)
2
春度
738
交易币
0
只看该作者 7楼 发表于: 2009-09-10
我用detours成功hook到了自己编译出来的d3d9程序啊……

0x073《東方弾置場》开发版即将问世
【Leah】引擎问世
同人STG《叛境东方游》已经腰斩
《叛之境界无双篇》已死
离线uox
发帖
118
樱饼
0
博丽神社的喝茶券(威望)
0
春度
13
交易币
0
只看该作者 8楼 发表于: 2009-09-14
关于
GetProcAddress(hmod, "CreateTextureFromFileInMemoryEx");
得不到地址

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


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

非export 函数 你只要能拿到运行时entry 地址就可以
不过这需要技术 == 因为entry adress可能会被重定位, 你需要解读dll image 规则
就是代码段映到那里 之类的信息
离线h5nc
发帖
2724
樱饼
0
博丽神社的喝茶券(威望)
2
春度
738
交易币
0
只看该作者 9楼 发表于: 2009-09-14
引用第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相关…………………………好长……
[ 此帖被h5nc在2009-09-14 20:03重新编辑 ]

0x073《東方弾置場》开发版即将问世
【Leah】引擎问世
同人STG《叛境东方游》已经腰斩
《叛之境界无双篇》已死
离线uox
发帖
118
樱饼
0
博丽神社的喝茶券(威望)
0
春度
13
交易币
0
只看该作者 10楼 发表于: 2009-09-15
比如 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
发帖
2680
樱饼
0
博丽神社的喝茶券(威望)
2
春度
427
交易币
0
只看该作者 11楼 发表于: 2009-09-15
碰到这种问题不要想当然……

从输入表(包括EXE和DLL)导入的DLL是通过LdrpLoadImportModule加载、由LdrpWalkImportDescriptor负责查找DLL和填写IAT的(这是一个双向循环调用),而加载方式可以是映射known dlls或者从一个有效的磁盘位置加载独立DLL
离线h5nc
发帖
2724
樱饼
0
博丽神社的喝茶券(威望)
2
春度
738
交易币
0
只看该作者 12楼 发表于: 2009-09-15
引用第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);
  2. DetourAttach(&(PVOID&)TrueD3DXCreateTextureFromFileInMemory, MyD3DXCreateTextureFromFileInMemory);
  3. DetourAttach(&(PVOID&)TrueD3DXCreateTexture, MyD3DXCreateTexture);
  4. DetourAttach(&(PVOID&)TrueOleLoadPictureEx, MyOleLoadPictureEx);
  5. DetourAttach(&(PVOID&)TrueOleLoadPicture, MyOleLoadPicture);
  6. DetourAttach(&(PVOID&)TrueLoadLibraryEx, MyLoadLibraryEx);

0x073《東方弾置場》开发版即将问世
【Leah】引擎问世
同人STG《叛境东方游》已经腰斩
《叛之境界无双篇》已死
离线258921
发帖
352
樱饼
0
博丽神社的喝茶券(威望)
0
春度
25
交易币
0
只看该作者 13楼 发表于: 2009-09-15
引用第12楼h5nc于2009-09-15 11:39发表的  :
我的判断是我hook的是我手头SDK中CreateTextureFromFileInMemoryEx的地址,恰巧对应35.dll的某个函数,于是成功
正常做法也许应根据该函数的名称查询该dll中的真实地址……

你这么写会直接引用填充后的输入表里的地址,跟你SDK没什么关系就是。
离线Advance
发帖
2680
樱饼
0
博丽神社的喝茶券(威望)
2
春度
427
交易币
0
只看该作者 14楼 发表于: 2009-09-22
kernel32属于known dlls,加载方式是固定地址映射

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