阅读:1609回复:3
关于《天书夜读》的一个疑问。
首先声明,我是一个菜鸟,在看天书以前没有学过汇编。所以有错误希望大家谅解。
在看到天书夜读中的Inline Hook实现方法后,自己也想试一试,就做了一个简单的HOOK。发现了一个疑问。 size_t length,total_length = 0; struct xde_instr code_instr={0}; byte_t *start_address = (byte_t *)MmGetSystemRoutineAddress(…); while(total_length <5) //注意:由于我的跳转指令只有5字节,所以这里把7改成了5 { length = xde_disasm(start_address ,&code_instr); // 反汇编一条指令 <<<<<<<<<<<<<<<,, if(length == 0) // 如果有指令解析失败,就直接返回失败 return false; total_length += length; // 计算已经反汇编的指令的总长度 } 这些代码得到了应该拷贝出的代码长度,在以<<<<<<<<<<<<<,标出的那行中,每次反汇编的开始地址都不变,得到的长度也一直一样!做出HOOK来很可能出问题。 我HOOK 了NtLoadDriver函数(XPSP2)。这个函数开头是这样的。 lkd> u NtLoadDriver nt!NtLoadDriver: 805a207a 6a54 push 54h 805a207c 68b0775080 push offset nt!GUID_DOCK_INTERFACE+0x52c (805077b0) 805a2081 e8b5e3f3ff call nt!_SEH_prolog (804e043b) 805a2086 33f6 xor esi,esi 805a2088 33db xor ebx,ebx 805a208a 895de4 mov dword ptr [ebp-1Ch],ebx 805a208d 64a124010000 mov eax,dword ptr fs:[00000124h] 805a2093 8945dc mov dword ptr [ebp-24h],eax 可见第一个指令长为2,而第二条指令长为5,应该COPY出7字节的代码。但是我的跳转指令(E9)是5个字节,按照天书上的代码,计算出的total_length=2+2+2=6!少了一个字节,结果JMP函数全部出错,直接蓝屏。晕倒~~ 我觉得上面那行代码应该这样写: length=xde_disasm((unsigned char*)(start_address+total_length),&code_instr); 改后HOOK正常。无蓝屏现象。 |
|
沙发#
发布于:2007-08-14 17:20
也许啰嗦了一些,直接贴代码更好点。。
|
|
板凳#
发布于:2007-08-14 23:42
当然要加上TOTALLENGTH,不然永远在原地跑,书里问题比较多,所以只有自己捉摸才有进步。。。。。。
|
|
|
地板#
发布于:2007-08-15 12:05
|
|