检测IAT HOOK----进程内存中的IAT

本文介绍了一种检测进程内存中导入地址表(IAT)的方法,通过使用OpenProcess和ReadProcessMemory读取指定进程的内存区域,并依据PE文件格式解析读取到的数据,最终目的是发现可能存在的IATHOOK。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

检测IAT HOOK----进程内存中的IAT

   
    昨天写的是磁盘的IAT.现在是内存的IAT.接着进行比较就可以得到IAT HOOK了
用OpenProcess和ReadProcessMemory读取你想读的进程..然后按照PE文件格式来解释读到的数据,lpBase就是读到数据缓冲区的地址

       dosHeader=(IMAGE_DOS_HEADER*)lpBase;
    if (dosHeader->e_magic!=IMAGE_DOS_SIGNATURE)
    {
        printf("This is not a windows file/n");
        return;
    }
   
    ntHeader=(IMAGE_NT_HEADERS*)((BYTE*)lpBase+dosHeader->e_lfanew);
    if(ntHeader->Signature!=IMAGE_NT_SIGNATURE)
    {
        printf("This is not a win32 file/n");
        return;
    }

IMAGE_IMPORT_DESCRIPTOR * pImportDesc=(IMAGE_IMPORT_DESCRIPTOR*)((BYTE*)lpBase+ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
  

   while (pImportDesc->FirstThunk)
{

    IMAGE_THUNK_DATA* thunk = (IMAGE_THUNK_DATA*)( (BYTE*)lpBase + pImportDesc->OriginalFirstThunk);
       IMAGE_THUNK_DATA*    pThunk= (PIMAGE_THUNK_DATA32)((PBYTE)lpBase+pImportDesc->FirstThunk) ;
  
while(thunk->u1.Function)
{

   isOrdinal = 0;
   if(thunk->u1.Function >= 0x01000000) isOrdinal = TRUE;
   if(!isOrdinal) // 以名字到处而不是序号
   {
    char* functionName = (char*)( (BYTE*)lpBase + (DWORD)thunk->u1.AddressOfData + 2 );
    printf("%x %s/n",pThunk->u1.Function,functionName);

   }
   if(isOrdinal)
   {
  
   }

   pThunk++;
   thunk++;

}

pImportDesc++;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值