我想在程序中显示调用dll中的一个函数,使用GetAddress获得函数入口,那么之前我应当那个如何平衡堆栈?

就是怎么压入参数和其它寄存器,调用完之后如何清理堆栈,跳转等等

你不用自己手动做这些事情,可以让编译器帮你。
你所要作的就是把GetProcAddress后获得的函数入口地址强制类型转换成你自己定义的特定类型的函数指针,然后当你用这个函数指针去调用DLL中的函数时编译器就会按照你对这个函数指针的类型定义去完成参数的压栈、清除等操作。

举个例子,比方说你已经知道你要调用的动态连接库中的函数有一个整型参数,而且没有返回值,那你就可以

1. 事先进行如下类型定义:
typedef void (*MYPROC)(int);

2. 在你的程序里定义一个该类型的函数指针:
MYPROC ProcAdd;

3. 调用GetProcAddress时把它返回的地址强制类型转换成你定义的类型:
ProcAdd = (MYPROC) GetProcAddress(hinstLib, "myPuts");

4. 然后你要调用该函数的时候就可以这样用:
(ProcAdd) ( 2 /* 随便一个整型的参数,视你程序的需要而定 */ );

这里的关键就是你要事先知道你调用的dll中的函数都有些什么参数以及返回值是怎样的。

还有一点要注意的就是函数调用方式。用VC++编写的动态连接库都是用__stdcall,而C/C++的缺省函数调用方式是__cdecl,不能搞错,否则程序就跑飞了。
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-11-11
在需要访问DLL时,调用LoadLibrary函数加载该DLL;当不再需要访问该DLL时,调用FreeLibrary函数释放对该DLL的引用。

我想在程序中显示调用dll中的一个函数,使用GetAddress获得函数入口...
typedef void (*MYPROC)(int);2. 在你的程序里定义一个该类型的函数指针:MYPROC ProcAdd;3. 调用GetProcAddress时把它返回的地址强制类型转换成你定义的类型:ProcAdd = (MYPROC) GetProcAddress(hinstLib, "myPuts");4. 然后你要调用该函数的时候就可以这样用:(ProcAdd) ( 2 \/* 随便一个...

怎样在C#中调用DLL中的函数,最好有代码和详细说明
若要使用其它函数名,可以使用EntryPoint属性设置,如:[DllImport("user32.dll", EntryPoint="MessageBoxA")]static extern int MsgBox(int hWnd, string msg, string caption, int type);其它可选的 DllImportAttribute 属性:CharSet 指示用在入口点中的字符集,如:CharSet=CharSet.Ansi;SetLastError 指示方法是否保留 ...

DLL文件劫持应该怎么办
首先会尝试从当前程序所在的目录加载DLL,如果没找到,则在Windows系统目录查找,最后是在环境变量中列出的各个目录下查找。利用这个特点,先伪造一个系统同名的DLL,提供同样的输出表,每个输出函数转向真正的系统DLL。程序调用系统DLL时会先调用当前目录下伪造的DLL,完成相关功能后,再跳到系统DLL同名函数...

附带带有lib文件的dll文件怎么调用?
dll的调用方式有静态和动态调用两种方式。lib 用于静态调用,和头文件*.h 结合使用。如果你只有dll文件,又知道dll文件中函数的格式,(比如微软的系统动态链接库),也可以使用Loadlibrary ,GetAddress 等函数来动态加载调用。

win32编程如何调用另一个程序或者dll…不要刚说一个函数,具体呢
静态调用就是在代码里 include 头文件,包含函数定义,并且链接 dll 的 lib 文件,然后直接使用即可,编译器会自动链接这个 dll,但是如果 dll 找不到,那么程序会无法启动 所以对于不确定 dll 是否可以正常使用时,需要使用动态调用 首先需要使用 LoadLibrary 函数 HMODULE WINAPI LoadLibrary( _In_ ...

dll注入&代码注入 学习总结
LoadRemoteLibraryR核心代码总结:在自己进程内存中heapalloc,将dll文件readfile进heapalloc出的内存中,openprocess获得进程句柄。LoadRemoteLibraryR函数获得dll入口函数的地址,并且利用远程线程注入rtlcreateuserprocess实现对dll入口函数的调用。{获得dl文件的入口点偏移:GetReflectiveLoaderOffset(lpBuffer); \/\/...

c#中怎样运行调用的dll文件
CharSet用于标识函数调用所采用的是Unicode或是ANSI版本,ExactSpelling=false将告诉编译器,让编译器决定使用Unicode或者是Ansi版本。其它的参数请参考MSDN在线帮助. 在C#中,你可以在EntryPoint域通过名字和序号声明一个动态链接库函数,如果在方法定义中使用的函数名与DLL入口点相同,你不需要在EntryPoint域显示声明函数。否则,...

vb 汇编 jmp 函数问题
程序主要部分是:hInstance=GetModuleHandle(offset szModuleName)lpProcAddress=GetProcessAddress(hInstance,offset szProcName);jmp lpProcAddress 如果要保险一点就多用个loadlibraryA吧。Address = GetProcAddress(GetModuleHandle("user32.dll"), "MessageBoxA")这样也行,GetModuleHandle这样的API不是要传...

firstthunk是什么数据结构
GetProcess获取函数真正的入口地址,放在由FirstThunk指向的IMAGE_THUNK_DATA中的Function元素中即可 有些情况下函数是不能用函数名来调用的,只能使用函数序号,这时候IMAGE_THUNK_DATA的低位指示函数序号(因为在dll中输出函数序号数组元素是以字为单位的)另外一种情况:程序的OriginalFirstThunk是0,在初始化...

如何动态调用函数或事件
lpFunA addFun;\/\/自定义函数的指针 hDll=LoadLibrary("..\\\\Debug\\\\dege.dll");\/\/动态加载dll,这里假设你的dll放在你要调用它的工程的debug下 if(hDll!=NULL){ addFun=(lpFunA)GetProAddress(hDll,"FunA");\/\/获得FunA的地址 if(FunA!=NULL){ \/\/这里正常使用addFun,跟普通函数一样 } F...

相似回答