首页
社区
课程
招聘
[旧帖] [求助]这样过NtOpenProcess还是会被检测到说非法环境,大牛帮看看那里问题啊,不胜感激 0.00雪花
发表于: 2012-11-3 17:53 1617

[旧帖] [求助]这样过NtOpenProcess还是会被检测到说非法环境,大牛帮看看那里问题啊,不胜感激 0.00雪花

2012-11-3 17:53
1617
ULONG  pNtOpenProcess_TpHookAddress = 0;       //TP的HOOK函数地址
ULONG   pNtOpenProcess_ReturnAddress = 0;        //返回到的地址
ULONG    pNtOpenProcess_MyHookAddress = 0;        //我们的HOOK函数在哪写入
PEPROCESS  processEPROCESS = NULL;  //保存访问者的EPROCESS
ANSI_STRING  p_str1,p_str2;      //保存进程名称
TOP5CODE  *top5code = NULL;  //保存字节内容
#define DNF_EXE  "DNF.exe"

//////////////////////////////////////////////////////////////////////
//  名称:  My_RecoveryHook_NtOpenThread
//  功能:  解除游戏保护对NtOpenThread 的HOOK
//  参数:  
//  返回:  状态
//////////////////////////////////////////////////////////////////////
void My_RecoveryHook_NtOpenProcess ()
{
ULONG   NtOpenProcessAddress  = 0;  //NtOpenProcess的地址
ULONG  ObOpenObjectByPointerAddress  = 0; //ObOpenObjectByPointer的地址

  UCHAR    JmpAddress[6] = {0xE9,0,0,0,0,0x90};
  KIRQL    Irql;

    //获取NtOpenProcess的地址
    NtOpenProcessAddress = (ULONG)MyGetFunAddress(L"NtOpenProcess");

    ObOpenObjectByPointerAddress = (ULONG)MyGetFunAddress(L"ObOpenObjectByPointer");

    //将p指向NtOpenProcess函数开始处
       
   
        PUCHAR p = (PUCHAR)NtOpenProcessAddress;
    //用一个无限循环来判断给定的特征码来确定被HOOK位置

        ULONG i = 0;

        while (i <1000)
        {
        if (*(p-7)    == 0x50 &&
               *(p-14)  == 0x56 &&
               *(p+3)  == 0xFF &&
               *(p+2)  == 0x06 &&
               *(p-1)  == 0xDC  &&
               *p      == 0xE8  &&
               *(p+5)    == 0x8B  &&
                *(p+6)    == 0xF8 )  
                {
                       
                        break;

                }
                i++;
                p++;
        }
       

    //将top5code指向p 的当前处
    //用以取出call [地址] 这字节里面的地址
    top5code = (TOP5CODE*)p;
    pNtOpenProcess_TpHookAddress = (ULONG)((ULONG)p+5+top5code2->address);

    //找到我们写入自定义函数的地址
    pNtOpenProcess_MyHookAddress = (ULONG)p- 6;
    //保存调用ObOpenObjectByPointer函数以后的返回地址
    pNtOpenProcess_ReturnAddress = (ULONG)p+5;

    //将一条JMP Nakd_NtOpenProcess写入到数组中
    *(ULONG *)(JmpAddress+1)=(ULONG)Nakd_NtOpenProcess - ((ULONG)pNtOpenProcess_MyHookAddress+5);

    DisableWP();  //清除CR0
    //提升IRQL中断级
    Irql=KeRaiseIrqlToDpcLevel();
    //写入
    RtlCopyMemory((PVOID)pNtOpenProcess_MyHookAddress,JmpAddress,6);
    //恢复Irql
    KeLowerIrql(Irql);
    EnableWP();    //恢复CR0
}

__declspec(naked) VOID  Nakd_NtOpenProcess()
{
  processEPROCESS = IoGetCurrentProcess();
  RtlInitAnsiString(&p_str1,(PCSZ)((ULONG)processEPROCESS+0x174));
  RtlInitAnsiString(&p_str2,DNF_EXE);
  if (RtlCompareString(&p_str1,&p_str2,TRUE) == 0)
  {

    __asm
    {
      push    dword ptr [ebp-38h]
      push    dword ptr [ebp-24h]
      call    pNtOpenProcess_TpHookAddress
      mov   eax, pNtOpenProcess_ReturnAddress
      jmp eax
    }
  }
  else
  {
    __asm
    {
      push    dword ptr [ebp-38h]
      push    dword ptr [ebp-24h]
      call   ObOpenObjectByPointerAddress   
      mov  eax,pNtOpenProcess_ReturnAddress
      jmp    eax
    }
  }
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 34
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
牛逼,只能膜拜,无法学习
2012-11-3 20:03
0
游客
登录 | 注册 方可回帖
返回