18 个解决方案
#1
我觉得传参很好,...
#2
我也直到传参很好!关键是我现在无法用传参来实现项目需求!也可以说是直接使用变量会更方便!
#3
最好还是传参...
#4
将全局变量的指针作为参数传入,调用时候对指针解引用可操作该全局变量
#5
为什么不改成把这个全局变量定义在DLL内部呢?
#6
全局变量不容易控制
建一个static的类,里面可以包含着static的变量,取代全局变量
建一个static的类,里面可以包含着static的变量,取代全局变量
#7
创建新的数据段
#pragma data_seg("name")
int test;
#pragma data_seg()
#pragma comment(linker,"/SECTION:name,RWS")
#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.你不会是想写木马吧?
一种办法,传指针。
如果不行恐怕就只能硬编码了!
但是还需要知道那个模块的基地址(GetModuleHandle返回的句柄就是基地址)。
然后硬编码。
这种办法没试过,恐怕很危险吧!
P.S.你不会是想写木马吧?
#12
对不起,上面说错了。
不需要用基地址,数据段是放在一起的
在我的机器上使用硬编码通过。
首先写一个简单的C程序(VC2005)
单步运行转到反汇编
在这里看到了g的地址(417004h)
新建DLL工程A,修改DllMain
编译,放在第一个工程的debug文件夹下,将第一段代码中“LoadLibrary(_T("A.dll"));”前的注释去掉。
调试,输出结果为10.
不需要用基地址,数据段是放在一起的
在我的机器上使用硬编码通过。
首先写一个简单的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
注意上面两个基地址可能是不一样的,如果操作平台变化或者模块被动态加载。
我试过了:
如果全局变量定义在主模块中直接用反汇编出来的硬编码就可以了;
如果全局变量定义在动态库中,要先算其偏移址:offset=反汇编显示的地址-反汇编时模块基地址,运行时的实际地址=运行时该模块基地址+offset
注意上面两个基地址可能是不一样的,如果操作平台变化或者模块被动态加载。
#15
看来楼主是想写 运行时补丁
#16
谢谢各位,特别感谢xiao_dang的帮忙!
#17
谢谢各位,特别感谢xiao_dang的帮忙!
#18
为什么没有结帖的地方?是不是时间过了呀?
#1
我觉得传参很好,...
#2
我也直到传参很好!关键是我现在无法用传参来实现项目需求!也可以说是直接使用变量会更方便!
#3
最好还是传参...
#4
将全局变量的指针作为参数传入,调用时候对指针解引用可操作该全局变量
#5
为什么不改成把这个全局变量定义在DLL内部呢?
#6
全局变量不容易控制
建一个static的类,里面可以包含着static的变量,取代全局变量
建一个static的类,里面可以包含着static的变量,取代全局变量
#7
创建新的数据段
#pragma data_seg("name")
int test;
#pragma data_seg()
#pragma comment(linker,"/SECTION:name,RWS")
#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.你不会是想写木马吧?
一种办法,传指针。
如果不行恐怕就只能硬编码了!
但是还需要知道那个模块的基地址(GetModuleHandle返回的句柄就是基地址)。
然后硬编码。
这种办法没试过,恐怕很危险吧!
P.S.你不会是想写木马吧?
#12
对不起,上面说错了。
不需要用基地址,数据段是放在一起的
在我的机器上使用硬编码通过。
首先写一个简单的C程序(VC2005)
单步运行转到反汇编
在这里看到了g的地址(417004h)
新建DLL工程A,修改DllMain
编译,放在第一个工程的debug文件夹下,将第一段代码中“LoadLibrary(_T("A.dll"));”前的注释去掉。
调试,输出结果为10.
不需要用基地址,数据段是放在一起的
在我的机器上使用硬编码通过。
首先写一个简单的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
注意上面两个基地址可能是不一样的,如果操作平台变化或者模块被动态加载。
我试过了:
如果全局变量定义在主模块中直接用反汇编出来的硬编码就可以了;
如果全局变量定义在动态库中,要先算其偏移址:offset=反汇编显示的地址-反汇编时模块基地址,运行时的实际地址=运行时该模块基地址+offset
注意上面两个基地址可能是不一样的,如果操作平台变化或者模块被动态加载。
#15
看来楼主是想写 运行时补丁
#16
谢谢各位,特别感谢xiao_dang的帮忙!
#17
谢谢各位,特别感谢xiao_dang的帮忙!
#18
为什么没有结帖的地方?是不是时间过了呀?