首页
社区
课程
招聘
[求助]X64 HOOK ntdll的memcpy函数
发表于: 2015-12-3 21:46 7942

[求助]X64 HOOK ntdll的memcpy函数

2015-12-3 21:46
7942
如题  用X32de hook方式在64会崩溃,应该是X64汇编的原因,请教该怎么处理
ntdll.memcpy - 4C 8B D9              - mov r11,rcx
ntdll.RtlCopyMemory+3- 48 2B D1              - sub rdx,rcx
ntdll.RtlCopyMemory+6- 0F82 9E010000         - jb ntdll.RtlCopyMemory+1AA
ntdll.RtlCopyMemory+C- 49 83 F8 08           - cmp r8,08
ntdll.RtlCopyMemory+10- 72 62                 - jb ntdll.RtlCopyMemory+74
ntdll.RtlCopyMemory+12- F6 C1 07              - test cl,07
ntdll.RtlCopyMemory+15- 74 37                 - je ntdll.RtlCopyMemory+4E

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
有函数原型,x64汇编Inline Hook无压力
2015-12-3 23:15
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
好像有挺多64位hook库,论坛搜一下。
2015-12-4 06:36
0
雪    币: 60
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
mhook ,测试无问题,如果hook过程简单 可以自己使用当前流行的反汇编库做一个简单hook流程。
2015-12-4 09:52
0
雪    币: 730
活跃值: (3385)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
5
被破坏的代码里有jb,恢复代码的时候要注意
2015-12-4 14:13
0
雪    币: 126
活跃值: (179)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
因为有jb,你不如HOOK了,就不再调用原函数.
反正memcpy也很简单,自己实现一个就好了
2016-1-2 12:18
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
7
这个非常简单啊!
你可以看看我的一个代码就知道了
#include "stdafx.h"
#include <Windows.h>
#include "../BPHookFunction/BPHookFunction.h"
typedef VOID (*PRtlCopyMemory)(
  _Out_       VOID UNALIGNED *Destination,
  _In_  const VOID UNALIGNED *Source,
  _In_        SIZE_T         Length
);
VOID MyRtlCopyMemory(
  _Out_       VOID UNALIGNED *Destination,
  _In_  const VOID UNALIGNED *Source,
  _In_        SIZE_T         Length
);
PRtlCopyMemory NtDllMemcpy = 0,NtDllMemcpy2=0;
ULONGLONG Num = 0;
CRITICAL_SECTION g_cs;
int _tmain(int argc, _TCHAR* argv[])
{
        ULONGLONG m_Num = 0;
        WCHAR Buffer[_MAX_PATH]={0};
        WCHAR Buffer2[_MAX_PATH]={0};
        wcscpy(Buffer,L"Test");
::InitializeCriticalSection(&g_cs);
EnterCriticalSection(&g_cs);
Num = 0;
LeaveCriticalSection(&g_cs);
        NtDllMemcpy=        (PRtlCopyMemory)GetProcAddress(::GetDllModuleHandleW(L"Ntdll.dll"),"memcpy");
        NtDllMemcpy2=NtDllMemcpy;
        SetInlineHook((PVOID*)&NtDllMemcpy,MyRtlCopyMemory);
        EnterCriticalSection(&g_cs);
        Num = 1;
LeaveCriticalSection(&g_cs);
        NtDllMemcpy2(&Buffer2,&Buffer,sizeof(Buffer2));
        return 0;
}

VOID MyRtlCopyMemory(
  _Out_       VOID UNALIGNED *Destination,
  _In_  const VOID UNALIGNED *Source,
  _In_        SIZE_T         Length
)
{
         ULONGLONG m_Num=0;
        EnterCriticalSection(&g_cs);
        m_Num=Num;
LeaveCriticalSection(&g_cs);
if(m_Num!=0)
         NtDllMemcpy(Destination,Source,Length);
}

这个程序需要的库和头文件我上传在了我自己的一个帖子这里了,地址http://bbs.pediy.com/showthread.php?t=206885
2016-1-3 00:18
0
游客
登录 | 注册 方可回帖
返回
//