看流星社区

 找回密码
 注册账号
查看: 4842|回复: 2

WIN7下 过TP 研究日记,还望大牛们指点一二!

[复制链接]

该用户从未签到

发表于 2011-3-11 09:28:08 | 显示全部楼层 |阅读模式
NtOpenProcess    这两个函数在WIN7下是CALL的 PS开头的
NtOpneThread     进入CALL内部可发现 PsOpenProcess 和 PsOpenthread 里面被HOOK
                            被HOOK的前几行都有检测,修改直接蓝屏,建议从前面第5行就JMP

NtReadVirtualMemory    这两个函数主要是还原的时候push的第二个参数不知道从何得来
NtWriteVirtualMemory   希望大牛们帮忙!网上看说是要解析PE文件,不明白如何解析。。

KeAttachProcess  这个函数不在SSDT表中,用工具看不到,不知道哪里被修改,希望能告知如何查看该函数被修改。。

之后Debug Port清0问题,也不知道从哪里可以看到被清0,从何下手。。(不是上网看,根本还不知道有这条)

还有二个地方被修改为
KDCOM.dll:KdReceivePacket  
KDCOM.dll:KdSendPacket          这两个地方如何改回来,现在还没有头绪,希望大牛们帮忙

#pragma code_seg("PAGE")
_declspec(naked) void My_NtWriteVirtualMemory()
{
  _asm
  {
    push 18h
    push 0x83ca9ae0
    jmp Real_NtWriteVirtualMemory_7
  }
}

我这里用的是绝对地址,但是每次重起后这个地址会变。
想请问下大牛们,NtWriteVirtualMemory 被HOOK后,第二个push的参数是怎么得来的。

#pragma code_seg("PAGE")
VOID TPHOOK()
{
  //DWORD PNtOpenProcess,PNtOpenThread,PObOpenObjectByPointer;
  UNICODE_STRING US_NtOpenProcess,US_NtOpenThread,US_ObOpenObjectByPointer;

  RtlInitUnicodeString(&US_NtOpenProcess,L"NtOpenProcess");
  RtlInitUnicodeString(&US_NtOpenThread,L"NtOpenThread");
  RtlInitUnicodeString(&US_ObOpenObjectByPointer,L"ObOpenObjectByPointer");


  PNtOpenProcess=(DWORD)MmGetSystemRoutineAddress(&US_NtOpenProcess);
  PNtOpenThread=(DWORD)MmGetSystemRoutineAddress(&US_NtOpenThread);
  PObOpenObjectByPointer=(DWORD)MmGetSystemRoutineAddress(&US_ObOpenObjectByPointer);

  
  DbgPrint("NtOpenProcess源地址:%x\nNtOpenThread源地址:%x\nObOpenObjectByPointer源地址:%x\n"
    ,PNtOpenProcess,PNtOpenThread,PObOpenObjectByPointer);


    DbgPrint("============计算NtOpenProcess开始=============\n");
  DWORD NtOpenProcess_py=*((DWORD*)(PNtOpenProcess+0x28+1));

  //计算NtOpenProcess Hook 地址
    _asm
  {
    mov ebx,PNtOpenProcess
    add ebx,0x28                 //ebx=PPsOpenProcess=PNtOpenProcess+0x28;
    add ebx,NtOpenProcess_py                  //+跳                    
    add ebx,0x5
    add ebx,0x21e
    mov PPsOpenProcess_21E,ebx
  }
  DbgPrint("NtOpenProcess_py为:%x\nPPsOpenProcess_21e为:%x\n",NtOpenProcess_py,PPsOpenProcess_21E);
  DbgPrint("============计算NtOpenProcess结束=============\n");

  DbgPrint("============计算NtOpenThread开始=============\n");

  DWORD NtOpenThread_py=*((DWORD*)(PNtOpenThread+0x27+1));

  //计算NtOpenProcess Hook 地址
  _asm
  {
      mov ebx,PNtOpenThread
      add ebx,0x27                 //ebx=PPsOpenProcess=PNtOpenProcess+0x28;
      add ebx,NtOpenThread_py                  //+跳                    
      add ebx,0x5
      add ebx,0x209
      mov PPsOpenThread_209,ebx
  }
  DbgPrint("NtOpenThread_py为:%x\nPPsOpenThread_209为:%x\n",NtOpenThread_py,PPsOpenThread_209);
  DbgPrint("============计算NtOpenThread结束=============\n");
  
  _asm  
  {   
    //去掉页面保护
    cli
      mov eax,cr0
      and eax,not 10000h //and eax,0FFFEFFFFh
      mov cr0,eax

  }

  _asm
  {
    //恢复NtOpenProcess
    mov ebx,PPsOpenProcess_21E
    mov al,0xe9
    mov byte ptr [ebx+0],al
    lea eax,My_NtOpenProcess
    sub eax,PPsOpenProcess_21E
    sub eax,5
    mov [ebx+1],eax

    /*//恢复NtOpenThread
    mov ebx,PPsOpenThread_209
    mov al,0xe9
    mov byte ptr [ebx+0],al
    lea eax,My_NtOpenThread
    sub eax,PPsOpenThread_209
    sub eax,5
    mov [ebx+1],eax*/
  }

  //恢复SSDT  NtReadVirtualMemory   NtWriteVirtualMemory

  _asm
  {
    //获取SSDT表地址
    mov eax,KeServiceDescriptorTable
      mov eax,[eax]
    mov ssdtaddr,eax

    //恢复NtReadVirtualMemory
    /*mov eax,ssdtaddr
    add eax,0x115*4
    lea ebx,My_NtReadVirtualMemory
    mov ecx,[eax]
    add ecx,7
    mov Real_NtReadVirtualMemory_7,ecx
    mov [eax],ebx

    //恢复NtWriteVirtualMemory
    mov eax,ssdtaddr
    add eax,0x18F*4
    lea ebx,My_NtWriteVirtualMemory
    mov ecx,[eax]
    add ecx,7
    mov Real_NtWriteVirtualMemory_7,ecx
    mov [eax],ebx*/
  }

  
    _asm //恢复页保护
    {
      mov eax,cr0
        or  eax,10000h //or eax,not 0FFFEFFFFh
        mov cr0,eax
        sti
    }

    DbgPrint("ssdtaddr为:%x\n",ssdtaddr);
    DbgPrint("============计算NtReadVirtualMemory结束=============\n");
}

该用户从未签到

发表于 2011-3-11 09:28:16 | 显示全部楼层
patch检测线程

该用户从未签到

发表于 2011-3-11 09:28:30 | 显示全部楼层
debug清零的特征码到现在还是可用的  你可以利用他的特征码找 偏移  然后自己定位 他把特征码给你
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-28 23:46

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表