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

引用地址: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);

你可能感兴趣的:([随便说说]关于函数的显式调用和隐式调用(动态调用)--VC++)