首页
社区
课程
招聘
7
[原创]打造自己的反汇编引擎——Intel指令编码学习报告(二)
发表于: 2008-10-22 13:28 23557

[原创]打造自己的反汇编引擎——Intel指令编码学习报告(二)

2008-10-22 13:28
23557
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
typedef struct _INSTRUCTION
{
  /* prefixes */
 
  char  RepeatPrefix;
  char  SegmentPrefix;
  char  OperandPrefix;
  char  AddressPrefix;
 
  /* opcode */
 
  unsigned int  Opcode;
 
  /* ModR/M */
 
  char  ModRM;
 
  /* SIB */
 
  char  SIB;
 
  /* Displacement */
 
  unsigned int  Displacement;
 
  /* Immediate */
 
  unsigned int  Immediate;
   
  /* Linear address of this instruction */
 
  unsigned int  LinearAddress;
} INSTRUCTION, *PINSTRUCTION;

[注意]看雪招聘,专注安全领域的专业人才平台!

上传的附件:
收藏
免费 7
支持
分享
赞赏记录
参与人
雪币
留言
时间
Youlor
为你点赞~
2024-1-4 02:12
伟叔叔
为你点赞~
2023-11-24 00:54
QinBeast
为你点赞~
2023-9-4 00:06
PLEBFE
为你点赞~
2023-8-25 02:19
shinratensei
为你点赞~
2023-8-10 00:15
心游尘世外
为你点赞~
2023-7-29 00:28
飘零丶
为你点赞~
2023-7-16 00:27
最新回复 (16)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
抢个沙发继续支持楼主!
2008-10-22 13:42
0
雪    币: 111
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
哇,这么快就有续章了。。。
再顶!
2008-10-22 14:35
0
雪    币: 97
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
常年关注....
2008-10-22 15:05
0
雪    币: 558
活跃值: (43)
能力值: ( LV12,RANK:220 )
在线值:
发帖
回帖
粉丝
5
(3) argument1, argument2, argument3:实际上intel指令最多也只有三个操作码,当只有两个操作码的时候,第一个为目标操作码,第二个为源操作码。

“操作码”改为“操作数”更容易理解些。
当只有两个操作码的时候,第一个为目标操作码,第二个为源操作码,这个也不一定,还受d位的影响。
2008-10-24 10:44
0
雪    币: 558
活跃值: (43)
能力值: ( LV12,RANK:220 )
在线值:
发帖
回帖
粉丝
6
int main()
{
        unsigned int BaseAddress;
        unsigned char *pCurrent;
        unsigned char *pLast;
        INSTRUCTION stInstrcution;
        char strInstrcution[MAX_INSTRUCTION_LEN];

        BaseAddress = 0x401000;
        pCurrent = pLast = Code;

        while(pLast - Code <= sizeof(Code)) //该处地址越界
改为:
        while(pLast - Code < sizeof(Code)-1)刚好
2008-10-24 11:42
0
雪    币: 71
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
学习,很期待能其他领域也可以反汇编
2008-10-24 12:08
0
雪    币: 202
活跃值: (57)
能力值: ( LV9,RANK:370 )
在线值:
发帖
回帖
粉丝
8
这个我知道,这里说的是操作码(还是用操作码吧,因为数总给人一种数字的感觉,至少我容易把操作数和立即数弄混,毕竟操作的对象并不数字),是指汇编格式中的操作码,而不是实际编码过程中的。
比如:mov argument1, argument2
这里位于argument1位置的为目标,而位于argument2位置的为源,这就像是固定了的几个槽,槽里可以随意放东西。这里说的就是固定了的槽的属性,而你说的d位影响的只是放在哪个槽里的问题。

这虽然只是个概念的问题,但是跟反编译器的实现是密切相关的。因为我是这样设计反编译后的汇编指令的:
prefix mnemonic argument1, argument2, argument3
这个格式是固定的(就像一个槽),解析指令的过程中,只要把各个部分填充,按照这个顺序和并起来就行了。所以我在解析过程中一些参数的传递是有考虑的,argument1就是指这个固定的argument1, argument2就是指固定的argument2,解析函数再根据d位,或其他方式来确定,哪个结果存放在哪个目标串中。

当然,这个只是我个人的设计,把指令各个部分分解,分别考虑,再合成,能简化解析过程。
2008-10-24 12:53
0
雪    币: 202
活跃值: (57)
能力值: ( LV9,RANK:370 )
在线值:
发帖
回帖
粉丝
9
[QUOTE=xiep;525423]int main()
{
        unsigned int BaseAddress;
        unsigned char *pCurrent;
        unsigned char *pLast;
        INSTRUCTION stInstrcution;
        char strInstrcution[MAX_IN...[/QUOTE]

这个越界的问题我的确没有考虑好,你说的这个减去1刚刚好也不一定,现在把无法识别的指令都是一个字节,假如以后能解析指令了,数组中的最后一个字节刚好是一个多字节指令(比如5个字节)指令的开始,那么越界的问题还是会存在的。

所以问题的关键是,读指令之前不知道最后一条指令的长度,如果想要防止越界发生,我想可以减去指令的最大长度,sizeof(INSTRUCTION)——也就是大致为目前的INSTRUCTION的大小或者精确的(4bytes(prefix)+3bytes(Opcode)+1byte(ModRM)+1byte(SIB)+4bytes(displacement) +4bytes(immediate) = 17bytes)。
这样才正确,不过code[]的长度也必须大于17bytes才能在其中取到指令。
2008-10-24 13:02
0
雪    币: 558
活跃值: (43)
能力值: ( LV12,RANK:220 )
在线值:
发帖
回帖
粉丝
10
哈哈,个人有个人的习惯,不过Masm汇编经常说操作数操作数,我已经习惯这个称呼了
2008-10-24 13:02
0
雪    币: 321
活跃值: (276)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
11
好文一定要顶。
2008-10-29 10:04
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
尊敬的egogg:
      拜读了您的大作打造自己的反汇编引擎——Intel指令编码学习报告,受益良多。非常感谢您将自己专研的知识与其他人分享。
   我有个疑问,不知道您能不能在百忙之中抽出点时间来辅导一下。关于您文章中提到的opcode中的s位的意思我看懂了。但是还有两个问题请您帮我分析一下
   第一:81,c0,f8  add eax,f8此时cpu是不是把f8当成8来看待?
         83,c0,f8  add eax,f8 此时cpu是不是把f8当成-8来看待?
   第二:如何控制汇编编译器,使它为指令(add eax,正或负的数值)分别生成81,或83的opcode的机器码?并且这样做有意义吗?
2009-1-24 09:32
0
雪    币: 78
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
学习了。。。。。
2010-1-20 16:29
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
必须得顶,好好学习。
2010-7-15 16:12
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
学习了 谢谢楼主分享
2010-12-15 12:10
0
雪    币: 166
活跃值: (380)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
...(1) lable:标签,表面意思就是这条指令的一个指代...
...Svin给出了一个简单的程序,在Ollydgb中当作“白纸”来用...
--------------debug a bug---------------------
"lable" -- label
"Ollydgb"--Ollydbg
2012-12-24 11:17
0
雪    币: 219
活跃值: (878)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
17
mark ~~~
2012-12-24 11:33
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册