【游戏保护】R3下的Shadow API

原理:其实就是把原先的Dll内部的API代码复制到另一块内存执行 类似于内存加载的dll 方法很简单也很有效 某些游戏 dxf xf *p保护下的游戏基本都在用 对r0 hook毫无卵用
用途:规避R3下 hook

#include <Windows.h>
#define FunNumber 20
struct NtFunction
{
    LPCSTR name;
    PVOID Fun;
};
NtFunction list[FunNumber];
DWORD FunMem = 0;
DWORD Size = 0;
DWORD GetFunSpace()
{

   return (DWORD)GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtOpenProcessTokenEx")- (DWORD)GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtOpenThreadTokenEx");
}
VOID EnDeFun()
{
    if (!FunMem)
    {
        return;
    }
    for (int i=0;i< Size * FunNumber;i++)
    {
        *(BYTE*)(FunMem + i) = *(BYTE*)(FunMem + i) ^ 0x521314;
    }
}
PVOID ExtNtDllFunciton(LPCSTR funname)
{
    if (!FunMem)
    {
      Size = GetFunSpace();
      FunMem = (DWORD)VirtualAlloc(NULL, Size * FunNumber, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    }
   
    static DWORD Times = 0;
    for (int i=0;i<20;i++)
    {
        if (lstrcmpA(list[i].name,funname)==0)
        {
            return list[i].Fun;
        }
    }
    PVOID Address=GetProcAddress(GetModuleHandle(L"ntdll.dll"), funname);
    if (Address)
    {
        memcpy((PVOID)(FunMem + Times * Size), Address, Size);
        char* name = (char*)malloc(strlen(funname) + 1);
        memcpy(name, funname, strlen(funname) + 1);
        PVOID Address= (PVOID)(FunMem + Times * Size);
        list[Times].name = name;
        list[Times].Fun = Address;
        Times++;
        return Address;
    }
    return 0;
}
typedef NTSTATUS(NTAPI* PNtReadVirtualMemory)(
    IN HANDLE               ProcessHandle,
    IN PVOID                BaseAddress,
    OUT PVOID               Buffer,
    IN ULONG                NumberOfBytesToRead,
    OUT PULONG              NumberOfBytesReaded OPTIONAL);
int main()
{
    printf("NtReadVirtualMemory %x NtWriteVirtualMemory %x NtReadVirtualMemory %x \n", ExtNtDllFunciton("NtReadVirtualMemory"), ExtNtDllFunciton("NtWriteVirtualMemory"), ExtNtDllFunciton("NtReadVirtualMemory"));
    PNtReadVirtualMemory myReadMemory = (PNtReadVirtualMemory)ExtNtDllFunciton("NtReadVirtualMemory");
    DWORD a = 123456;
    DWORD b = 0;
    myReadMemory(GetCurrentProcess(),&a,&b,4,NULL);
    printf("Shadow NtReadVirtualMemory 结果 %d \n",b);
    EnDeFun();//简单的对自己的代码加密一下
    printf("Shadow Native API已经加密\n");
    EnDeFun();//再次调用解密
    printf("Shadow Native API已经解密\n");
    system("pause");
}

shadow API生成情况:
在这里插入图片描述
shadow API调用情况:
在这里插入图片描述
对shadow API简单的加密:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值