首页
社区
课程
招聘
[求助]修改汇编指令实际操作
发表于: 2014-1-7 16:14 8816

[求助]修改汇编指令实际操作

2014-1-7 16:14
8816
RT。
假设0x401000 地址的指令是E8 A ;call A

能不能内存中的指令的确是E8 A
但是实际上送到CPU执行单元的是call B

因为无论A地址是否缺页,系统应该会检测这个地址,并且换页进来,这样我们是不是就有修改这个指令的办法了

求大神们指教!!
要的结果是,不修改汇编代码,修改实际操作
例如:
内存中指令是call A
实际上是call B

再例如:
内存中指令是mov eax,3
执行完了之后 eax等于0

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 218
活跃值: (10)
能力值: ( 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
2014-1-8 00:15
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
个人观点:办不到。
2014-1-8 00:38
0
雪    币: 297
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
楼主发现了能让CPU凌乱的神器?
2014-1-8 01:50
0
雪    币: 209
活跃值: (143)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
管理进程调试目标进程,不断写入0xcc,达到单步运行的效果,适时通过WriteProcessMemory来修改你想要修改的指令
2014-1-8 09:04
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
单步直接用单步标志的好不好...哪有像你这样单步的
而且你这样就修改了指令了,楼主说了是"不修改汇编代码,修改实际操作",你根本说的不是楼主想要的
2014-1-8 10:00
0
雪    币: 72
活跃值: (74)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
ztj
7
你这样修改了内存了
2014-1-8 10:09
0
雪    币: 72
活跃值: (74)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
ztj
8
你这样修改了内存
2014-1-8 10:10
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我修改了我2L的答案,你再瞧瞧看?
2014-1-8 10:13
0
雪    币: 72
活跃值: (74)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
ztj
10
这个是在R3操作的,我想要的是更底层的,修改cpu指令寄存器里的,
再说硬件断点只能4个。
挂钩内存换页行不行呢?
估计是我异想天开了
2014-1-8 10:13
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
更底层你就真的只能用Hypervisor了,指令缓存不受你控制
硬件断点不能用你还可以用内存断点来实现:设置不可执行,异常处理里检查是不是指定地址:是就按上面的方法模拟,不是就恢复页面保护属性,单步,再次设置不可执行
不过页面保护好像不是特别稳定,我以前想利用页面保护做跨平台的API Hook的时候有一些奇怪的问题
2014-1-8 10:18
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我搞不懂内存换页跟这个有什么关系.你能解释一下你认为的内存换页是什么么
2014-1-8 10:19
0
雪    币: 72
活跃值: (74)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
ztj
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
有点乱,不知道能不能说通
2014-1-8 10:30
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
完全不理解你这么做的意义,为什么非要是在缺页时修改指令执行效果而不是在所有时候
而且缺页异常是由内核处理的,永远不进入Ring 3

最终目的是让有些地方访问的是 mov eax,3,有些 mov eax,0


如果你说的访问是读取,那么你可以通过设置页面不可读属性,然后从异常的Eip判断
如果你说的访问是执行,那么不可能.x86下call/jmp一处不可执行代码是不会产生异常的,所以你永远也无法知道是谁执行了这一块代码(尤其是jmp/jcc的情况下)
2014-1-8 10:41
0
游客
登录 | 注册 方可回帖
返回
//