Anti Hook,Anti BreakPoint

本文介绍了一种技术,通过将所需DLL文件复制到应用程序自己的内存空间中来防止API函数被调试工具拦截。这种方法使Cracker无法通过设置系统DLL文件中的断点来跟踪特定的API调用。

这段代码演示了如何让你的程序要保护的API函数不被下断。

这段代码显示一个对话框,但Cracker在OD中是无法下MessageBoxA断点的。因为程序将要用到的MessageBoxA函数的DLL文件拷贝到了自己新申请的空间内,并执行的是新空间中MessageBoxA的代码。而Cracker下的断是系统DLL文件的断点,显然是无法拦截到我们的函数的。

#include <windows.h>
#include <stdio.h>

DWORD RvaToOffset(LPVOID lpBase,DWORD VirtualAddress)
{
IMAGE_DOS_HEADER *dosHeader = (IMAGE_DOS_HEADER*)lpBase;
IMAGE_NT_HEADERS *NtHeader = (IMAGE_NT_HEADERS*)((BYTE*)lpBase + dosHeader->e_lfanew);
int NumberOfSection = NtHeader->FileHeader.NumberOfSections;
IMAGE_SECTION_HEADER *SectionHeader;

for (int i=0;i<NumberOfSection;i++)
{
   SectionHeader = IMAGE_FIRST_SECTION(NtHeader)+i;
   if(VirtualAddress>SectionHeader->VirtualAddress&&VirtualAddress<SectionHeader->VirtualAddress+SectionHeader->SizeOfRawData)
   {
    DWORD AposRVA = VirtualAddress - SectionHeader->VirtualAddress;
    DWORD offset = SectionHeader->PointerToRawData + AposRVA;
    return offset;
   }
}
return 0;
}


int main(int argc,char *argv[])
{
char szDllPath[MAX_PATH];
   DWORD dwRead;
char *szTitle="Tilte";
char *szMessage="Message";

GetSystemDirectory(szDllPath,MAX_PATH);
strcat(szDllPath,"//user32.dll");
HANDLE hFile = CreateFile(szDllPath,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,NULL,NULL);
DWORD dwSize = GetFileSize(hFile,NULL);
LPVOID lpBase = VirtualAlloc(NULL,dwSize,MEM_COMMIT,PAGE_READWRITE);
ReadFile(hFile,lpBase,dwSize,&dwRead,NULL);
//申请user32.dll文件大小空间,并将user32.dll文件写入

HMODULE lpMod = LoadLibrary(szDllPath); //得到user32.dll的HMODULE
LPVOID lpOldMessageBox = GetProcAddress(lpMod,"MessageBoxA");//得到MessageBoxA函数地址

DWORD dwRVA = (DWORD)lpOldMessageBox - (DWORD)lpMod;//计算MessageBoxA在内存中的偏移地址
DWORD lpNewMessageBox = RvaToOffset(lpBase,dwRVA);//将内存地址转换成文件地址,即找到MessageBoxA在文件中的地址
lpNewMessageBox += (DWORD)lpBase;//计算MessageBoxA在新内存中的地址

__asm
{
   mov eax,lpNewMessageBox
   push 0
   push szTitle
   push szMessage
   push 0
   call eax  
}

FreeLibrary(lpMod);
CloseHandle(hFile);
return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值