首页
社区
课程
招聘
[已解决] [求助]inline hook 多线程修改函数头部指令 生成jumper 跳到自己写的hook代码 50.00雪花
发表于: 2021-3-3 14:02 5102

[已解决] [求助]inline hook 多线程修改函数头部指令 生成jumper 跳到自己写的hook代码 50.00雪花

2021-3-3 14:02
5102

有人说可以把其他线程全部挂起来,但是我看帖子有人说可以直接lock 写入jumper的指令,感觉比暂停线程的方法简单,但是我想了下这里应该有个前提吧 那就是cpu不是先读取函数头部的指令吧,如果是先读取函数头部的指令,是否锁住内存就不知道了 ?如果cpu读取指令的时候,不锁住eip指向的内存,这个过程不是原子性的,读到一半,然后我们的写入jumper的指令就开始执行了啊  感觉这里好迷糊


可以加一下我的qq 2014178093吗 我这个有很大的疑惑 想探讨一下 就是lock锁住内存  但是需要2边的代码同时锁才不会出问题啊  比如2个线程同时inc [mem],如果只有其中一个线程的执行代码是lock inc [mem],另一边是inc [mem],还是会出现读写的问题,这种情况不就是和只有lock 锁住在函数头部写入jumper的指令,但是cpu读取指令的时候是否被锁住 我就不知道了  


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 246
活跃值: (4427)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
2
lock 的目的就是为了保证 核从内存拿数据到缓存,将缓存的数据增加一,再把缓存写回内存的三个步骤不被另一个核打断。
你用两个线程,执行两份lock当然没问题,都是独立执行并且不被打断。
假如是这个情况,一个加lock,一个没加lock,A核准备执行,缓存了mem,假如说他刚好把缓存里的数加了1,但是没写回主存,这时候内存里还是没变,但是B核将mem缓存到自己的cache里,执行了那个加了lock的inc,这时候就会产生缓存锁,当这个线程加完的时候,将一开始的那个核,cache变为I状态,置为无效,但是B核还没写入主存。如果这时候A核开始执行,他的缓存无效,就会去拿B核cache里的数据,然后写入主存,如果是B核率先写入主存,A核后写入,也是拿B核的cache,最终都等于少inc了一
2021-3-3 21:30
0
雪    币: 8
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
同时lock一块内存才有效,一个核lock一个核不lock的情况下,相当于没有lock,如果是对于原子操作的数据这些lock是必须的,但是对于inline hook来说,你担心有点多余了,直接内存拷贝就几个字节而已,对于cpu刚好执行到被hook的那几条指令中间的几率几乎不存在,因为我平常inlinehook写的很多都是用内存拷贝,从没有出过一次蓝屏,我还是在内核hook的,如果实在不放心可以用 cmpxchg16b指令,这个是cpu提供的可以原子操作16个字节的指令,对应windows 宏 InterlockedCompareExchange128
2021-4-8 04:00
0
雪    币: 7
活跃值: (195)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
楼主你很幸运,最近这些天我也在思考这个问题而不得答案。结果还是windows核心编程中找到了解答,原文是这样:
  没有任何互锁函数仅仅负责对值进行读取操作(而不改变这个值) ,因为这样的函数根本是不需要的。如果线程只是试图读取值的内容,而这个值始终都由互锁函数来修改,那么被读取的值总是一个很好的值。虽然你不知道你读取的是原始值还是更新值,但是你知道它是这两个值中的一个。对于大多数应用程序来说,这一点很重要。
悬赏拿来吧
2021-4-18 23:10
2
雪    币: 737
活跃值: (513)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
yaoyuanzhi 你加我qq2014178093吧我有问题和你详细谈呢
2021-4-19 17:19
0
游客
登录 | 注册 方可回帖
返回
//