能力值:
( LV2,RANK:10 )
|
-
-
2 楼
怎么没人回贴呀,顶一下!
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
貌似没人回答这个比较难以描述的问题,偶通过查找资料,有所感悟,现写出来,麻烦大家给判断下对还是错:
举例:
MOV AX,1234 对应的机器码为:B8 34 12
我贴子里说了,"所有的Zw*函数都开始于MOV eax, ULONG"
所以Zw函数的第0个字节为B8(偶知道C/C++计数由0起始),而第一个字节起始的一个ULONG长度的数据,就是我们要找的ULONG了:), 所以才有了那个两宏 。
请问我分析的对不对?
|
能力值:
(RANK:300 )
|
-
-
4 楼
16位的指令集?
32位的是不是在前面加前缀66啊?
|
能力值:
(RANK:260 )
|
-
-
5 楼
机器指令被按照16位程序还是32位程序解释,取决于CS选择子指向的段描述符中的属性位。
看一下GDT、LDT等相关资料,注意Descriptor的定义,其中有一个D/B的位就是干这个的。
查指令表,0xB8是“mov eAX,Iv”
对16位代码,mov ax, 0x1234机器码是0xb8,0x34,0x12(注意little endian的字节顺序)
对32位代码,mov eax,0x12345678机器码是0xb8,0x78,0x56,0x34,0x12
原来的问题中,只要知道mov eAx,Iv这条指令的结构是 “主操作码+立即数”即可得出*(PULONG)((PUCHAR)_func+1)这个表示方法。
补充一下,狐狸说的0x66前缀叫做“操作数大小切换前缀(OprandSizePrefix)”,用来在16位代码中临时执行操作数为32位的指令,或在32位代码中临时执行操作数大小为16位的指令。比如假设目前是在一个16位的段中执行代码,需要临时访问32位的EAX寄存器,那么可以在0xB8前面加上0x66,处理器会将其译码成为一个32位指令,所以会使用EAX寄存器,同时会从0xB8读取4个字节为立即数,而不是(本来的)2个字节。
|
能力值:
( LV9,RANK:180 )
|
-
-
6 楼
这些方法在以后的OS不知适不适用?
|
能力值:
(RANK:260 )
|
-
-
7 楼
OPCODE HACK本来就是硬编码的,灵活性极差。
如果想要通用一些,那就必须用反汇编引擎来分析代码了。
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
^^ 感谢各位大虾的指点!特别是"书呆彭"讲的很详细透彻,小弟收藏了,还请大家以后继续关照
|
|
|