作者BitTorrent (螳勃唬)
看板LinuxDev
标题[心得] Read only 与 Write 之外的选择
时间Tue Jan 7 23:17:47 2014
之前发的文 好像被砍掉了...现在来自回
因为学习Kernel路上有遇到些问题,
目前想个法子解决了@@
想做的是 memory某段address中 要侦测这address是否被修改
感谢有大大提供各种不同的方法。
这边来说我想的方法是比较被动的方式。
想法:
把某段memory位置 设定成Read Only 让他进Page fault handler
然後再到Page fault handler 看看memory的值被改成多少?
譬如原本是 a = 5; 设定 &a是Read Only
当modify 的时候会进Page fault handler
但我希望 1 < a < 10
Page fault handler 会检查 a被改成甚麽值 若是 a = 6;
那ok,return回去;若a = 11; 则Page fault。
感谢各位大大赐教~
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 36.224.96.66
1F:→ mayasky:你有看过那篇被删除的讯息吗?我没删,询问另位版主中 01/08 01:52
2F:推 yvb:page fault时, a应该尚未被修改,也尚无法被修改,所以如何检查? 01/08 02:10
3F:→ yvb:如果就这麽return回去,仍会执行同指令,结果再度page fault吧. 01/08 02:13
回Y大的话,a 的确尚未修改。但是进page fault时候会传入error code跟pt_regs
我可以根据error code判定是属於哪一种情况。若a = 6 则 page fault 帮忙
把 a = 5 改成 a=6; 然後修改regs->ip(跳到a=5;这指令後面) 和 return.
※ 编辑: BitTorrent 来自: 36.224.96.66 (01/08 11:28)
4F:推 sivle:我也没删。。。大家分享心得的 我不会删掉才是 01/08 11:38
5F:推 yvb:真奇怪, 有文章被系统暗黑掉了... @.@ 01/08 12:34
6F:→ yvb:判断page fault後续状况的问题, 我以为会相当复杂, 而且会是 01/08 12:36
7F:→ yvb: machine dependant; 最主要是要分析 ip 指向的指令做什麽... 01/08 12:37
8F:→ yvb:比方 x86 的 mov 指令, 多种定址法的指令长度都不尽相同... 01/08 12:42
9F:→ yvb:不知原PO是实作在什麽平台上, 有什麽kernel函式协助分析指令, 01/08 12:49
10F:→ yvb:或是我想太多, 其实光就 pt_regs 就足以判断? 01/08 12:51
我作在x86, 有mov有分 movl , movw 等等
我举个例子
idt_table2[i].offset_low = 0xbeef;
77: 44 89 e6 mov %r12d,%esi
7a: 66 c7 03 ef be movw $0xbeef,(%rbx)
7f: 41 b8 ef be 00 00 mov $0xbeef,%r8d
85: 48 c7 c7 00 00 00 00 mov $0x0,%rdi
(unsigned long )((char *)(regs->ip+=5));
*(unsigned long *)address = value; //modified value
或者
idt_table2[i].offset_high = 0x12345678
7b: c7 43 08 78 56 34 12 movl $0x12345678,0x8(%rbx)
82: ba 78 56 34 12 mov $0x12345678,%edx
87: 48 c7 c7 00 00 00 00 mov $0x0,%rdi
8e: 31 c0 xor %eax,%eax
(unsigned long )((char *)(regs->ip+=7)); //由c7 43 数到ba共7个
*(unsigned long *)address = *(ggyy+1); //modified value
※ 编辑: BitTorrent 来自: 36.224.96.66 (01/08 16:03)
11F:推 yvb:还有一些问题: (1) 造成 page fault 的是 userspace process 01/09 02:08
12F:→ yvb: 还是 kernel thread? (2) handler改值前後, 需要切换 RO 吗? 01/09 02:09
13F:→ yvb: (3) 除了 mov, 其它如 add, xchg 等又是如何? 01/09 02:15
14F:→ yvb:关於 x86 指令集分析的处理, 不知原PO是自行包办, 01/09 02:19
15F:→ yvb: 或是如何叫用 kernel 哪些函式来协助完成? 01/09 02:20
16F:推 yvb:问题 (1) 应改为 造成 page fault 的是 kernel thread, 01/09 12:49
17F:→ yvb: process 的 user space 或 kernel space ? 01/09 12:49
18F:推 yvb:此外还有更复杂的情况, 比方 a 为 int, 那麽 01/09 12:56
19F:→ yvb:*(((char *)&a)+2)=1 或是 *(int *)(((char *)&a)-2)=-1 之类. 01/09 12:58
20F:→ yvb:当然, 如果一堆变数 b, c, ... 都和 a 同 page 时, 那效能... 01/09 13:02
(1) 一个system call by user mode
(2) 需要切换 RO
(3) 我都是objdump去看他,所以再复杂的情况,应该都可找出关键的assembly code
same page 我到没有想过~~
※ 编辑: BitTorrent 来自: 114.25.193.147 (03/17 11:01)