您的位置:首页 > 编程语言 > C语言/C++

[随便说说]关于函数的显式调用和隐式调用(动态调用)--VC++

2010-02-10 10:54 351 查看
引用地址:http://hi.baidu.com/sidyh/blog/item/5366da45f9c09d44510ffef3.html

显式调用:

直接使用函数,只要事先声明该函数的所在库就可以了,比如:MessageBox(0,"标题","内容",0);此时编译后关于该函数的信息会在输入表里.PE文件被载入到内存的时候WINDOWS会把所需要的函数地址填充到内存的指定地方.

隐式调用:

我是学习免杀的时候才知道的,NOD32杀输入表,或者说CALL,那么,只要输入表里没有特征函数的信息就可以了,一般的思路是通过GetProcAddress来获得函数的地址,目前我所知道的有2种方法.

第一种方法是LoadLibrary函数,然后GetProcAddress获得函数地址,然后调用,具体示例代码:

#include <windows.h>

void MyFunTerminateThread(HANDLE hThread,DWORD dwExitCode){//返回值,形参类型需要参考MSDN

HINSTANCE hDll;

typedef BOOL (WINAPI *lpAddFun)(HANDLE,DWORD);//返回值,形参类型需要参考MSDN

lpAddFun addFun;

hDll=LoadLibrary("KERNEL32.dll");//函数所在的DLL

addFun=(lpAddFun)GetProcAddress(hDll,"TerminateThread");//函数名字

if (addFun != NULL)

{

addFun(hThread,dwExitCode);//调用函数

FreeLibrary(hDll);//释放句柄

}

}

注:示例函数是没有返回值的,反之需要添加和修改一些东西

第二种方法利用了结构体,比上一种方法代码量少了,不过思路是一样的,下面是示例代码:

#pragma comment(lib,"user32.lib")

#include <windows.h>

typedef int (WINAPI *MessageBoxAT)

(

HWND hWnd,

LPCSTR lpText,

LPCSTR lpCaption,

UINT uType

);

MessageBoxAT pMessageBoxA = (MessageBoxAT)GetProcAddress(LoadLibrary("user32.dll"),"MessageBoxA");

pMessageBoxA(NULL,show,"ok", NULL);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: