插入代码的方法、装置转让专利

申请号 : CN200810026882.3

文献号 : CN101266549B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 张雄

申请人 : 华为技术有限公司

摘要 :

本发明公开了一种插入代码的方法,包括:编译链接原应用程序生成带有重定位信息的目标文件,并反汇编所述原应用程序的可执行目标文件得到反汇编结果,解析所述带有重定位信息的目标文件,获取反汇编结果中引用指令位置相关信息的重定位项信息,根据所述重定位项信息,用汇编伪指令替换所述反汇编结果中的汇编指令,对替换结果进行声明处理,获取汇编文件,在所述汇编文件的任意位置插入代码。本发明还公开了一种插入代码的装置及存储介质。本发明实施例对反汇编结果代码段汇编指令用汇编伪指令替换,有利于在反汇编结果中的任意位置插入需要的代码。

权利要求 :

1.一种插入代码的方法,其特征在于,包括:

编译链接原应用程序生成带有重定位信息的目标文件,并反汇编所述原应用程序的可执行目标文件得到反汇编结果;

在编译链接的原应用程序的任意位置预留空间;

解析所述带有重定位信息的目标文件,获取反汇编结果中引用指令位置相关信息的重定位项信息;

根据所述重定位项信息,用汇编伪指令替换所述反汇编结果中的表示引用指令位置信息的汇编指令;

对所述替换结果进行声明处理,获取汇编文件,所述声明处理是用以将反汇编结果处理成可编译、可链接的汇编文件的函数声明或跳转标签声明;

在所述汇编文件的任意位置插入代码。

2.如权利要求1所述的方法,其特征在于,所述生成带有重定位信息的目标文件具体是指:在链接时加入重定位参数选项,编译链接,生成带有重定位信息的目标文件。

3.如权利要求1所述的方法,其特征在于,所述替换步骤具体:根据所述反汇编结果中代码段的偏移量信息,获取所述反汇编结果中代码段的汇编指令,基于所述重定位项信息中的重定位类型、符号名,用汇编伪指令替代所述汇编指令。

4.如权利要求1所述的方法,其特征在于,在所述汇编文件任意位置插入代码之后,还包括:编译、链接插入代码的汇编文件,根据生成的MAP文件中函数位置信息,以及插入代码后的汇编结果得到的重定位项信息,对数据段中引用函数位置相关的内容进行更新。

5.如权利要求1所述的方法,其特征在于,还包括:在所述编译链接的原应用程序任意位置预留空间。

6.如权利要求1所述的方法,其特征在于,所述声明步骤具体包括:在所述替换结果中的函数的第一条指令前面用伪指令进行声明;或对分支指令中用到的跳转标签进行声明。

7.如权利要求1所述的方法,其特征在于,在所述汇编文件插入代码之后,如果在插入代码后超出条件分支指令范围,还包括:接收插入代码后超出条件分支指令范围的告警信息,确定发出告警信息的指令;

设置标签,并将目标位置信息赋值给所述标签;

根据所述标签的值,跳转到所述标签所指的位置。

8.如权利要求7所述的方法,其特征在于,所述设置标签步骤具体包括:设置无条件跳转到所述标签所指的位置的无条件跳转标签,将原分支指令的目标位置设置为所述无条件跳转标签所指的位置;

设置跳转到原条件分支后面的指令所指位置的标签,将其放在所述无条件跳转标签后面。

9.一种插入代码的装置,其特征在于,包括:

生成单元,用于编译链接原应用程序生成带有重定位信息的目标文件,并反汇编所述原应用程序的可执行目标文件得到反汇编结果,在编译链接的原应用程序的任意位置预留空间;

解析单元,用于解析所述带有重定位信息的目标文件,获取反汇编结果中引用指令位置相关信息的重定位项信息;

指令替换单元,用于根据所述重定位项信息,用汇编伪指令替换所述反汇编结果中的表示引用指令位置信息的汇编指令,并对替换结果进行声明处理,获取汇编文件,所述声明处理是用以将反汇编结果处理成可编译、可链接的汇编文件的函数声明或跳转标签声明;

代码插入单元,在所述汇编文件的任意位置插入代码。

10.如权利要求9所述的装置,其特征在于,所述指令替换单元包括:指令替换执行单元,用于根据所述反汇编结果中代码段的偏移量信息,获取所述反汇编结果中代码段的汇编指令,基于重定位类型、符号名,用汇编伪指令替代所述汇编指令。

11.如权利要求10所述的装置,其特征在于,还包括:数据更新单元,用于在编译、链接插入代码的汇编文件后,根据生成的MAP文件中函数位置信息,以及插入代码后的汇编结果得到的重定位项信息,对数据段中引用函数位置相关的内容进行更新。

12.如权利要求9所述的装置,其特征在于,所述超出指令范围处理单元包括:告警信息接收单元,用于接收插入代码后超出条件分支指令范围的告警信息,确定发出告警信息的指令;

设置标签单元,用于设置标签,并将目标位置信息赋值给所述标签;

跳转单元,用于根据所述设置标签单元中所述标签的值跳转到所述标签所指的位置,设置无条件跳转到所述标签所指的位置的无条件跳转标签,将原分支指令的目标位置设置为所述无条件跳转标签所指的位置,设置跳转到原条件分支后面的指令所指位置的标签,将其放在所述无条件跳转标签后面。

说明书 :

技术领域

本发明涉及一种计算机技术领域,尤其涉及一种插入代码的方法、装置。

背景技术

目前,业界开发了许多二进制插入工具,利用这些工具可以在应用程序的二进制代码中插入需要的代码,插入的代码可以把应用程序运行时相关的信息记录下来,如各个函数运行的次数,运行时间,以及程序运行的轨迹,所访问操作数的地址等,而且能够做到插入这些代码后不影响原有应用程序的功能。而通过插入代码记录的信息可以实现应用程序性能的优化,预估应用程序在不同处理器的性能。目前业界最流行使用的对应用程序进行动态插入的二进制插入工具是动态指令插入Dyninst,它能够屏蔽不同操作系统和处理器之间的差异,向用户提供一个统一插入接口,实现跨平台支持,且可以在应用程序运行过程中动态插入,现有技术Dyninst的基本框架包含两部分,一部分是装在主机一侧的控制器Mutator,通过它提供的用户接口,告诉在应用程序的什么位置插入代码;另外一部分除包含原有的应用程序外,还包含插入代码控制片Sneppets,已经支持Dyninst API的实时运行库Run-time Library,图1是现有技术Dyninst的插入代码原理图,如图1所示,B表示要插入代码时所需要额外增加的代码,在应用程序二进制中插入代码大致包含以下几个主要步骤:
1、将原有应用程序Program需要插入代码位置处的一条指令移出到BaseTramp中,在该位置重新放置一条分支指令,让其指向Base Tramp;
2、Base Tramp调用Mini-Tramp,Mini-Tramp负责寄存器保存、调用插入的代码、恢复寄存器等;
3、Mini-Tramp执行完成后,返回到Base Tramp,执行第一步插入分支指令时移出到Base Tramp指令,即图中的Relocated Instrcution,最后返回原有应用程序。
用反汇编工具,由二进制的代码得到的汇编代码,称为反汇编结果。此现有技术插入法只能放在原有应用程序二进制代码的最后面,不能在反汇编结果中的任意位置插入需要的代码。

发明内容

本发明实施例提供一种插入代码的方法、装置,以实现在反汇编结果中的任意位置插入需要的代码。
为解决上述技术问题,本发明实施例提供一种插入代码的方法,包括:
编译链接原应用程序生成带有重定位信息的目标文件,并反汇编所述原应用程序的可执行目标文件得到反汇编结果;
在编译链接的原应用程序的任意位置预留空间;
解析所述带有重定位信息的目标文件,获取反汇编结果中引用指令位置相关信息的重定位项信息;
根据所述重定位项信息,用汇编伪指令替换所述反汇编结果中的表示引用指令位置信息的汇编指令;
对所述替换结果进行声明处理,获取汇编文件,所述声明处理是用以将反汇编结果处理成可编译、可链接的汇编文件的函数声明或跳转标签声明;
在所述汇编文件的任意位置插入代码。
本发明实施例还提供了一种插入代码的装置,包括:
生成单元,用于编译链接原应用程序生成带有重定位信息的目标文件,并反汇编所述原应用程序的可执行目标文件得到反汇编结果,在编译链接的原应用程序的任意位置预留空间;
解析单元,用于解析所述带有重定位信息的目标文件,获取反汇编结果中引用指令位置相关信息的重定位项信息;
指令替换单元,用于根据所述重定位项信息,用汇编伪指令替换所述反汇编结果中的表示引用指令位置信息的汇编指令,并对替换结果进行声明处理,获取汇编文件,所述声明处理是用以将反汇编结果处理成可编译、可链接的汇编文件的函数声明或跳转标签声明;
代码插入单元,在所述汇编文件的任意位置插入代码。
本发明实施例对反汇编结果代码段汇编指令用汇编伪指令替换,有利于在反汇编结果中的任意位置插入需要的代码。

附图说明

图1是现有技术Dyninst的插入原理图;
图2是本发明实施例一插入代码的方法流程示意图;
图3是本发明实施例在插入代码后超出条件分支指令范围后处理流程示意图;
图4是本发明实施例中带有重定位信息的目标文件B.elf组成示意图;
图5是本发明实施例二插入代码的装置组成示意图;
图6是本发明实施例二插入代码的装置中超出指令范围处理单元组成示意图。

具体实施方式

为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述。
图2是本发明实施例一插入代码的方法流程示意图,包括具体步骤:
A1、编译链接原应用程序生成带有重定位信息的目标文件,并反汇编所述原应用程序的可执行目标文件得到反汇编结果;此处,链接原应用程序时,在原应用程序的任意位置预留空间,以便于容纳插入代码后增大的代码段。
A2、解析所述带有重定位信息的目标文件,获取反汇编结果中引用指令位置相关信息的重定位项信息;
A3、根据所述重定位项信息,用汇编伪指令替换所述反汇编结果中的汇编指令;
A4、对所述替换结果进行声明处理,获取汇编文件;
此处,根据重定位项信息提供代码段偏移量信息,得到反汇编结果中的汇编指令;基于所述重定位项信息中的重定位类型、符号名,用汇编伪指令替换所述汇编指令。
A5、在所述汇编文件的任意位置插入代码。
此处,在汇编文件中插入需要的代码,用于记录各个函数的运行次数,程序运行的轨迹以及程序运行时访问操作数的地址等。
由于是将代码插入到所述反汇编结果中,有时会出现插入代码后超出条件分支指令范围,图3是本发明实施例在插入代码后超出条件分支指令范围后处理流程示意图,包括具体步骤:
B1、接收插入代码后超出条件分支指令范围的告警信息,确定发出告警信息的指令;
B2、设置标签,并将目标位置信息赋值给所述标签;此处,在不改变原汇编程序逻辑的情况下,设置标签,对程序进行一定的修改。
B3、根据所述标签的值,跳转到所述标签所指的位置。
根据上述步骤在插入代码后超出条件分支指令范围时,可以在不改变原程序的运行逻辑,解决插入代码后超出条件分支的编码范围的问题。
在上述汇编文件插入代码的步骤之后还包括:编译、链接插入代码的汇编文件,根据生成的MAP文件中函数位置信息,以及重定位项信息,对数据段中引用函数位置相关的内容进行更新。
下面通过一个具体的例子对上述相关方法进行详细描述:
编译链接原应用程序生成带有重定位信息的目标文件,在链接原应用程序时,在原应用程序的任意位置预留空间,代码段中预留空间的链接脚本如下,本实施例中以预留4M空间为例:
.text 0x200000:
{
      *(.text)    (此处表示放置应用程序的有效的指令)
      .=ALIGN(0x100);
      .=.+0x400000;(此处表示在有效的指令后面预留4M大小的空间)
}=0x1234
上述所提及具体的代码信息仅为举例,此步链接出的应用程序的可执行目标文件在此处取名为A.elf;编译链接原应用程序生成带有重定位信息的目标文件具体步骤是,利用通用的编译、链接器,所有编译、链接选项不变,在链接时增加参数-r选项,-r选项是链接器(一个应用程序)的输入参数,生成带有重定位信息的目标文件在此处取名B.elf,通过-r参数,告诉链接器输出的是一个带有重定位信息的目标文件。
用反汇编工具对可执行的目标文件,在此处是对例如:A.elf的代码段进行反汇编,得到反汇编结果。解析所述带有重定位信息的目标文件,获取反汇编结果中引用指令位置相关信息的重定位项信息;解析所述带有重定位信息的目标文件,该处是对例如B.elf进行解析,图4是本发明实施例中可定重位的目标文件B.elf组成示意图,通过解析带有重定位信息文件例如B.elf的代码段重定项如(.rel.text)发现,在例如代码段偏移量(r_offset)为0x3412、0x3416有两处引用了代码位置相关的指令,重定位类型例如(r_type)分别为4、6,引用的符号名例如(st_name)为ether_ouput,即有两条指令分别取ether_ouput的高位地址与低位地址:
r_ottset    r_type   st_into   st_shndx   st_value  st_name
3412        6        12        1          3b2b90    ether_output
3416        4        12        1          3b2b90    ether_output
……
此处,根据重定位信息提供代码段偏移量信息,得到反汇编结果中的汇编指令,所述汇编指令如下:
00203410  lis     r8,91
00203414  addi    r8,r8,11152
根据重定位类型、符号名,用汇编伪指令例如ether_output@ha、ether_output@1对所述汇编指令的91、11152进行替代;
00203410  lis r8,ether_output@ha
00203414  addi r8,r8,ether_outpu@1
上述所提及具体的汇编指令、汇编伪指令等均仅为举例,在大多数情况下,用反汇编工具得到的反汇编结果并不是一个可编译、可链接的汇编文件,将反汇编结果处理成一个可编译、可链接的汇编文件主要需要进行如下两方面的处理:在所述替换结果中的函数的第一条指令前面用伪指令进行声明;或对分支指令中用到的跳转标签进行声明。下面以一个具体的例子说明声明处理。
(1)在反汇编结果中,在函数的第一条指令前面需要用伪指令进行声明,以便编译、链接时能够产生各个函数的位置信息,如反汇编结果如下,002b5250stwu r1,-16(r1)则需要在所述002b5250stwu r1,-16(r1)指令的前面用伪指令进行声明,表示这是一个函数。声明如下:
    .globl CDBCloseCursor
    .type CDBCloseCursor,@function
CDBCloseCursor:
    stwu r1,-16(r1)
(2)分支指令用到的跳转标签需要进行声明,如反汇编有下面的结果:002b527cbeq 002b5298则需要对代码位置为002b5298的标签CDBCloseCursor+48进行声明,声明如下:
CDBCloseCursor+48:
        lis r3,1
上述所提及具体的汇编伪指令为举例,在所述汇编文件插入代码,对插入代码后的汇编文件进行编译、链接,得到目标文件C.elf,由于是将要插入的代码直接插在原应用程序中,这样在有大量代码插入的情况下,可能会导致插入代码后超出原条件分支允许的编码范围。接收插入代码后超出条件分支指令范围的告警信息,确定发出告警信息的指令,所述告警信息是编译工具产生的,自动分析哪个地方有告警,并进行修改。操作人员可以通过计算机显示器了解所述告警信息,例如所述告警信息在计算机上显示为:
C:\TMP\cca43967.s:858425:Warning:operand out of range(48728 not between-32768 and 32767)
原汇编文件:
……
sth  11,168(1)
beq Tnu_DbgSet_71fc_003ff2a0
上述表示此处编译时提示有告警的指令,即目标位置超出了分支指令所允许的编码范围。
mflr  16
bl    bsp_SaveReg
……
上述所提及具体汇编指令、汇编伪指令等均仅为举例,根据编译时提供的告警信息,确定汇编文件哪条指令出了问题。设置标签,并将目标位置信息赋值给所述标签,在不改变原汇编程序逻辑的情况下,对程序进行一定的修改,增加两个标签tmp1、tmp2,tmp1中内容为b Tnu_DbgSet_71fc_003ff2a0,表示无条件跳转到目标位置,tmp2内容为原条件分支后面的指令;修改原分支指令的目标位置为tmp1,并在其后放一条无条件分支指令,目标位置为tmp2,如下所示:
……
sth 11,168(1)
  beq tmp1
  b tmp2
tmp1:
    b Tnu_DbgSet_71fc_003ff2a0
tmp2:
    mflr  16
    bl    bsp_SaveReg
      ……
上述所提及具体的汇编指令为举例,根据所述标签的值,跳转到所述标签所指的位置。
编译、链接插入代码的汇编文件,根据生成的MAP文件中函数位置信息,以及重定位项信息,对数据段中引用函数位置相关的内容进行更新。根据汇编文件编译、链接产生的MAP文件提供的函数位置信息,以及对重定位文件数据段重定位项(.rel.data)解析出重定位信息,对A.elf数据段中引用函数位置相关的地方进行更新;用C.elf文件的代码段覆盖A.elf的代码段,得到插入代码后的应用程序目标文件D.elf。
应当理解的是,上述实施例中,所提及具体的代码信息、汇编指令、汇编伪指令等均仅为举例,还可以采用其他代码信息、汇编指令、汇编伪指令等来实施本发明的实施例。
下面对与上述方法实施例插入代码处理装置进行详细说明。
图5是本发明实施例二插入代码的装置组成示意图,如图5所示,所述插入代码处理装置包括:
生成单元1,用于编译链接原应用程序生成带有重定位信息的目标文件,并反汇编所述原应用程序的可执行目标文件得到反汇编结果;
此处,在原应用程序的任意位置预留空间,以便于容纳插入代码后增大的代码段。生成单元1链接原应用程序生成带有重定位信息的目标文件具体过程是:所有编译、链接选项不变,在链接时增加参数-r选项,-r选项是链接器(一个应用程序)的输入参数,生成带有重定位信息的目标文件B.elf,通过-r参数,告诉链接器输出的是一个带有重定位信息的目标文件。反汇编所述原应用程序的可执行目标文件得到反汇编结果。
解析单元2,用于解析所述带有重定位信息的目标文件,获取反汇编结果中引用指令位置相关信息的重定位项信息;
指令替换单元3,用于根据所述重定位项信息,用汇编伪指令替换所述反汇编结果中的汇编指令,并对替换结果进行声明处理,获取汇编文件;
此处,所述指令替换单元3包括:指令替换执行单元31,用于根据所述反汇编结果中代码段的偏移量信息,获取所述反汇编结果中代码段的汇编指令,基于所述重定位项信息中的重定位类型、符号名,用汇编伪指令替代所述汇编指令。
代码插入单元4,在所述汇编文件的任意位置插入代码。
所述插入代码处理装置还包括:
数据更新单元5,用于在编译、链接插入代码的汇编文件后,根据生成的MAP文件中函数位置信息,以及重定位项信息,对数据段中引用函数位置相关的内容进行更新。
超出指令范围处理单元6,用于处理插入代码后超出条件分支指令范围的指令。所述超出指令范围处理单元6包括:
告警信息接收单元61,用于接收插入代码后超出条件分支指令范围的告警信息,确定发出告警信息的指令;
设置标签单元62,用于将目标位置信息赋值给所述标签;
跳转单元63,用于根据所述设置标签单元中所述标签的值跳转到所述标签所指的位置,设置无条件跳转到所述标签所指的位置的无条件跳转标签,将原分支指令的目标位置设置为所述无条件跳转标签所指的位置,设置跳转到原条件分支后面的指令所指位置的标签,将其放在所述无条件跳转标签后面。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本发明可以通过硬件或借助软件加必需的通用硬件平台的方式来实现,基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分也可以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例的方法。该方法包括以下步骤:
编译链接原应用程序生成带有重定位信息的目标文件,并反汇编所述原应用程序的可执行目标文件得到反汇编结果;
解析所述带有重定位信息的目标文件,获取反汇编结果中引用指令位置相关信息的重定位项信息;
根据所述重定位项信息,用汇编伪指令替换所述反汇编结果中的汇编指令;
对所述替换结果进行声明处理,获取汇编文件;
在所述汇编文件的任意位置插入代码。
本发明实施例对反汇编结果代码段汇编指令用汇编伪指令替换,有利于在反汇编结果中插入需要的代码。由于在链接原应用程序时,在原有应用程序的任意位置预留空间,可以直接将要插入的代码放在原应用程序的中间,减少了分支指令,并且不改变原应用程序的运行轨迹,降低了插入代码所增加的开销,保证了在即使有大量代码插入的情况下原有应用程序运行的正确性,并且可应用在多种处理器支持的反汇编工具。
以上所揭露的仅为本发明较佳实施例而已,当然不能以此来限定本发明之权利范围,因此依本发明权利要求所作的等同变化,仍属本发明所涵盖的范围。