自己实现GetProcAddress 实战中方便抹掉导入表 自己重建IAT让别人看不到符号

本文档介绍了一个C++实现的函数`MyGetProcAddress`,用于获取Windows API函数地址。它通过解析PE文件结构,遍历DLL的导出表来查找指定函数或序号对应的地址。如果函数地址超出模块基址加导入表的VirtualAddress,说明这是一个转发地址,需要递归调用`GetProcAddress`获取实际地址。
摘要由CSDN通过智能技术生成

根据导出表实现:GetProcAddress
注意:如果最后出现得函数地址>模块基址+导入表.VirtualAddress得话 则该地址是个字符串 字符串里面有dll和函数名 因为他是个转发地址 需要再调用GetProcAddress去进行获取

GetProcAddress(模块,序号-Base)
1.DWORD dwAddress=(DWORD)AddressOfFunctions[序号]+模块基址;

GetProcAddress(模块,名称)
1.遍历(!strcmp(AddressOfName[i],名称))相等后取出i的下标
2.WORD wOrdinals=AddressOfNameOrdinals[i];
3…DWORD dwAddress=(DWORD)AddressOfFunctions[wOrdinals]+模块基址;

#include <windows.h>
#include
using namespace std;

IMAGE_DOS_HEADER DOS;
IMAGE_FILE_HEADER PE;
IMAGE_OPTIONAL_HEADER OPTIONAL1;
IMAGE_SECTION_HEADER SECTIONS[96];
IMAGE_IMPORT_DESCRIPTOR DESCRIPTOR;
IMAGE_EXPORT_DIRECTORY ExPort;

int  Mystrcmp(char* szBuff1, char* szBuff2)
{
   
    int nCount1 = 0;
    int nCount2 = 0;
    char* r1 = szBuff1;
    char* r2 = szBuff2;
    while (*r2 != 0)
    {
   
        if (*r1 == 0)
        {
   
            r2++;
            nCount2++;
            continue;
        }
        if (*r1 > *r2)
        {
   
            nCount1++;
        }
        else if (*r2 > *r1)
        {
   
            nCount2++;
        }
        else
        {
   
            nCount1++ ;
            nCount2++;
        }
        r1++;
        r2++;
    }
    if (nCount1 == nCount2)
    {
   
        return 0;
    }
    {
   
        return 1;
    }
    else
    {
   
        return -1;
    }
}
FARPROC MyGetProcAddress(
    HMODULE hModule, // DLL模块句柄
    LPCSTR lpProcName // 函数名
)
{
   
    if (hModule == NULL)
    {
   
        return 0;
    }
    //DOS
    DWORD Offset = 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值