首页
论坛
课程
招聘
未解决 [求助]inline hook 多线程修改函数头部指令 生成jumper 跳到自己写的hook代码 50.00元
2021-3-3 14:02 2118

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

2021-3-3 14:02
2118

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


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


[看雪官方培训] Unicorn Trace还原Ollvm算法!《安卓高级研修班》2021年6月班开始招生!!

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