能力值:
( LV2,RANK:10 )
|
-
-
2 楼
如果楼主真想实现这方面的功能,可以用虚拟化技术写一个Hypervisor,然后你就可以实现你主楼所希望的功能
回复5#的时候我想到了,用硬件断点在你想要的指令下断,然后在异常处理里手动模拟指令执行,最后EXCEPTION_CONTINUE_EXECUTION
最开始只是在想如何"修改"指令操作,忘了可以这么做了
//call a
ExceptionInfo->ContextRecord->Esp -= sizeof(SIZE_T);
*(SIZE_T *)(ExceptionInfo->ContextRecord->Esp) = ExceptionInfo->ContextRecord->Eip + 5;
ExceptionInfo->ContextRecord->Eip = B;
//mov eax,3
ExceptionInfo->ContextRecord->Eax = 0;
ExceptionInfo->ContextRecord->Eip += 5; //B8 03 00 00 00
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
个人观点:办不到。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
楼主发现了能让CPU凌乱的神器?
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
管理进程调试目标进程,不断写入0xcc,达到单步运行的效果,适时通过WriteProcessMemory来修改你想要修改的指令
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
单步直接用单步标志的好不好...哪有像你这样单步的
而且你这样就修改了指令了,楼主说了是"不修改汇编代码,修改实际操作",你根本说的不是楼主想要的
|
能力值:
( LV3,RANK:20 )
|
-
-
7 楼
你这样修改了内存了
|
能力值:
( LV3,RANK:20 )
|
-
-
8 楼
你这样修改了内存
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
我修改了我2L的答案,你再瞧瞧看?
|
能力值:
( LV3,RANK:20 )
|
-
-
10 楼
这个是在R3操作的,我想要的是更底层的,修改cpu指令寄存器里的,
再说硬件断点只能4个。
挂钩内存换页行不行呢?
估计是我异想天开了
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
更底层你就真的只能用Hypervisor了,指令缓存不受你控制
硬件断点不能用你还可以用内存断点来实现:设置不可执行,异常处理里检查是不是指定地址:是就按上面的方法模拟,不是就恢复页面保护属性,单步,再次设置不可执行
不过页面保护好像不是特别稳定,我以前想利用页面保护做跨平台的API Hook的时候有一些奇怪的问题
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
我搞不懂内存换页跟这个有什么关系.你能解释一下你认为的内存换页是什么么
|
能力值:
( LV3,RANK:20 )
|
-
-
13 楼
假设
401000 XXXX
.....
401054 mov eax,3
.......
402000 XXXX
现在401000~402000不在内存页中,访问会抛出异常,截获异常,根据情况判断是否把401054 修改为mov eax,0
最终目的是让有些地方访问的是 mov eax,3,有些 mov eax,0
或者读内存是 mov eax,3,实际上执行是 mov eax,0
有点乱,不知道能不能说通
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
完全不理解你这么做的意义,为什么非要是在缺页时修改指令执行效果而不是在所有时候
而且缺页异常是由内核处理的,永远不进入Ring 3
最终目的是让有些地方访问的是 mov eax,3,有些 mov eax,0
如果你说的访问是读取,那么你可以通过设置页面不可读属性,然后从异常的Eip判断
如果你说的访问是执行,那么不可能.x86下call/jmp一处不可执行代码是不会产生异常的,所以你永远也无法知道是谁执行了这一块代码(尤其是jmp/jcc的情况下)
|
|
|