首页
论坛
课程
招聘
[求助]修改汇编指令实际操作
2014-1-7 16:14 7435

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

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

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

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

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

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

【公告】【iPhone 13、ipad、iWatch】11月15日中午12:00,看雪·众安 2021 KCTF秋季赛 正式开赛【攻击篇】!!!文末有惊喜~

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

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
有点乱,不知道能不能说通
雪    币: 218
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
誓言剑 活跃值 2014-1-8 10:41
14
0
完全不理解你这么做的意义,为什么非要是在缺页时修改指令执行效果而不是在所有时候
而且缺页异常是由内核处理的,永远不进入Ring 3

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


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