CN1900910A - 二进制翻译中经由跳转表的多目标分支语句的识别方法 - Google Patents

二进制翻译中经由跳转表的多目标分支语句的识别方法 Download PDF

Info

Publication number
CN1900910A
CN1900910A CN 200510085509 CN200510085509A CN1900910A CN 1900910 A CN1900910 A CN 1900910A CN 200510085509 CN200510085509 CN 200510085509 CN 200510085509 A CN200510085509 A CN 200510085509A CN 1900910 A CN1900910 A CN 1900910A
Authority
CN
China
Prior art keywords
node
grapheme
code
jump list
jump
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN 200510085509
Other languages
English (en)
Other versions
CN100377089C (zh
Inventor
陈龙
唐锋
谢海斌
杨浩
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Institute of Computing Technology of CAS
Original Assignee
Institute of Computing Technology of CAS
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Institute of Computing Technology of CAS filed Critical Institute of Computing Technology of CAS
Priority to CNB2005100855091A priority Critical patent/CN100377089C/zh
Publication of CN1900910A publication Critical patent/CN1900910A/zh
Application granted granted Critical
Publication of CN100377089C publication Critical patent/CN100377089C/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

本发明公开了一种二进制翻译中经由跳转表的多目标分支语句的识别方法,包括:1)把要识别的语义转化为语义图,该语义图作为模板图;2)选择待识别语义的代码片段;3)将代码片段按照语义构建语义图;4)将步骤3)构建出的语义图和步骤1)得到的模板图做匹配,若匹配成功,则识别出语义,执行下一步,否则所选择的代码片段语义识别失败;5)获取跳转表的地址和大小,进而得到表项中记录的分支目标地址,标记其为有效代码。本发明的优点在于:扩大了二进制翻译中静态翻译阶段的翻译覆盖率,提高了代码的执行效率;可以应用于多种平台下的二进制文件分析中,适用范围广;在解决识别经由跳转表的多目标分支语句问题上算法简练,易于实现。

Description

二进制翻译中经由跳转表的多目标分支语句的识别方法
技术领域
本发明涉及计算机领域内的翻译技术,特别涉及到静态二进制翻译中经由跳转表的多目标分支语句的识别。
背景技术
二进制翻译技术是目前解决软件移植问题的一个研究热点,能将现有的软件移植到新开发的处理器上执行,对促进处理器体系结构的发展和国产微处理器的推广具有重要意义。
对于采用静态方式或动静结合方式进行的二进制翻译系统来说,静态翻译阶段需要对被翻译的二进制文件进行分析和翻译,而文件中并非所有的数据都是有实际意义的,其中可能包括为了满足页对齐要求而引入的一些填充数据。在二进制翻译时,静态翻译阶段需要尽可能多地对有效代码进行识别,并对其进行翻译和优化,以形成性能较好的目标机的二进制代码(静态本地码)。但静态翻译阶段只有确定可以到达的代码是有效的,比如各个函数的入口地址处的指令(记录在ELF文件的符号表中),跳转指令的目标地址处的指令,分支指令的下一条指令(fall through)以及目标地址处的指令(target)等等,这些都是可以静态时分析出来的。但是对于间接跳转和间接调用指令(如jmp*%eax,call*%eax),目标地址需要在动态运行时从寄存器或存储单元中取出,静态翻译阶段无法得到,从而无法对他们的目标地址处的有效代码进行翻译。
间接跳转指令,如jmp*%eax,代表了一种多目标分支语句,即跳转的目标有多个,具体跳转到哪个目标在动态运行阶段确定。间接跳转指令的典型代表是高级语言中的switch-case语句,switch-case语句在实际的程序中大量存在,如果能在静态翻译阶段把所有的跳转目标处的代码识别出来并进行翻译将有助于提高代码的执行效率。
以C语言为例,典型的switch-case语句可表达为:
                switch(expr)
                {
                   case value1:
                         code1;break;
                   case value2:
                         code2;break;
                   case value3:
                         code3;break;
                   case......
                   default:
                         code_default;
                }
其中,<expr>称为待匹配的表达式,<value1>,<value2>,<value3>为候选值,当<expr>的值与某一个候选值相等时,执行相应目标处的代码(即<code1>,<code2>或<code3>)。
编译器对switch-case语句的实现主要有以下几种方式:
1、顺序比较表达式的值和每一个候选值,若表达式的值与某一个候选值相等,转到相应的分支入口处。该方式常用于候选值数目较少的情况下。编译出的目标码结构为:
                cmp    value1,expr
                je     code1_addr
                cmp    value2,expr
                je     code2_addr
                cmp    value3,expr
                je     code3_addr
                jmp    code_default_addr
                code1_addr:code1
                code2_addr:code2
                code3_addr:code3
                code_default_addr:code_default
2、将候选值组织成搜索树的结构,提高查找速度(如折半查找)。常用于候选值数目较多且分布较为稀疏的情况下。对于上例,若value1<value2<value3,则先比较<expr>与<value2>,然后比较<expr>与<value1>以及<expr>与<value3>。
3、使用跳转表。跳转表中的每个表项存放的是一个候选值对应的分支入口地址,使用跳转表时,将表达式<expr>的值转化成跳转表的索引,从而可以立即找到相应的表项。常用于候选值数目较多且分布较为集中的情况下。它的目标码结构为:index←f(expr);            注释:将<expr>的值转化成跳转表的索引jmp*Table_Base(index×4);  注释:Table_Base是跳转表的起始地址,每个表项占4个字节,则Table_Base+index×4为跳转表第index项的地址。
如下面的表1所示,为跳转表的一个示例,
      表1
  code1_addr
  code2_addr
  code_default_addr
  code3_addr
  code_default_addr
Table_Base
从上表可以看到,跳转表不一定是按每个分支代码的入口地址顺序排放,其间某个表项可能是code_default代码的地址,因为value的分布不一定是连续的,在上表中,<value2>和<value3>就不连续。
4、使用哈希(hash)表。hash表的每个表项也是存放一个候选值对应的分支入口地址。通过计算表达式<expr>的hash值,也可以较快地得到相应的表项。该方法常用于候选值数目较多且分布稀疏的情况。在实际使用中,该方法使用较少。
对于前两种方式,很容易从指令中得到跳转的目标地址,进而可以对code1,code2,code3,code_default这些代码进行识别和翻译,但对于第三种方式,一般需要通过一条间接跳转指令才能跳到相应的表项处,在静态翻译阶段很难直接得到指令的目标地址,不利于翻译效率的提高。第四种方式使用的较少,本发明不做处理。
发明内容
本发明的目的是克服现有技术在静态翻译阶段很难直接得到指令目标地址的缺点,提供一种二进制翻译中经由跳转表的多目标分支语句的识别方法,实现在静态翻译阶段对跳转表的位置和内容的分析,从而获得各个专业分支的目标地址。
为了实现上述目的,本发明提供了一种二进制翻译中经由跳转表的多目标分支语句的识别方法,包括:
1)把要识别的语义转化为语义图,把转化后的语义图作为模板图;
2)选择待识别语义的代码片段;
3)将步骤2)选择出的代码片段按照语义构建语义图;
4)将步骤3)构建出的语义图和步骤1)得到的模板图做匹配,若匹配成功,则识别出语义,执行下一步,否则所选择的代码片段语义识别失败;
5)获取跳转表的地址和大小,进而得到表项中记录的分支目标地址,标记其为有效代码。
上述技术方案中,所述的步骤2)包括:
2-1、在代码中查找间接跳转指令,当遇到该指令时,向前查看一定数量的指令;
2-2、在向前查找的指令中,看是否有比较指令,若有比较指令,则将比较指令与间接跳转指令之间的代码段作为要识别的代码片段;若没有找到比较指令,则不做处理。
上述技术方案中,所述的步骤3)中,在构建语义图时需要引入一个记录操作数的队列,该队列记录语义图构建过程中所有已经出现过的操作数以及该操作数的最新值在语义图中对应的节点。
上述技术方案中,所述的步骤4)中,对待检测的语义图和模版图进行同步的遍历,检测两个图中对应位置的节点是否相匹配,两图中所有对应位置的节点均匹配则认为两个图是匹配的。
上述技术方案中,所述的步骤4)中,将语义图和模板图的节点分为三种类型:分支节点、运算符节点、原子操作数节点,分支节点视为整个语义图的根节点,从该节点开始对语义图进行匹配检测,对于不同类型的节点,分别按不同的规则进行匹配检测:
4-1、分支节点,依次检测它的三棵子树是否与模版匹配;
4-2、运算符节点,先检测其内容是否与模版节点相同,检测成功则递归检测左右两棵子树;
4-3、原子操作数节点,为了便于检测两个原子操作数节点是否匹配,需要在模版图上附加一些匹配规则的信息,即:任意匹配、严格匹配、不严格匹配;任意匹配表示被检测图中此处只要有节点即可,节点的内容可任意;严格匹配表示此位置处节点的类型和取值均须与模版节点相同;不严格匹配表示此位置的节点只需类型和模版图的节点相同,取值可以不同。
本发明的优点在于:
1、本发明的二进制翻译中经由跳转表的多目标分支语句的识别方法扩大了二进制翻译中静态翻译阶段的翻译覆盖率,提高了代码的执行效率。
2、本发明的二进制翻译中经由跳转表的多目标分支语句的识别方法可以应用于多种平台下的二进制文件分析中,适用范围广。
3、本发明方法在解决识别经由跳转表的多目标分支语句问题上算法简练,易于实现。
附图说明
图1为本发明的二进制翻译中经由跳转表的多目标分支语句的识别方法的实施例中所描述的语义1的语义图;
图2为本发明的二进制翻译中经由跳转表的多目标分支语句的识别方法的实施例中所描述的语义2的语义图;
图3为根据例1中的代码所创建的语义图;
图4为根据例3中的代码所创建的语义图;
图5为语义1附加匹配规则后的语义图;
图6为语义2附加匹配规则后的语义图;
图7为本发明的二进制翻译中经由跳转表的多目标分支语句的识别方法的流程图。
具体实施方式
下面结合附图和具体实施方式对本发明做进一步描述。
在一个实施例中,以Linux/x86平台下的二进制文件作为被翻译对象,但本方法可以推广到其它平台下的二进制翻译系统中。
静态二进制翻译的对象有可执行文件和共享库文件。在可执行文件中,以跳转表方式实现的多分支语句的代码基本遵循以下三种模式:
●模式1:
cmp   $num,oprand    ;<$num>是个立即数,标识跳转表的表项数目,<oprand>
                      ;是一个操作数,可能是寄存器操作数,也可能是存储器操作数,
                      ;存放<expr>的值对应跳转表中第几个表项,即索引index,其
                      ;中<expr>是switch-case语句中待匹配的表达式。
ja    code_default    ;<code_default>是个label,标记switch-case语句的default代
                      ;码入口。如果<oprand>比<$num>大,表明超出跳转表所包含
                      ;的取值范围,那么跳到code_default处执行。
mov    oprand,%reg    ;将index放到一个寄存器中
mov    Table_Base(,%reg,4),%eax  ;<Table_Base>是跳转表的起始地址,Table_Base+
                        ;%reg×4就是匹配的跳转表项的地址(每个表项占4个字节),
                        ;将此地址放至寄存器%eax中。
jmp    *%eax           ;取出表项中记录的目标码地址,将控制转移过去。
●模式2:
cmpl  $num,oprand   ;同模式1
ja    code_default   ;同模式1
mov   oprand,%eax  ;同模式1
shl   $0x2,%eax    ;通过左移2位实现%eax×4
mov   Table_Base(%eax),%eax ;同模式1,此时Table_Base+%eax是跳转表项地址
jmp    *%eax        ;同模式1
●模式3:较优化的形式
cmp   $num,%reg    ;%reg中存放index
ja    code_default   ;同模式1
jmp   *Table_Base(,%reg,4);Table_Base+%reg×4为匹配的跳转表表项地址,取出此
                     ;处存放的分支目标地址,将控制转移过去
模式3与模式1和2的一个区别是不通过%eax进行寄存器间接跳转,而使用存储器间接跳转的寻址方式。
例1、下面是SPEC2000中eon反汇编出的一块代码段(gcc-O0编译),它符合模式2:
80ab3bd:83 7d fc 06           cmpl  $0x6,0xfffffffc(%ebp)
80ab3c1:77 65                 ja    80ab428<category_to_name+0x74>
80ab3c3;8b 45 fc              mov   0xfffffffc(%ebp),%eax
80ab3c6:89 c0                 mov   %eax,%eax
80ab3c8:c1 e0 02              shl   $0x2,%eax
80ab3cb:8b 80 b0 27 13 08     mov   0x81327b0(%eax),%eax
80ab3d1:ff e0                 jmp   *%eax
通过上面几种模式以及列举的例子可以发现,虽然都是经由跳转表实现的多目标分支语句,但可执行文件在二进制代码中的表现形式还是多样的,比如:操作数的寻址方式不一样(寄存器间接跳转或存储器间接跳转)、乘4的实现方式不一样(左移两位或采用SIB寻址方式的操作数),实际的例子中还可能存在一些毫不相关的指令,比如mov %eax,%eax等等。因此简单地通过指令的匹配来判断是否符合模式是极其复杂的,但通过进一步分析可以知道,这些模式符合一个共同的语义,即:
        if(index>$num)
         goto code_default;
        else
            jmp*(Table_Base+index×4);(语义1)
如果能从实际的代码段中识别出它们表达的这种语义,将是最为准确和合理的。
在共享库文件中,经由跳转表的多目标分支语句编译出代码段遵循另一个语义:
            if(index>$num)
             goto code_default;
            else
            jmp*(%ebx-*(%ebx+disp+index×4));(语义2)
例2、libc.so.6中的一段代码:
1cb0a:83 fa 08              cmp  $0x8,%edx
1cb0d:77 43                 ja   1cb52<iconv+0xde>
1cb0f:8b 8c 93 c8 69 ee ff  mov  0xffee69c8(%ebx,%edx,4),%ecx
1cb16:89 d8                 mov  %ebx,%eax
1cb18:29 c8                 sub  %ecx,%eax
1cb1a:ff e0                 jmp  *%eax
对于共享库文件(so文件),%ebx是个比较特殊的寄存器,它存放一个比较固定的值(存放libc.so的GOT表的起始地址),库中的代码往往以这个值作为一个基准来定位其它的地址,使得这样的代码是与文件的装入地址无关的。在上面示例的代码片段中,跳转表的基地址是%ebx+0xffee69c8(实际上是%ebx减去一个偏移量),所以跳转表在内存中的地址为GOT_Addr+Disp=(File_Base+GOT_Offset)+Disp,其中File_Base是共享库文件装入到内存中的基地址,可在文件装入时确定,GOT_Offset是GOT表相对于文件起始地址的偏移量,可以从文件的Section Headers中读出(具体可参见ELF手册),Disp是跳转表地址相对于%ebx存放地址的一个偏移量,从指令操作数中得出。因此只要能识别出代码片段符合语义2,就能找到跳转表的地址,进而挖掘出各个分支目标处的代码段。
如图7所示,本发明的二进制翻译中经由跳转表的多目标分支语句的识别方法包括:
步骤10、把要识别的语义转化为语义图,转化后的语义图可作为模板。前述的语义1转化成语义图后如图1所示,前述的语义2转化成语义图后如图2所示。其中,菱形节点表示条件转移,方框节点表示运算符,椭圆节点表示原子操作数,index用虚线框表示此处可能为单个节点,也可能为多个节点形成的一棵子树。语义转化为语义图的方法是成熟的现有技术,本实施例中不再对该方法的具体实现进行说明,在具体实现时,语义图的表现形式也可能是有差异的,图1和图2是一种表现方式,相关技术人员在再现本发明时可根据具体的语义特征以及所要识别的代码的具体特征来的构造语义图,只要所构造的语义图能完整并最简洁地表达所需的语义即可。
步骤20、选择要识别语义的代码片段。经过对二进制文件的分析,发现若要满足上述的语义1或语义2,一个重要特征就是代码片段中至少存在一条比较指令(cmp)和间接跳转指令(jmp*)。因此在选取代码片断时首先要符合这个特征。选择代码片段的具体实现方法如下。
步骤21、在代码中查找间接跳转指令(jmp*),当遇到该指令时,向前查看一定数量的指令,此处所述的一定数量可根据实际情况确定,如10条指令。
步骤22、在向前查找的指令中,看是否有比较指令(cmp指令),若有比较指令,则将比较指令与间接跳转指令之间的代码段作为要识别的代码片段,执行步骤30;若没有找到比较指令,则认为这些指令不具备所需语义的基本特征,对这些指令不做处理。
步骤30、为所选择的代码片段构建语义图。语义图的作用是表达指令或代码片断的语义。构建语义图需要引入一个记录操作数的队列,它记录语义图构建过程中所有已经出现过的操作数以及该操作数的最新值在语义图中对应的节点。例如,在指令i中涉及操作数a,则在语义图中为a建立一个节点n1,同时在操作数队列中记录下a及其对应的n1,然后在指令j中a被重新定值,使其在语义图中对应新的节点n2,则修改操作数队列中a对应的节点为n2。在具体的语义图中还需要包含一些指令的特征,如操作码,操作数寻址方式等,但语义图可以方便地应用于多种不同的指令级体系结构(ISA)下。下面结合例1中的一段代码,对语义图的构建过程做详细说明。
对每一条指令依次处理,根据操作数和操作码构造语义图。
a)在代码段中,对cmpl  $0x6,0xfffffffc(%ebp)进行处理,此处的0xfffffffc(%ebp)表示把%ebp寄存器的内容加上0xfffffffc得到的值作为内存地址,取此地址的内存单元的内容作为操作数。创建如表2所示的操作数队列和如图3(a)所示的语义图,在表2中分别记录了3个操作数$0x6、0xfffffffc、%ebp所对应的节点。表中的粗体字表示了队列中的修改项,下面各表相同。
                        表2
  操作数   $0x6   %ebp   0xfffffffc(%ebp)
  node   n3   n7   n4
在图3(a)中,菱形节点表示条件转移,方框节点表示运算符,椭圆节点表示操作数,其中,转移节点中的布尔表达式画在菱形外,布尔运算符先确定为“>”,但是左右操作数的顺序暂不确定,等到后面遇到JA或JLE指令后再定,转移节点的真出口和假出口也待填。
b)对代码行ja 80ab428<category_to_name+0x74>进行处理。在a)中,如果判断的结果为真,执行本步骤。在操作数队列中添加操作数80ab428,改变后的操作数队列如表3所示。
                    表3
  操作数   $6   %ebp   0xfffffffc(%ebp)   $80ab428
  node   n3   n7   n4   n8
相应的,对语义图做进一步修改,修改后的图如图3(b)所示,与图3(a)相比,布尔操作数的顺序和转移条件为真时的目标地址皆可确定。
c)对代码行mov  0xfffffffc(%ebp),%eax进行处理。在该代码行中,0xfffffffc(%ebp)的值被修改,它所代表的节点也要做相应的改动。在操作数队列中,还要添加操作数%eax,该操作数所代表的节点与0xfffffffc(%ebp)新代表的节点相同。改变后的操作数队列如表4所示。
                                表4
  操作数   $6   %ebp   0xfffffffc(%ebp)   $80ab428   %eax
  node   n3   n7   n4   n8   n4
相应的,对语义图添加新的部分,添加后的语义图如图3(c)所示,在图3(b)中已经有代表操作数0xfffffffc(%ebp)的节点,因此将%eax附加到此节点上。
d)对代码行mov  %eax,%eax进行处理。该代码行所要完成的工作是将%eax附加到%eax所在节点n4上,操作数队列及语义图的状态均没有发生变化。
e)对代码行shl  $0x2,%eax进行处理,该指令可解释为mul $4,%eax,操作数%eax的值发生变化,其所对应的节点也发生改变。$4为新操作数,为其建立新的节点。改变后的操作数队列如表5所示。
                            表5
  操作数   $6   %ebp   0xfffffffc(%ebp)   $80ab428  %eax   $4
  node   n3   n7   n4   n8  n10   n9
在相应的语义图上,如图3(d)所示,首先找到%eax所在节点(n4),令其为乘法运算符的左操作数,再为右操作数4建立一个立即数节点,最后将%eax附加到乘法节点上,并将%eax从原来的加法节点中删除。
f)对代码行mov  0x81327b0(%eax),%eax进行处理。在本代码行的指令中,%eax的值发生变化,其所代表的节点也发生了相应变化。改变后的操作数队列如表6所示。
                                表6
  操作数   $6   %ebp   0xfffffffc(%ebp)   $80ab428   %eax   $4
  node   n3   n7   n4   n8   n13   n9
如图3(e)所示,为操作数%eax创建新的节点n13。
g)对代码行jmp  *%eax进行处理,在a)中,如果判断的结果为假,执行本步骤。在本步骤中,操作数队列没有变化,仍如表6所示。在语义图上有相应的改变,如图3(f)所示,虚框内的部分就是index所对应的节点;并且依据要识别的模式特点,将jmp*节点挂在转移节点的false边上。
例3:一段取自SPEC2000中crafty的反汇编码,由GCC-O3编译
806b0b1:83 f8 06             cmp  $0x6,%eax
806b0b4:89 15 a4 e3 07 08    mov  %edx,0x807e3a4
806b0ba:0f 87 1e 05 00 00    ja   806b5de<UnMakeMove+0x121e>
806b0c0:ff 24 85 f0 fd 06 08 jmp  *0x806fdf0(,%eax,4)
同上述步骤,可对例3中的反汇编码创建语义图,所创建的语义图如图4所示,在图中有一个孤立节点,表明该节点与要识别的数据流无关。因此使用语义图的方法可以有效的剔除掉一些不相关的信息。
步骤40、检查步骤30所创建的语义图是否与步骤10所创建的模板图匹配。所述的模板图为图1或图2,如果匹配说明所选取的代码段的语义符合语义1或语义2。语义图是一个有向无环图(DAG),但除去分支节点外可以看成一棵二叉树,在该二叉树中,如果有多条边指向同一个节点,则看作这些边分别指向各自一个单独的节点;分支节点特殊看待,可以认为它具有三棵子树。因此可以对被检测图和模版图同步进行先序遍历,构造递归的匹配检测算法,即先检测图的根节点是否与模版图的根节点匹配,若匹配成功则再分别检测该节点的左子树、右子树以及第三棵子树(若存在)是否与模版中相应的子树匹配,依次递归,均成功则匹配成功。
语义图中的节点分为三种类型:分支节点、运算符节点、原子操作数节点,分别对应图中的菱形、矩形和椭圆形节点。把分支节点作为整个语义图的根节点,从该节点开始对语义图进行匹配检测。
在执行递归算法的过程中,对这三种类型的节点分别按照如下规则进行匹配检测:
1、分支节点:依次检测它的三棵子树是否与模版匹配。
2、运算符节点:先检测其内容是否与模版节点相同,检测是严格的,即如果模版节点是“+”节点,则被检测的节点也必须是“+”节点,检测成功则递归检测左右两棵子树。
3、原子操作数节点:原子操作数一定是语义图中的叶节点,又可分为两种类型:寄存器和立即数(偏移量也看成是立即数的一种),寄存器的取值可以为%eax、%ebx等,立即数的取值则不确定。为了便于检测两个叶节点是否匹配,需要在模版图上附加一些匹配规则的信息,即:任意匹配(ANY)、严格匹配(RESTRICT)、不严格匹配(NOT_RESTRICT)。任意匹配表示被检测图中此处只要有节点即可,节点的内容可任意;严格匹配表示此位置处节点的类型和取值均须与模版节点相同;不严格匹配表示此位置的节点只需类型和模版节点相同,取值可以不同。对语义1的模板图标记匹配规则信息后如图5所示,对语义2的模板图标记匹配规则信息后如图6所示。
有了附加的匹配规则信息,则在检测到某个叶节点时,可以方便地按照其对应的模版节点上的这些信息来判断它是否符合要求。
以上图匹配算法可以容易的用C语言或其他高级语言实现。
步骤50、获取跳转表的地址和跳转表的表项数目,进而得到表项中记录的分支目标地址,标记其为有效代码。一旦语义图匹配成功,则可以方便地获取跳转表的地址和表项数目信息。对于语义1,跳转表地址位于“Table_Base”节点处,表项数目信息位于“$num”节点处。对于语义2,首先从“Disp”节点处取得跳转表相对于%ebx的偏移量,然后加上GOT表的地址,即得到跳转表的地址,跳转表表项数目信息仍从“$num”节点处得到。
上述实施例说明了在Linux/x86平台下可实现经由跳转表的多目标分支语句的识别,在其他操作平台下,本发明的方法也同样适用。

Claims (5)

1、一种二进制翻译中经由跳转表的多目标分支语句的识别方法,包括:
1)把要识别的语义转化为语义图,把转化后的语义图作为模板图;
2)选择待识别语义的代码片段;
3)将步骤2)选择出的代码片段按照语义构建语义图;
4)将步骤3)构建出的语义图和步骤1)得到的模板图做匹配,若匹配成功,则识别出语义,执行下一步,否则所选择的代码片段语义识别失败;
5)获取跳转表的地址和大小,进而得到表项中记录的分支目标地址,标记其为有效代码。
2、根据权利要求1所述的二进制翻译中经由跳转表的多目标分支语句的识别方法,其特征在于,所述的步骤2)包括:
2-1、在代码中查找间接跳转指令,当遇到该指令时,向前查看一定数量的指令;
2-2、在向前查找的指令中,看是否有比较指令,若有比较指令,则将比较指令与间接跳转指令之间的代码段作为要识别的代码片段;若没有找到比较指令,则不做处理。
3、根据权利要求1所述的二进制翻译中经由跳转表的多目标分支语句的识别方法,其特征在于,所述的步骤3)中,在构建语义图时需要引入一个记录操作数的队列,该队列记录语义图构建过程中所有已经出现过的操作数以及该操作数的最新值在语义图中对应的节点。
4、根据权利要求1所述的二进制翻译中经由跳转表的多目标分支语句的识别方法,其特征在于,所述的步骤4)中,对待检测的语义图和模版图进行同步的遍历,检测两个图中对应位置的节点是否相匹配,两图中所有对应位置的节点均匹配则认为两个图是匹配的。
5、根据权利要求1所述的二进制翻译中经由跳转表的多目标分支语句的识别方法,其特征在于,所述的步骤4)中,将语义图和模板图的节点分为三种类型:分支节点、运算符节点、原子操作数节点,分支节点视为整个语义图的根节点,从该节点开始对语义图进行匹配检测,对于不同类型的节点,分别按不同的规则进行匹配检测:
4-1、分支节点,依次检测它的三棵子树是否与模版匹配;
4-2、运算符节点,先检测其内容是否与模版节点相同,检测成功则递归检测左右两棵子树;
4-3、原子操作数节点,为了便于检测两个原子操作数节点是否匹配,需要在模版图上附加一些匹配规则的信息,即:任意匹配、严格匹配、不严格匹配;任意匹配表示被检测图中此处只要有节点即可,节点的内容可任意;严格匹配表示此位置处节点的类型和取值均须与模版节点相同;不严格匹配表示此位置的节点只需类型和模版图的节点相同,取值可以不同。
CNB2005100855091A 2005-07-22 2005-07-22 二进制翻译中经由跳转表的多目标分支语句的识别方法 Active CN100377089C (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CNB2005100855091A CN100377089C (zh) 2005-07-22 2005-07-22 二进制翻译中经由跳转表的多目标分支语句的识别方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CNB2005100855091A CN100377089C (zh) 2005-07-22 2005-07-22 二进制翻译中经由跳转表的多目标分支语句的识别方法

Publications (2)

Publication Number Publication Date
CN1900910A true CN1900910A (zh) 2007-01-24
CN100377089C CN100377089C (zh) 2008-03-26

Family

ID=37656799

Family Applications (1)

Application Number Title Priority Date Filing Date
CNB2005100855091A Active CN100377089C (zh) 2005-07-22 2005-07-22 二进制翻译中经由跳转表的多目标分支语句的识别方法

Country Status (1)

Country Link
CN (1) CN100377089C (zh)

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101271398B (zh) * 2007-03-23 2010-06-09 北京大学 多路分支结构的识别方法
WO2014023069A1 (zh) * 2012-08-10 2014-02-13 国网浙江省电力公司电力科学研究院 一种反编译数据流分析中的寄存器清除方法及系统
CN103617049A (zh) * 2013-12-19 2014-03-05 中国科学院声学研究所 基于互补谓词的代码移动方法
CN113296833A (zh) * 2021-04-30 2021-08-24 中国科学院信息工程研究所 一种二进制文件中合法指令的识别方法及装置
CN113312082A (zh) * 2021-04-30 2021-08-27 中国科学院信息工程研究所 一种二进制文件中混合在指令中的数据的识别方法及装置
CN114625844A (zh) * 2022-05-16 2022-06-14 湖南汇视威智能科技有限公司 一种代码搜索方法、装置及设备
CN115129320A (zh) * 2022-06-17 2022-09-30 南京邮电大学 一种基于循环不变式的间接跳转目标地址识别方法及装置
CN116126350A (zh) * 2023-04-17 2023-05-16 龙芯中科技术股份有限公司 一种二进制翻译方法、二进制翻译器及电子设备

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6195792B1 (en) * 1998-02-19 2001-02-27 Nortel Networks Limited Software upgrades by conversion automation
CN1311881A (zh) * 1998-06-04 2001-09-05 松下电器产业株式会社 语言变换规则产生装置、语言变换装置及程序记录媒体
US20040025151A1 (en) * 2002-07-31 2004-02-05 Shan-Chyun Ku Method for improving instruction selection efficiency in a DSP/RISC compiler
JP2005149269A (ja) * 2003-11-18 2005-06-09 Hitachi Systems & Services Ltd 構造化文書の処理システム

Cited By (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101271398B (zh) * 2007-03-23 2010-06-09 北京大学 多路分支结构的识别方法
WO2014023069A1 (zh) * 2012-08-10 2014-02-13 国网浙江省电力公司电力科学研究院 一种反编译数据流分析中的寄存器清除方法及系统
US9405519B2 (en) 2012-08-10 2016-08-02 Electric Power Research Institute Of State Grid Zhejiang Electric Power Company Method and system for register clearing in data flow analysis in decompilation
CN103617049A (zh) * 2013-12-19 2014-03-05 中国科学院声学研究所 基于互补谓词的代码移动方法
CN103617049B (zh) * 2013-12-19 2017-03-29 中国科学院声学研究所 基于互补谓词的代码移动方法
CN113312082A (zh) * 2021-04-30 2021-08-27 中国科学院信息工程研究所 一种二进制文件中混合在指令中的数据的识别方法及装置
CN113296833A (zh) * 2021-04-30 2021-08-24 中国科学院信息工程研究所 一种二进制文件中合法指令的识别方法及装置
CN113296833B (zh) * 2021-04-30 2024-03-05 中国科学院信息工程研究所 一种二进制文件中合法指令的识别方法及装置
CN113312082B (zh) * 2021-04-30 2024-03-08 中国科学院信息工程研究所 一种二进制文件中混合在指令中的数据的识别方法及装置
CN114625844A (zh) * 2022-05-16 2022-06-14 湖南汇视威智能科技有限公司 一种代码搜索方法、装置及设备
CN114625844B (zh) * 2022-05-16 2022-08-09 湖南汇视威智能科技有限公司 一种代码搜索方法、装置及设备
CN115129320A (zh) * 2022-06-17 2022-09-30 南京邮电大学 一种基于循环不变式的间接跳转目标地址识别方法及装置
CN115129320B (zh) * 2022-06-17 2024-05-24 南京邮电大学 一种基于循环不变式的间接跳转目标地址识别方法及装置
CN116126350A (zh) * 2023-04-17 2023-05-16 龙芯中科技术股份有限公司 一种二进制翻译方法、二进制翻译器及电子设备
CN116126350B (zh) * 2023-04-17 2023-09-12 龙芯中科技术股份有限公司 一种二进制翻译方法、二进制翻译器及电子设备

Also Published As

Publication number Publication date
CN100377089C (zh) 2008-03-26

Similar Documents

Publication Publication Date Title
CN1900910A (zh) 二进制翻译中经由跳转表的多目标分支语句的识别方法
US10191889B2 (en) Systems, apparatuses and methods for generating a user interface by performing computer vision and optical character recognition on a graphical representation
CN1752934A (zh) 编译器、编译方法以及编译程序
CN1302398C (zh) 编程语言扩展方法和处理数据表示语言对象及相关应用的设备
CN1842767A (zh) 用于多个异常处理模型的中间表示
CN1096036C (zh) 以格阵作关键字的字典检索装置和方法
CN100483434C (zh) 病毒识别方法及装置
CN1613058A (zh) 配有jit编译器的虚拟计算机,操作所述计算机的方法以及包括所述虚拟计算机的终端设备
CN106295335A (zh) 一种面向嵌入式设备的固件漏洞检测方法及系统
CN1759393A (zh) 一种将专用搜索寄存器和专用状态机寄存器与相关执行硬件集成以支持规则集合对数据的快速应用的可编程处理器装置
CN1804803A (zh) 具有对异步程序流程建模的软件工具
CN1922574A (zh) 无需额外的代码分析来进行链接时代码优化的方法和系统
KR100456023B1 (ko) 절차 지향 프로그램을 컴포넌트 기반의 시스템으로래핑하기 위한 방법 및 그 장치
CN103077064A (zh) 一种解析并执行程序语言方法及解释装置
CN1584884A (zh) 检索结构化文档的数据的设备和方法
CN1313927C (zh) 智能卡运行环境的控制方法
CN1313926C (zh) 模板编译方法
CN1786947A (zh) 基于网页页面布局提取网页核心内容的系统、方法和程序
CN1950819A (zh) 检索信息的系统和方法以及储存信息的系统和方法
US8117604B2 (en) Architecture cloning for power PC processors
Ranwez et al. Aligning protein-coding nucleotide sequences with MACSE
Jackson et al. hybpiper‐nf and paragone‐nf: Containerization and additional options for target capture assembly and paralog resolution
CN1143213C (zh) 高速处理循环的编译器和处理器
CN1710547A (zh) 软件测试方法及其系统
CN1920791A (zh) 一种程序测试系统

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant