首页
社区
课程
招聘
[求助]dll注入并获取另一个dll的全局变量
发表于: 2015-3-23 16:52 8807

[求助]dll注入并获取另一个dll的全局变量

2015-3-23 16:52
8807
问题是这样的:
  一个目标程序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则得到始终是初始值。

求教大神帮看看,这个问题困惑我好几天了,解决了送分!!!
先谢了!!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (21)
雪    币: 719
活跃值: (777)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
2
计算啪啪啪
2015-3-23 16:55
0
雪    币: 1313
活跃值: (11)
能力值: ( 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则得到始终是初始值。

求教大神帮看看,这个问题困惑我好几天了,解决了送分!!!
先谢了!!
2015-3-23 16:55
0
雪    币: 1313
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
啥意思啊大神?
2015-3-23 17:04
0
雪    币: 97
活跃值: (225)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
1 确定下你注入是成功的
2 确定下exe有调用set接口
如果都是确定的话 那应该是可以读出来值的
2015-3-23 17:21
0
雪    币: 1313
活跃值: (11)
能力值: ( 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。
2015-3-23 17:26
0
雪    币: 341
活跃值: (143)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
7
头像好玩。。发型好重要
2015-3-23 17:35
0
雪    币: 5467
活跃值: (1435)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
你是不是还在你的注入程序里调用MyType * p_obj = p_get_obj();呀?应该到DEMO.exe程序里调用MyType * p_obj = p_get_obj();
2015-3-23 17:50
0
雪    币: 1313
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
是在fuck.dll里调用的,在DLL_ATTACH_PROCESS时调用的p_get_obj,这样fuck.dll注入到demo.exe后加载fuck.dll时获取demo.dll的全局变量。
2015-3-23 18:10
0
雪    币: 97
活跃值: (225)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
发了1小时写测试 确定是可以的 如果有问题可以私聊我
2015-3-23 18:24
0
雪    币: 878
活跃值: (496)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
考虑tls的情况
2015-3-23 18:44
0
雪    币: 112
活跃值: (293)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
这是因为有copy on write机制
把全局变量放到共享节里就好了

有可能是这个问题
2015-3-23 19:10
0
雪    币: 29340
活跃值: (7884)
能力值: ( LV15,RANK:3306 )
在线值:
发帖
回帖
粉丝
13
估计这个fuck.dll加载的时候,demo.exe还没有调用set_obj, fuck.dll可以顺便把set_obj也hook一下, 并OutputDebugString看看
2015-3-23 21:08
0
雪    币: 1313
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
先运行的demo.exe,加载demo.dll,已经调用了set_obj,运行了一段时间之后才注入fuck.dll
2015-3-23 22:11
0
雪    币: 1313
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
多谢提醒,可能是这个问题导致,demo.exe是多线程程序。

我又用MFC写了个对话框的单线程程序demo_single.exe测试是可以获取demo.dll中的全局变量,
难道真是与多线程有关吗,在demo.exe的一个线程里调用set_obj,可是在demo.dll里变量是全局的啊,难道到了线程里面就变成局部的了?fuck.dll里调用get_obj像是获取了fuck.dll的另一份拷贝,好奇怪。
2015-3-23 22:15
0
雪    币: 97
活跃值: (225)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
测试demo已经发到你的邮箱了  麻烦接收下
2015-3-24 09:41
0
雪    币: 16
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
你是想从DLL中,共享全局变量,给进程使用?如果是这样,在dll中,使用#pragma data_seg即可,具体参见:http://blog.csdn.net/xuplus/article/details/2291860
2015-3-24 09:53
0
雪    币: 1313
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
不好意思了,我发现我注入到错误的进程里去了,有三个同名的demo.exe进程,都加载了demo.dll,注入到正确的进程里就可以了。

多谢楼上各位大牛!
2015-3-24 16:39
0
雪    币: 19
活跃值: (1086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
呵呵,,有点意思
2015-3-24 16:46
0
雪    币: 97
活跃值: (225)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
楼主 解决了就赶快分下分啊  我还等着转正呢!
2015-3-25 09:33
0
雪    币: 1313
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
已支付悬赏,多谢顺子给出Demo示例!
2015-3-25 17:22
0
雪    币: 97
活跃值: (225)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
终于转正了... ...
2015-3-26 12:27
0
游客
登录 | 注册 方可回帖
返回
//