能力值:
( LV5,RANK:60 )
2 楼
可能是动了cpu cr0的保留位,比如位3,5,63:52在某些型号上保留,可以翻一下intel docs,同时也建议先_mm_mfence()之后再__writecr0(),保证内存一致性
能力值:
( LV1,RANK:0 )
3 楼
TurkeybraNC
可能是动了cpu cr0的保留位,比如位3,5,63:52在某些型号上保留,可以翻一下intel docs,同时也建议先_mm_mfence()之后再__writecr0(),保证内存一致性
谢谢宝宝,我这就检查
能力值:
( LV1,RANK:0 )
4 楼
能力值:
( LV2,RANK:10 )
5 楼
能力值:
( LV1,RANK:0 )
6 楼
关CET
能力值:
( LV1,RANK:0 )
7 楼
能力值:
( LV1,RANK:0 )
8 楼
咖啡_741298
源码发出来看看
//h
#pragma once
#include <ntifs.h>
#include <ntddk.h>
#include <intrin.h>
#define MAX_HOOK_COUNT 0x100
typedef struct _HOOK_INFO {
void* ori_func_addr;
unsigned char SavedCode[14];
}HOOK_INFO, * PHOOK_INFO;
class inline_hook_manager {
public:
bool inline_remove_hook(void* ori_func_addr);
bool inline_hook(void** ori_func_addr, void* target_func);
void* create_tramp_line(char* target_func, UINT64 break_bytes_count, char* break_bytes);
KIRQL wp_bit_off();
void wp_bit_on(KIRQL);
static inline_hook_manager* fn_get_instance();
private:
static inline_hook_manager* instance;
UINT64 m_cur_hook_count;
HOOK_INFO m_info[MAX_HOOK_COUNT];
unsigned char* m_tramp_line;
UINT64 m_tramp_line_used;
}; //cpp
#include "inline_hook.h"
#include "hde64.h"
inline_hook_manager* inline_hook_manager::instance;
KIRQL inline_hook_manager::wp_bit_off()
{
//DbgBreakPoint();
////关闭CR0
auto irql = KeRaiseIrqlToDpcLevel();//关闭线程切换
UINT64 Cr0 = __readcr0();
Cr0 &= 0xfffffffffffeffff;
__writecr0(Cr0);
_disable();
return irql;
}
// (对应原代码片段3)
void inline_hook_manager::wp_bit_on(KIRQL irql)
{
////开启CR0
UINT64 Cr0 = __readcr0();
Cr0 |= 0x10000;
_enable();
__writecr0(Cr0);
KeLowerIrql(irql);
}
bool inline_hook_manager::inline_hook(void** ori_func_addr, void* target_func)
{
if (m_cur_hook_count >= MAX_HOOK_COUNT) return false;
UINT64 break_byte_count = 0;
char* ori_func = (char*)ori_func_addr;
hde64s hde{ 0 };
while (break_byte_count < 14) {
hde64_disasm(ori_func + break_byte_count, &hde);
break_byte_count += hde.len;
}
auto& info = instance->m_info;
info[m_cur_hook_count].ori_func_addr = ori_func;
memcpy(info[m_cur_hook_count].SavedCode, ori_func, 14);
*ori_func_addr = create_tramp_line(ori_func, break_byte_count, ori_func);
char jmp_code[14] = { 0xff,0x25,0x00,0,0,0,0,0,0,0,0,0,0,0 };
*((ULONG64*)(&jmp_code[6])) = (ULONG64)target_func;
auto irql = wp_bit_off();
memcpy(ori_func, jmp_code, 14);
wp_bit_on(irql);
return true;
}
void* inline_hook_manager::create_tramp_line(char* target_func, UINT64 break_bytes_count, char* break_bytes)
{
const ULONG TrampLineBreakBytes = 20;
unsigned char TrampLineCode[TrampLineBreakBytes] = { //push xxx mov ret 不影响任何寄存器
0x6A, 0x00, 0x3E, 0xC7, 0x04, 0x24, 0x00, 0x00, 0x00, 0x00,
0x3E, 0xC7, 0x44, 0x24, 0x04, 0x00, 0x00, 0x00, 0x00, 0xC3
};
//复制绝对跳转
*((PUINT32)&TrampLineCode[6]) = (UINT32)(((uint64_t)target_func + break_bytes_count) & 0xFFFFFFFF);
*((PUINT32)&TrampLineCode[15]) = (UINT32)((((uint64_t)target_func + break_bytes_count) >> 32) & 0xFFFFFFFF);
auto& used = instance->m_tramp_line_used;
auto& tramp_line_base = instance->m_tramp_line;
//复制原先毁掉的字节
RtlCopyMemory(tramp_line_base + used, break_bytes, break_bytes_count);
RtlCopyMemory(tramp_line_base + used + break_bytes_count, TrampLineCode, sizeof(TrampLineCode));
auto ret = tramp_line_base + used;
used += TrampLineBreakBytes + break_bytes_count;
return ret;
}
inline_hook_manager* inline_hook_manager::fn_get_instance()
{
if (instance == 0) {
instance = (inline_hook_manager*)ExAllocatePoolWithTag(NonPagedPool, sizeof(inline_hook_manager), 'HOOK');
instance->m_cur_hook_count = 0;
RtlSecureZeroMemory(instance->m_info, sizeof(HOOK_INFO) * MAX_HOOK_COUNT);
instance->m_tramp_line = (unsigned char*)ExAllocatePoolWithTag(NonPagedPool, PAGE_SIZE, 'Line');
instance->m_tramp_line_used = 0;
}
return instance;
}
能力值:
( LV1,RANK:0 )
9 楼
一月份开始兴冲冲学习,笔记也记在自己的博客了,当时觉得自己能怎么怎么样,结果遇到个坎就一蹶不振了,自从发现自己写的任何驱动代码,在和讲师一模一样也蓝屏的时候,知道这个windows环境自己无论如何也搭建不好,真的很多天睡不着,突然失去了一切心气和手段。谢谢大家还在关注这个帖子,谢谢大家给我希望,我会持续找解决方法下去。
能力值:
( LV1,RANK:0 )
10 楼
njmxye
一月份开始兴冲冲学习,笔记也记在自己的博客了,当时觉得自己能怎么怎么样,结果遇到个坎就一蹶不振了,自从发现自己写的任何驱动代码,在和讲师一模一样也蓝屏的时候,知道这个windows环境自己无论如何也搭 ...
我不清楚能不能再加雪币了,如果能解决,小的在这磕头了,并有答谢!
能力值:
( LV1,RANK:0 )
11 楼
njmxye
那个没开,如图
那个内存完整性是灰的应该是没开,环境:
能力值:
( LV1,RANK:0 )
12 楼
好像跟vt有关,最近再学学
帖子删不了了,大家不要嘲讽我我之前不懂
能力值:
( LV1,RANK:0 )
13 楼
用mdl了,不用wp位了,虽然说我朋友能直接在虚拟机里修改cr0,但是不重要了,我将拥护新王mdl