[原创] 这个代码可让你无法调用API函数!
//////////////////////////////////////////////////////////////////////////// 说明:这个程序代码目前只能禁止自己的API调用,如果稍加修改就能禁止其他程序的API调用了。 恶劣吧
// 程序:flyue
// [url]http://www.bccn.net[/url]
//////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <stdio.h>
int main()
{
HMODULE hModule = 0;
FARPROC pfnOrig = 0;
char strAPIName[256] = {0};
char strDLLName[256] = {0};
BYTE btNewBytes[8] = { 0xC2, 0x00, 0x00, 0x90, 0x90, 0x90, 0x90, 0x90 };
/*
btNewBytes对应的汇编代码:
ret 0 ;返回该函数
nop ;nop为无操作,用来占位置的
nop
nop
nop
nop
*/
bool bLoadType = false;
printf("输入一个API名称(如 MessageBoxA):\n");
scanf("%s", strAPIName);
printf("输入一个DLL名称(如 user32.dll):\n");
scanf("%s", strDLLName);
hModule = ::GetModuleHandle(strDLLName);
if(hModule) bLoadType = true;
else hModule = ::LoadLibrary(strDLLName);
if(hModule == NULL)
{
printf("读取DLL出错!\n");
return 1;
}
pfnOrig = ::GetProcAddress(hModule, strAPIName);
// 修改原API函数
if(pfnOrig != NULL)
{
DWORD dwOldProtect;
MEMORY_BASIC_INFORMATION mbi;
::VirtualQuery(pfnOrig, &mbi, sizeof(mbi));
::VirtualProtect(pfnOrig, 8, PAGE_READWRITE, &dwOldProtect);
// 写入新的执行代码
memcpy(pfnOrig, btNewBytes, 8);
::VirtualProtect(pfnOrig, 8, mbi.Protect, 0);
}
else
{
printf("找不到API函数入口点!\n");
return 2;
}
// 测试用的API,如果禁止成功将不会弹出此消息框
MessageBoxA(0,"AAA",0,0);
//////////////////////////////////////////////////////////////////////////
if(!bLoadType) FreeLibrary(hModule);
return 0;
}