代码隐藏技术在反调试中作用很大。
有些对话框是调用MessageBox函数显示的,但你用MessageBox下断确拦不住,因为程序将MessageBox函数代码搬到其他的地址空间执行了。具体的原理,kanxue上有一段代码就是一个很好的例子。
这段原理是读取系统DLL到分配的内存里面去,然后定位到相关的API的代码。对原来的系统API函数下断点将无效。
#include <windows.h>
char Caption[]="Test";
char Text[]="MessageBoxA";
FARPROC GetApiAddr(DWORD Base,DWORD Api)
{
DWORD VirtualSize;
DWORD PhysicalAddr;
DWORD RawSize;
FARPROC RET=NULL;
//下面是相关的PE结构部分
PIMAGE_DOS_HEADER DosHeader=(PIMAGE_DOS_HEADER)Base;
PIMAGE_NT_HEADERS NtHeader=(PIMAGE_NT_HEADERS)((DWORD)DosHeader+(DWORD)DosHeader->e_lfanew);
PIMAGE_SECTION_HEADER SecHeader=(PIMAGE_SECTION_HEADER)((DWORD)NtHeader+sizeof(IMAGE_FILE_HEADER)+
NtHeader->FileHeader.SizeOfOptionalHeader+4);
DWORD SecSum=NtHeader->FileHeader.NumberOfSections;
while(SecSum)
{
PhysicalAddr=(DWORD)SecHeader->Misc.PhysicalAddress;
VirtualSize=(DWORD)SecHeader->VirtualAddress;//>Misc.VirtualSize;
PhysicalAddr+=VirtualSize;
if(Api>=VirtualSize&&Api<=PhysicalAddr)
{
//这里进行了文件偏移和内存偏移的转换
RawSize=SecHeader->PointerToRawData;
RawSize-=VirtualSize;
Base+=RawSize;
Base+=Api;
}
SecHeader++;
SecSum--;
}
RET=(FARPROC)Base;
return RET;
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
DWORD dwRead;
char SystemPath[MAX_PATH]={0};
HMODULE hMod=GetModuleHandleA("USER32.DLL");
if(!hMod)
hMod=LoadLibraryA("USER32.DLL");
GetSystemDirectoryA(SystemPath,MAX_PATH);
lstrcat(SystemPath,"\\user32.dll");
HANDLE Handle=CreateFileA(SystemPath,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
DWORD Size=GetFileSize(Handle,NULL);
LPVOID Virtual=VirtualAlloc(NULL,Size,MEM_COMMIT,PAGE_READWRITE);
VirtualLock(Virtual,Size);
ReadFile(Handle,Virtual,Size,&dwRead,NULL); //读取到内存中,整个读入,文件偏移保持不变。
DWORD MeAddr=(DWORD)GetProcAddress(hMod,"MessageBoxA");
MeAddr=MeAddr-(DWORD)hMod; //函数地址相对模块基址偏移量
DWORD Virtual1=(DWORD)Virtual; //分配的内存基址
DWORD Api=(DWORD)GetApiAddr(Virtual1,MeAddr);
//DWORD Api=(DWORD)GetProcAddress((HMODULE)Virtual1,"MessageBox"); //测试还能否发现MessageBox,发现读取整个dll到内存中后无法搜索到MessageBox了,只能通过地址来搜索。
_asm{
push 0
lea eax,Caption
push eax
lea eax,Text
push eax
push 0
call Api
}
return FALSE;
}
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法