能力值:
( LV8,RANK:120 )
|
-
-
2 楼
计算啪啪啪
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
问题是这样的:
一个目标程序demo.exe,该程序加载了demo.dll动态库,动态库里有个全局变量,然后dll有Set/Get接口,dll中仅仅导出了set_obj和get_obj两个函数,全局变量未做任何特殊处理:
MyType * g_my_obj = NULL;
void set_obj(MyType * mt)
{
g_my_obj = mt;
}
MyType * get_obj()
{
return g_my_obj;
}
我另外写了一个动态库fuck.dll,把这个动态库注入到demo.exe里,然后用Detours获取demo.dll的函数get_obj:
p_get_obj = (func_get_obj)DetourFindFunction("demo.dll", "get_obj");
MyType * p_obj = p_get_obj();
上面这行代码获取到的demo.dll中的全局变量值始终为NULL,也就是它的初始值,其实demo.exe里已经调用了set_obj修改了那个全局变量值,但是在fuck.dll得到的始终是NULL。
如果在fuck.dll里调用set_obj设置一下值,再接着get则可以得到刚刚set的值,但是fuck.dll里不调用set,仅仅只是get_obj则得到始终是初始值。
求教大神帮看看,这个问题困惑我好几天了,解决了送分!!!
先谢了!!
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
啥意思啊大神?
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
1 确定下你注入是成功的
2 确定下exe有调用set接口
如果都是确定的话 那应该是可以读出来值的
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
多谢大神帮忙!
注入确实是成功的,可以用ProcExplorer看到fuck.dll已经在demo.exe进程空间了,用OD attach上去也可以看到注入成功了。
exe的确调用了set接口,exe启动时会初始化调用set,有log输出可以看到demo.dll中的这个全局变量值不为空。
如果fuck.dll注入后也调用set接口,再接着调用get得到的也是不为NULL的值,这个是正确的,但是如果不调用set,就始终是NULL。
|
能力值:
( LV7,RANK:110 )
|
-
-
7 楼
头像好玩。。发型好重要
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
你是不是还在你的注入程序里调用MyType * p_obj = p_get_obj();呀?应该到DEMO.exe程序里调用MyType * p_obj = p_get_obj();
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
是在fuck.dll里调用的,在DLL_ATTACH_PROCESS时调用的p_get_obj,这样fuck.dll注入到demo.exe后加载fuck.dll时获取demo.dll的全局变量。
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
发了1小时写测试 确定是可以的 如果有问题可以私聊我
|
能力值:
( LV3,RANK:20 )
|
-
-
11 楼
考虑tls的情况
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
这是因为有copy on write机制
把全局变量放到共享节里就好了
有可能是这个问题
|
能力值:
( LV15,RANK:3306 )
|
-
-
13 楼
估计这个fuck.dll加载的时候,demo.exe还没有调用set_obj, fuck.dll可以顺便把set_obj也hook一下, 并OutputDebugString看看
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
先运行的demo.exe,加载demo.dll,已经调用了set_obj,运行了一段时间之后才注入fuck.dll
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
多谢提醒,可能是这个问题导致,demo.exe是多线程程序。
我又用MFC写了个对话框的单线程程序demo_single.exe测试是可以获取demo.dll中的全局变量,
难道真是与多线程有关吗,在demo.exe的一个线程里调用set_obj,可是在demo.dll里变量是全局的啊,难道到了线程里面就变成局部的了?fuck.dll里调用get_obj像是获取了fuck.dll的另一份拷贝,好奇怪。
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
测试demo已经发到你的邮箱了 麻烦接收下
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
你是想从DLL中,共享全局变量,给进程使用?如果是这样,在dll中,使用#pragma data_seg即可,具体参见:http://blog.csdn.net/xuplus/article/details/2291860
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
不好意思了,我发现我注入到错误的进程里去了,有三个同名的demo.exe进程,都加载了demo.dll,注入到正确的进程里就可以了。
多谢楼上各位大牛!
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
呵呵,,有点意思
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
楼主 解决了就赶快分下分啊 我还等着转正呢!
|
能力值:
( LV2,RANK:10 )
|
-
-
21 楼
已支付悬赏,多谢顺子给出Demo示例!
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
终于转正了... ...
|
|
|