dll引入调用进程的全局变量!

时间:2022-11-22 12:27:01
参数传递的方法我直到,不过应该传递参数不是很方便,在dll中要用到调用进程的全局变量,不知道怎么引入!希望各位大虾帮帮忙!谢谢先!

18 个解决方案

#1


我觉得传参很好,...

#2


我也直到传参很好!关键是我现在无法用传参来实现项目需求!也可以说是直接使用变量会更方便!

#3


最好还是传参...

#4


将全局变量的指针作为参数传入,调用时候对指针解引用可操作该全局变量

#5


为什么不改成把这个全局变量定义在DLL内部呢?

#6


全局变量不容易控制
建一个static的类,里面可以包含着static的变量,取代全局变量

#7


创建新的数据段
#pragma data_seg("name")
int test;
#pragma data_seg()
#pragma comment(linker,"/SECTION:name,RWS")

#8


传全局变量的指针

#9


内存映射文件CreateFileMapping

#10


7楼的能给个使用例子吗?在dll中使用#pragma   comment(linker,"/SECTION:name,RWS")吗?但是变量名怎么引进来呢?

#11


你要想访问别的模块中定义的变量,总要知道地址吧!

一种办法,传指针。
如果不行恐怕就只能硬编码了!

但是还需要知道那个模块的基地址(GetModuleHandle返回的句柄就是基地址)。
然后硬编码。

这种办法没试过,恐怕很危险吧!

P.S.你不会是想写木马吧?

#12


对不起,上面说错了。
不需要用基地址,数据段是放在一起的
在我的机器上使用硬编码通过。

首先写一个简单的C程序(VC2005)

#include <iostream>
#include <windows.h>

using namespace std;

int g=2;


int _tmain(int argc, _TCHAR* argv[])
{
//LoadLibrary(_T("A.dll"));
cout<<g<<endl;
return 0;
}



单步运行转到反汇编

int _tmain(int argc, _TCHAR* argv[])
{
004113C0  push        ebp  
004113C1  mov         ebp,esp 
004113C3  sub         esp,0C0h 
004113C9  push        ebx  
004113CA  push        esi  
004113CB  push        edi  
004113CC  lea         edi,[ebp-0C0h] 
004113D2  mov         ecx,30h 
004113D7  mov         eax,0CCCCCCCCh 
004113DC  rep stos    dword ptr es:[edi] 
//LoadLibrary(_T("A.dll"));
cout<<g<<endl;
004113DE  mov         esi,esp 
004113E0  mov         eax,dword ptr [__imp_std::endl (41829Ch)] 
004113E5  push        eax  
004113E6  mov         edi,esp 
004113E8  mov         ecx,dword ptr [g (417004h)] 
004113EE  push        ecx  
004113EF  mov         ecx,dword ptr [__imp_std::cout (4182A0h)] 
004113F5  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (4182A4h)] 
004113FB  cmp         edi,esp 
004113FD  call        @ILT+340(__RTC_CheckEsp) (411159h) 
00411402  mov         ecx,eax 
00411404  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (418298h)] 
0041140A  cmp         esi,esp 
0041140C  call        @ILT+340(__RTC_CheckEsp) (411159h) 
return 0;
00411411  xor         eax,eax 
}
00411413  pop         edi  
00411414  pop         esi  
00411415  pop         ebx  
00411416  add         esp,0C0h 
0041141C  cmp         ebp,esp 
0041141E  call        @ILT+340(__RTC_CheckEsp) (411159h) 
00411423  mov         esp,ebp 
00411425  pop         ebp  
00411426  ret              


在这里看到了g的地址(417004h)

新建DLL工程A,修改DllMain
#include "stdafx.h"


#ifdef _MANAGED
#pragma managed(push, off)
#endif

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
 )
{
int *p=(int *)(0x417004);//硬编码
*p=10;//赋值
    return TRUE;
}

#ifdef _MANAGED
#pragma managed(pop)
#endif


编译,放在第一个工程的debug文件夹下,将第一段代码中“LoadLibrary(_T("A.dll"));”前的注释去掉。
调试,输出结果为10.

#13


还有一点:
要注意不同的优化设置导致可执行文件结构是不同的,需要修改相应的硬编码值。

#14


前面说的不需要基地址的方法只对主模块(.exe)有效,如果全局变量定义在动态库中还是需要基地址的!

我试过了:
如果全局变量定义在主模块中直接用反汇编出来的硬编码就可以了;
如果全局变量定义在动态库中,要先算其偏移址:offset=反汇编显示的地址-反汇编时模块基地址,运行时的实际地址=运行时该模块基地址+offset

注意上面两个基地址可能是不一样的,如果操作平台变化或者模块被动态加载。

#15


看来楼主是想写 运行时补丁 

#16


谢谢各位,特别感谢xiao_dang的帮忙!

#17


谢谢各位,特别感谢xiao_dang的帮忙!

#18


为什么没有结帖的地方?是不是时间过了呀?

#1


我觉得传参很好,...

#2


我也直到传参很好!关键是我现在无法用传参来实现项目需求!也可以说是直接使用变量会更方便!

#3


最好还是传参...

#4


将全局变量的指针作为参数传入,调用时候对指针解引用可操作该全局变量

#5


为什么不改成把这个全局变量定义在DLL内部呢?

#6


全局变量不容易控制
建一个static的类,里面可以包含着static的变量,取代全局变量

#7


创建新的数据段
#pragma data_seg("name")
int test;
#pragma data_seg()
#pragma comment(linker,"/SECTION:name,RWS")

#8


传全局变量的指针

#9


内存映射文件CreateFileMapping

#10


7楼的能给个使用例子吗?在dll中使用#pragma   comment(linker,"/SECTION:name,RWS")吗?但是变量名怎么引进来呢?

#11


你要想访问别的模块中定义的变量,总要知道地址吧!

一种办法,传指针。
如果不行恐怕就只能硬编码了!

但是还需要知道那个模块的基地址(GetModuleHandle返回的句柄就是基地址)。
然后硬编码。

这种办法没试过,恐怕很危险吧!

P.S.你不会是想写木马吧?

#12


对不起,上面说错了。
不需要用基地址,数据段是放在一起的
在我的机器上使用硬编码通过。

首先写一个简单的C程序(VC2005)

#include <iostream>
#include <windows.h>

using namespace std;

int g=2;


int _tmain(int argc, _TCHAR* argv[])
{
//LoadLibrary(_T("A.dll"));
cout<<g<<endl;
return 0;
}



单步运行转到反汇编

int _tmain(int argc, _TCHAR* argv[])
{
004113C0  push        ebp  
004113C1  mov         ebp,esp 
004113C3  sub         esp,0C0h 
004113C9  push        ebx  
004113CA  push        esi  
004113CB  push        edi  
004113CC  lea         edi,[ebp-0C0h] 
004113D2  mov         ecx,30h 
004113D7  mov         eax,0CCCCCCCCh 
004113DC  rep stos    dword ptr es:[edi] 
//LoadLibrary(_T("A.dll"));
cout<<g<<endl;
004113DE  mov         esi,esp 
004113E0  mov         eax,dword ptr [__imp_std::endl (41829Ch)] 
004113E5  push        eax  
004113E6  mov         edi,esp 
004113E8  mov         ecx,dword ptr [g (417004h)] 
004113EE  push        ecx  
004113EF  mov         ecx,dword ptr [__imp_std::cout (4182A0h)] 
004113F5  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (4182A4h)] 
004113FB  cmp         edi,esp 
004113FD  call        @ILT+340(__RTC_CheckEsp) (411159h) 
00411402  mov         ecx,eax 
00411404  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (418298h)] 
0041140A  cmp         esi,esp 
0041140C  call        @ILT+340(__RTC_CheckEsp) (411159h) 
return 0;
00411411  xor         eax,eax 
}
00411413  pop         edi  
00411414  pop         esi  
00411415  pop         ebx  
00411416  add         esp,0C0h 
0041141C  cmp         ebp,esp 
0041141E  call        @ILT+340(__RTC_CheckEsp) (411159h) 
00411423  mov         esp,ebp 
00411425  pop         ebp  
00411426  ret              


在这里看到了g的地址(417004h)

新建DLL工程A,修改DllMain
#include "stdafx.h"


#ifdef _MANAGED
#pragma managed(push, off)
#endif

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
 )
{
int *p=(int *)(0x417004);//硬编码
*p=10;//赋值
    return TRUE;
}

#ifdef _MANAGED
#pragma managed(pop)
#endif


编译,放在第一个工程的debug文件夹下,将第一段代码中“LoadLibrary(_T("A.dll"));”前的注释去掉。
调试,输出结果为10.

#13


还有一点:
要注意不同的优化设置导致可执行文件结构是不同的,需要修改相应的硬编码值。

#14


前面说的不需要基地址的方法只对主模块(.exe)有效,如果全局变量定义在动态库中还是需要基地址的!

我试过了:
如果全局变量定义在主模块中直接用反汇编出来的硬编码就可以了;
如果全局变量定义在动态库中,要先算其偏移址:offset=反汇编显示的地址-反汇编时模块基地址,运行时的实际地址=运行时该模块基地址+offset

注意上面两个基地址可能是不一样的,如果操作平台变化或者模块被动态加载。

#15


看来楼主是想写 运行时补丁 

#16


谢谢各位,特别感谢xiao_dang的帮忙!

#17


谢谢各位,特别感谢xiao_dang的帮忙!

#18


为什么没有结帖的地方?是不是时间过了呀?