CN114519043A - 一种可执行二进制文件格式逆向分析方法 - Google Patents
一种可执行二进制文件格式逆向分析方法 Download PDFInfo
- Publication number
- CN114519043A CN114519043A CN202111674158.3A CN202111674158A CN114519043A CN 114519043 A CN114519043 A CN 114519043A CN 202111674158 A CN202111674158 A CN 202111674158A CN 114519043 A CN114519043 A CN 114519043A
- Authority
- CN
- China
- Prior art keywords
- instruction
- offset
- static
- type
- component
- 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
Links
- 238000004458 analytical method Methods 0.000 title claims abstract description 31
- 238000000034 method Methods 0.000 claims abstract description 356
- 230000003068 static effect Effects 0.000 claims abstract description 81
- 238000004088 simulation Methods 0.000 claims abstract description 8
- 238000009434 installation Methods 0.000 claims description 3
- 238000006243 chemical reaction Methods 0.000 abstract description 4
- 238000010586 diagram Methods 0.000 description 12
- 238000013500 data storage Methods 0.000 description 2
- 238000003491 array Methods 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000004806 packaging method and process Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/10—File systems; File servers
- G06F16/17—Details of further file system functions
- G06F16/178—Techniques for file synchronisation in file systems
- G06F16/1794—Details of file format conversion
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/10—File systems; File servers
- G06F16/13—File access structures, e.g. distributed indices
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/10—File systems; File servers
- G06F16/16—File or folder operations, e.g. details of user interfaces specifically adapted to file systems
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Human Computer Interaction (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及一种可执行二进制文件格式逆向分析方法,通过获取可执行二进制文件内容,将文件结构拆分并重新封装为组件内容;收集方法组件中包含的方法偏移量,用相邻两个偏移量对方法组件进行切割;遍历方法中访问字段变量的指令,根据指令含义推断字段类型;查找静态方法并设置为静态状态,初始化方法访问权限,将接口的方法与实现类中的方法通过索引值进行链接;通过栈模拟执行方法中的指令,解析指令以获取方法的描述符信息,并根据方法描述符信息进而实现可执行二进制文件的逆向分析。采用本发明所公开的可执行二进制文件格式逆向分析方法,降低了文件逆向分析过程对描述符组件的依赖性,为文件格式转换奠定了基础,应用范围广,实用性强。
Description
技术领域
本发明属于文件分析技术领域,具体涉及一种可执行二进制文件格式逆向分析方法。
背景技术
目前逆向技术已经发展得比较成熟,但在具体应用过程中还是需要因地制宜。在对可执行二进制文件进行格式转换时,需要对可执行的二进制文件格式进行逆向分析以还原文件结构。可执行二进制文件结构通常包含常量池组件、类组件、方法组件、导出组件、描述符组件等。其中描述符组件记录了各个组件的详细信息,如果描述符组件存在,可以通过逆向工程还原文件结构。如果描述符组件不存在,各个组件的详细信息不存在,提高了逆向工程的难度,无法直接实现可执行二进制文件逆向分析。
发明内容
针对现有技术中存在的缺陷,本发明的目的在于提供一种可执行二进制文件格式逆向分析方法,实现在无描述符组件的情况下可执行二进制文件的逆向分析。
为达到以上目的,本发明采用的技术方案是:一种可执行二进制文件格式逆向分析方法,所述方法包括如下步骤:
S10、获取可执行二进制文件内容,并对所述二进制文件结构进行拆分,并重新封装为组件内容;
S11、收集所述组件内容中方法组件中包含的方法偏移量,形成方法偏移列表;
S12、根据所述方法偏移列表,用相邻的两个偏移量对所述方法组件进行切割;
S13、遍历方法中访问字段变量的指令,根据所述访问字段变量指令含义推断字段类型;
S14、根据偏移查找所述方法中的静态方法,将所述静态方法设置为静态状态,初始化方法访问权限;
S15、将接口的方法与实现类中的方法通过索引值进行链接;
S16、通过栈模拟以获取所述方法的描述符信息,并根据所述方法描述符信息进而实现可执行二进制文件的逆向分析。
进一步,步骤S10中所述组件内容包括常量池组件内容、类组件内容、方法组件内容、导出组件内容以及应用组件内容。
进一步,步骤S11中所述方法偏移量获取来源包括所述常量池组件中用于描述调用本包内方法的引用、所述类组件中虚方法表和包可见方法表中的引用、导出组件中的静态方法偏移量表中的引用、所述应用组件中安装方法的偏移地址、方法组件中第一个方法的起始偏移量以及方法组件中末端位置偏移量。
进一步,步骤S11包括将所述方法偏移量按照从小到大进行排序形成所述方法偏移列表。
进一步,步骤S12包括以下子步骤:
S120、定义一个指令偏移列表,用于存放方法中获取的指令偏移,所述指令偏移列表中的指令偏移按照从小到大顺序进行排列,将偏移0添加到指令偏移列表中,从方法的第一条指令偏移开始遍历;
S121、判断所述指令偏移列表中是否还存在有效指令偏移,不存在直接结束,记录方法已遍历到的偏移,即为方法结束的偏移;存在有效指令偏移则执行下一步骤;
S122、从所述指令偏移列表中取出指令偏移,根据所述指令偏移获取方法在该偏移处的指令,根据指令信息,判断该条指令的后续指令是否有效,如果为返回指令,后续指令均为无效指令,不需要将下一条指令的偏移添加到所述指令偏移列表中,如果不为返回指令,则执行下一步骤;
S123、判断所述指令是否为控制转移指令,如果所述指令是控制转移指令,所述控制转移指令指定跳转指令的偏移,将所述跳转指令的偏移添加到所述指令偏移列表中,继续执行步骤S121;
如果所述指令不是控制转移指令,而为其他指令,下一条指令的偏移都是有效偏移,将所述有效指令偏移添加到所述指令偏移列表中,继续执行步骤S121。
进一步,步骤S13中所述字段类型包括对象类型、Byte类型、Short类型以及Int类型,步骤S13包括以下子步骤:
S131、获取当前指令偏移处指令,判断所述指令是否为操作引用指令,若是,则设置字段类型为对象类型,并指向下一条指令偏移,若否,则执行下一步骤;
S132、判断所述指令是否为操作Byte类型数据指令,若是,则设置字段类型为Byte类型,并指向下一条指令偏移,若否,则执行下一步骤;
S133、判断所述指令是否为操作Short类型数据指令,若是,则设置字段类型为Short类型,并指向下一条指令偏移,若否,则执行下一步骤;
S134、判断所述指令是否为操作Int类型数据指令,若是,则设置字段类型为Int类型,并指向下一条指令偏移,若否,则直接指向下一条指令偏移。
进一步,步骤S14包括通过以下子步骤将输出组件中所有类输出的静态方法表中偏移量对应的方法都设置为静态:
S141、将所述导出组件中所有静态方法列表中的方法偏移量生成静态方法偏移量列表;
S142、判断所述静态方法偏移量列表中是否能获取一个新的偏移量,若能,则转至下一步骤,若不能则结束方法访问类型设置过程;
S143、通过偏移,找到所述静态方法偏移量列表中的方法,将所述方法访问类型设置为静态类型,并执行步骤S142。
进一步,所述静态方法偏移量列表中的方法包括静态方法及构造器方法。
进一步,步骤S14包括遍历所有方法中的静态方法调用指令,通过所述静态方法调用指令中的常量池中静态方法引用中的偏移量找到对应的方法,即为静态方法,将所述静态方法设置为静态状态,同时需要查找构造器方法,取消所述构造器方法的静态状态。
进一步,通过所述构造器方法调用指令中的常量池中静态方法引用中的偏移量找到对应的构造器方法,取消所述构造器方法的静态状态。
进一步,步骤S16中所述方法的描述符信息获取顺序为先获取被调用方法的描述符信息,后获取调用方法的描述符信息,通过推断局部变量的类型以推断出所述方法的描述符信息。
进一步,步骤S16包括通过栈模拟执行所述方法中的指令,根据所述指令隐含信息,推断数组类型以获取所述方法的描述符信息。
进一步,步骤S16包括根据被调用函数的参数类型和栈顶的数据进行匹配,推断参数类型。
本发明的效果在于:采用本发明所公开的一种可执行二进制文件格式逆向分析方法,可在无描述符组件时通过推断出方法描述符信息,进而实现可执行二进制文件的逆向分析,降低了文件逆向分析过程对描述符组件的依赖性,为文件格式转换奠定了基础,应用范围广,实用性强。
附图说明
图1为本发明实施例所述的一种可执行二进制文件格式逆向分析方法的方法流程图;
图2为本发明实施例所述的一种可执行二进制文件格式逆向分析方法中对二进制文件结构进行拆分封装形成的组件内容结构图;
图3为本发明实施例所述的一种可执行二进制文件格式逆向分析方法中示出的一种偏移量获取来源图;
图4为本发明实施例所述的一种可执行二进制文件格式逆向分析方法中示出的另一种偏移量获取来源图;
图5为本发明实施例所述的一种可执行二进制文件格式逆向分析方法中示出的其他种偏移量获取来源图;
图6为本发明实施例所述的一种可执行二进制文件格式逆向分析方法中示出的第四种偏移量获取来源图;
图7为本发明实施例所述的一种可执行二进制文件格式逆向分析方法中示出的根据偏移列表对方法组件进行切割过程示意图;
图8为本发明实施例所述的一种可执行二进制文件格式逆向分析方法中方法大小计算过程示意图;
图9为本发明实施例所述的一种可执行二进制文件格式逆向分析方法中字段类型推断过程示意图;
图10为本发明实施例所述的一种可执行二进制文件格式逆向分析方法中示出的一种静态方法表中偏移量对应的方法静态设置过程示意图;
图11为本发明实施例所述的一种可执行二进制文件格式逆向分析方法中示出的另一种静态方法表中偏移量对应的方法静态设置过程示意图;
图12为本发明实施例所述的一种可执行二进制文件格式逆向分析方法中示出的通过栈模拟执行方法中指令获取基本数据类型过程示意图;
图13为本发明实施例所述的一种可执行二进制文件格式逆向分析方法中示出的数组引用类型通过加载流程获取参数类型过程示意图;
图14为本发明实施例所述的一种可执行二进制文件格式逆向分析方法中示出的数组引用类型通过存储流程获取参数类型过程示意图;
图15为本发明实施例所述的一种可执行二进制文件格式逆向分析方法中根据被调函数的方法描述符推测调用函数的描述符过程示意图。
具体实施方式
下面结合附图和具体实施方式对本发明作进一步描述。
实施例一
如图1所示,本发明所公开的一种可执行二进制文件格式逆向分析方法,包括以下步骤:
S10、通过流的方式获取可执行二进制文件内容,并按照其文件结构进行拆分,并重新封装为组件内容。
如图2所示,将可执行二进制文件内容重新封装为常量池组件内容、类组件内容、方法组件内容、导出组件内容、应用组件内容。
S11、收集所述组件内容中方法组件中包含的方法偏移量,形成方法偏移列表。
方法组件中未说明每个方法的大小和起始偏移量,收集方法组件中包含的方法偏移量,通过相邻的偏移量计算方法大小。
如图3所示,偏移量获取来源有:常量池组件中用于描述调用本包内方法的引用,常量池包内方法包括静态方法、构造器及私有虚方法。
如图4所示,偏移量获取来源有:类组件中虚方法表和包可见方法表中的引用。
如图5所示,偏移量获取来源有:导出组件中的静态方法偏移量表中的引用。
如图6所示,偏移量获取来源有:应用组件中安装方法的偏移地址(只有应用包才有该组件)。
偏移量获取来源有:方法组件中第一个方法的起始偏移量以及方法组件中末端位置偏移量。
将收集到的偏移量存放到列表中,按照从小到大进行排序,形成偏移列表。
S12、根据方法偏移列表,用相邻的两个偏移量对方法组件进行切割。
如图7所示,根据偏移列表,将相邻的两个偏移量对方法组件进行切割。偏移量偏移2-偏移1是方法1的大小,偏移量偏移1-偏移(n-1)是当前方法的起始偏移量,偏移量偏移2-偏移(n)是下一个方法的起始偏移量。
通过上述方法对方法组件中的方法进行切割,但是会存在两个方法合并的特殊情况,例如包中定义了一个私有方法,但是该方法只定义并未使用,在可执行二进制文件中找不到该私有方法的偏移,通过切割后,就会将该方法的指令集合并到前一个方法中。这样就导致后续栈模拟执行时会抛出异常。需要进一步确定方法指令集的大小。如图8所示,在本实施例中确定方法指令集大小的方法为,计算并查找该方法中每个分支最大可执行的步长,重新计算方法大小,输入为方法所有指令源。具体步骤为:
S120、定义一个指令偏移列表,用于存放获取指令的偏移,所述指令偏移列表中的偏移是按照从小到大排列的。
将偏移0添加到指令偏移列表中,从方法的第一条指令偏移开始遍历。
S121、判断所述指令偏移列表中是否还存在有效偏移,不存在直接结束,记录方法已遍历到的偏移,即为方法结束的偏移;存在有效偏移则执行下一步骤。
S122、从所述指令偏移列表中取出偏移,根据偏移获取方法在该偏移处的指令,根据指令信息,判断该条指令的后续指令是否有效,如果为返回指令,后续指令均为无效指令,不需要将下一条指令的偏移添加到所述指令偏移列表中。如果不为返回指令,则执行下一步骤。
S123、判断所述指令是否为控制转移指令,如果所述指令是控制转移指令,所述控制转移指令指定跳转指令的偏移,将所述跳转指令的偏移添加到所述指令偏移列表中,继续执行步骤S121。
如果该条指令不是控制转移指令,下一条指令的偏移都是有效偏移。将有效指令偏移添加到所述指令偏移列表中,继续执行步骤S121。
通过上述步骤,从方法的0偏移处开始遍历,根据指令语义将方法中的不同分支都遍历到,查找该方法中每个分支最大可执行的步长,即为该方法的大小。
S13、字段变量全程参与方法指令集的逆向分析,可执行二进制文件中字段变量的描述符信息不存在,需要遍历方法中访问字段变量的指令,根据指令含义推断字段类型。
如图9所示,根据指令含义推断的字段类型包括对象类型、Byte类型、Short类型以及Int类型。
步骤S13包括以下子步骤:
S131、取当前指令偏移处指令,判断所述指令是否为操作引用指令,若是,则设置字段类型为对象类型,并指向下一条指令偏移,若否,则执行下一步骤;
S132、判断所述指令是否为操作Byte类型数据指令,若是,则设置字段类型为Byte类型,并指向下一条指令偏移,若否,则执行下一步骤;
S133、判断所述指令是否为操作Short类型数据指令,若是,则设置字段类型为Short类型,并指向下一条指令偏移,若否,则执行下一步骤;
S134、判断所述指令是否为操作Int类型数据指令,若是,则设置字段类型为Int类型,并指向下一条指令偏移,若否,则直接指向下一条指令偏移。
S14、可执行二进制文件中的方法中仅记录该方法所有参数的单元总个数,方法基于方法组件的偏移以及方法的描述符信息方法等详细信息都不存在。1个单元可以是8位、16位、32位。在本实施例中采用16位表示1个单元进行举例说明,但对此不作限定。如果是一个虚方法,单元个数是包含this指针的。
通过技术手段获取静态方法的偏移,根据偏移查找对应的方法,将方法设置为静态方法。
在推断方法描述符之前需要推断方法是否为静态方法。用户定义的应用包中静态方法有3种情况:已实现未使用但包外可见,该方法的偏移在导出组件中存在;已实现并且在本包会被其他方法调用,该方法的偏移量在常量池中的静态方法引用中存在;已实现未使用且该方法为私有的。这三种情况,最后一种情况,在方法切割时丢弃,因此只需要处理前两种情况即可。
如图10所示,当用户定义的应用包中静态方法情况为:已实现未使用但包外可见,该方法的偏移在导出组件中存在时,通过以下方法将输出组件中所有类输出的静态方法表中偏移量对应的方法都设置为静态:
S141、将导出组件中所有静态方法列表中的偏移量生成静态偏移量列表。
S142、判断所述静态方法偏移量列表中是否能获取一个新的偏移量,若能,则转至下一步骤,若不能则结束方法访问类型设置过程。
S143、通过偏移,找到所述静态方法偏移量列表中的方法,将该方法访问类型设置为静态类型,并执行步骤S142。
通过上述方法,将输出组件中所有类输出的静态方法偏移量列表中偏移量对应的方法都设置为静态了,静态方法偏移量列表中对应的方法中除了静态方法还有构造器方法,在上述步骤中也会将构造器方法设置成静态。
如图11所示,当用户定义的应用包中静态方法情况为:已实现并且在本包会被其他方法调用,该方法的偏移量在常量池中的静态方法引用中存在时,通过以下方法将输出组件中所有类输出的静态方法表中偏移量对应的方法都设置为静态:
遍历所有方法中的静态方法调用指令,通过该指令中的常量池中静态方法引用中的偏移量找到对应的方法,设置该方法为静态,同时需要查找构造器方法,取消构造器方法的静态状态。调用构造器方法是通过构造器方法调用指令调用的,通过该指令中的常量池中静态方法引用中的偏移量找到对应的方法,取消该方法静态状态。
S15、包内定义了接口,且该接口内的方法被包内其他类实现了,需要将接口的方法与实现类中的方法通过索引值进行链接,链接的目的主要是为了获取方法的描述符信息,在栈模拟执行接口调用指令时使用。
S16、获取方法描述符信息。
方法之间存在调用关系,例如A、B、C、D四个方法都是用户自定义的方法,其中A方法调用B方法,B方法调用C和D方法,C和D方法仅调用***提供的API,这样导致在获取描述符存在先后关系。获取方法描述符的顺序为C、B、A或者D、B、A。通过以上步骤经历数次迭代遍历获取方法描述符信息。
方法参数相关的指令有加载和存储指令,通过栈模拟执行方法中的指令,解析加载和存储指令即可获取到方法的描述符。模拟栈执行的方式,根据某些指令隐含信息推断方法描述符信息。方法的参数在方法的指令中是以局部变量存在的,通过推断局部变量的类型可以推断出方法的描述符信息。
如果方法的参数是基本类型:Byte、Short、Int,通过基本类型的加载和存储两种类型进行推断。如图12所示,在本实施例中以局部变量为Short类型加载和存储进行举例说明,同时指令隐含第几个局部变量的信息。
按照参数的类型对指令进行分类,可以分为基本类型的操作指令和引用类型的相关操作指令。基本类型包含Byte、Boolean、Short、Int,本文示例中Byte、Boolean类型的数据占1个单元16位,与Short类型一样,所以在反推描述符时将Byte、Boolean类型的数据也视为Short类型。Int类型的数据占2个单元。涉及到的指令有:Short类型加载指令、Int类型存储指令。
引用类型中包含数组,根据其类型也分为两类:一种是数组访问,相关指令有加载数组引用指令、从数组引用里装载数据、存储数据到数组引用中。在执行数组引用加载指令,将一个对象类型数据压栈的同时,一并记录对象索引的值,索引与参数的位置信息有关。另一种是对象数组的访问,相关指令有加载对象的数组引用指令、从对象数组引用里装载数据、存储数据到对象数组引用中。对象数组引用类型获取流程一样,只是数据的存储和加载指令不同。如图13所示,将一个数组中某一索引处的值加载到栈上,Byte类型数组数据加载流程获取参数类型,详细步骤如下:
S161、将引用加载在栈上,引用隐含着对象引用的索引信息。
S162、将数组的索引加载到栈上。
S163、数组中数据加载指令,需要将引用和索引从栈顶弹出来。通过数据加载指令隐含信息,推断数组类型,数组类型即为对象引用的数据类型。
如图14所示,Byte类型数组数据存储流程获取参数类型,将栈顶上的值存储到数组某一位置上,详细步骤如下:
S161A、将引用加载在栈上,引用指令隐含着对象引用的索引信息。
S162A、将数组的索引加载到栈上,
S163A、将新的值加载栈顶上;
S164A、数组中数据存储指令,需要将引用指令、索引和新的值从栈顶弹出来。通过数据存储指令隐含信息,推断数组类型,数组类型即为对象引用的数据类型。
如图15所示,除了上述描述的参数在方法中直接访问,还有一种应用场景是方法的参数在方法中仅作为参数传递给被调函数,方法中就不存在加载和存储操作指令。只能根据被调用函数的参数类型和栈顶的数据进行匹配,推断参数类型。
通过上述方法,方法中的参数类型基本推测出来了,除了上述描述外还有一特殊情况,参数只定义未使用的情况,将这类的参数设置方法头中参数单元的位数。本文中以Short类型为参数单元的位数,设置几个Short是需要通过方法参数的总单元个数和已推测出来的参数占位相减计算出来的,方法返回值类型是通过方法中返回值指令获取的。通过上述方法步骤完成了方法参数信息推断过程。至此,方法描述符信息已经推断出来,根据所述方法描述符信息进而实现可执行二进制文件的逆向分析。
通过上述实施例可以看出,本发明公开的一种可执行二进制文件格式逆向分析方法,可在无描述符组件时通过推断出方法描述符信息,进而实现可执行二进制文件的逆向分析,降低了文件逆向分析过程对描述符组件的依赖性,为文件格式转换奠定了基础,应用范围广,实用性强。
本发明所述的方法并不限于具体实施方式中所述的实施例,本领域技术人员根据本发明的技术方案得出其他的实施方式,同样属于本发明的技术创新范围。
Claims (13)
1.一种可执行二进制文件格式逆向分析方法,所述方法包括如下步骤:
S10、获取可执行二进制文件内容,并对所述二进制文件结构进行拆分,并重新封装为组件内容;
S11、收集所述组件内容中方法组件中包含的方法偏移量,形成方法偏移列表;
S12、根据所述方法偏移列表,用相邻的两个偏移量对所述方法组件进行切割;
S13、遍历方法中访问字段变量的指令,根据所述访问字段变量指令含义推断字段类型;
S14、根据偏移查找所述方法中的静态方法,将所述静态方法设置为静态状态,初始化方法访问权限;
S15、将接口的方法与实现类中的方法通过索引值进行链接;
S16、通过栈模拟以获取所述方法的描述符信息,并根据所述方法描述符信息进而实现可执行二进制文件的逆向分析。
2.根据权利要求1所述的一种可执行二进制文件格式逆向分析方法,其特征在于:步骤S10中所述组件内容包括常量池组件内容、类组件内容、方法组件内容、导出组件内容以及应用组件内容。
3.根据权利要求2所述的一种可执行二进制文件格式逆向分析方法,其特征在于:步骤S11中所述方法偏移量获取来源包括所述常量池组件中用于描述调用本包内方法的引用、所述类组件中虚方法表和包可见方法表中的引用、导出组件中的静态方法偏移量表中的引用、所述应用组件中安装方法的偏移地址、方法组件中第一个方法的起始偏移量以及方法组件中末端位置偏移量。
4.根据权利要求3所述的一种可执行二进制文件格式逆向分析方法,其特征在于:步骤S11包括将所述方法偏移量按照从小到大进行排序形成所述方法偏移列表。
5.根据权利要求4所述的一种可执行二进制文件格式逆向分析方法,其特征在于,步骤S12包括以下子步骤:
S120、定义一个指令偏移列表,用于存放方法中获取的指令偏移,所述指令偏移列表中的指令偏移按照从小到大顺序进行排列,将偏移0添加到指令偏移列表中,从方法的第一条指令偏移开始遍历;
S121、判断所述指令偏移列表中是否还存在有效指令偏移,不存在直接结束,记录方法已遍历到的偏移,即为方法结束的偏移;存在有效指令偏移则执行下一步骤;
S122、从所述指令偏移列表中取出指令偏移,根据所述指令偏移获取方法在该偏移处的指令,根据指令信息,判断该条指令的后续指令是否有效,如果为返回指令,后续指令均为无效指令,不需要将下一条指令的偏移添加到所述指令偏移列表中,如果不为返回指令,则执行下一步骤;
S123、判断所述指令是否为控制转移指令,如果所述指令是控制转移指令,所述控制转移指令指定跳转指令的偏移,将所述跳转指令的偏移添加到所述指令偏移列表中,继续执行步骤S121;
如果所述指令不是控制转移指令,而为其他指令,下一条指令的偏移都是有效偏移,将所述有效指令偏移添加到所述指令偏移列表中,继续执行步骤S121。
6.根据权利要求5所述的一种可执行二进制文件格式逆向分析方法,其特征在于,步骤S13中所述字段类型包括对象类型、Byte类型、Short类型以及Int类型,步骤S13包括以下子步骤:
S131、获取当前指令偏移处指令,判断所述指令是否为操作引用指令,若是,则设置字段类型为对象类型,并指向下一条指令偏移,若否,则执行下一步骤;
S132、判断所述指令是否为操作Byte类型数据指令,若是,则设置字段类型为Byte类型,并指向下一条指令偏移,若否,则执行下一步骤;
S133、判断所述指令是否为操作Short类型数据指令,若是,则设置字段类型为Short类型,并指向下一条指令偏移,若否,则执行下一步骤;
S134、判断所述指令是否为操作Int类型数据指令,若是,则设置字段类型为Int类型,并指向下一条指令偏移,若否,则直接指向下一条指令偏移。
7.根据权利要求6所述的一种可执行二进制文件格式逆向分析方法,其特征在于,步骤S14包括通过以下子步骤将输出组件中所有类输出的静态方法表中偏移量对应的方法都设置为静态:
S141、将所述导出组件中所有静态方法列表中的方法偏移量生成静态方法偏移量列表;
S142、判断所述静态方法偏移量列表中是否能获取一个新的偏移量,若能,则转至下一步骤,若不能,则结束方法访问类型设置过程;
S143、通过偏移,找到所述静态方法偏移量列表中的方法,将所述方法访问类型设置为静态类型,并执行步骤S142。
8.根据权利要求7所述的一种可执行二进制文件格式逆向分析方法,其特征在于:所述静态方法偏移量列表中的方法包括静态方法及构造器方法。
9.根据权利要求8所述的一种可执行二进制文件格式逆向分析方法,其特征在于:步骤S14包括遍历所有方法中的静态方法调用指令,通过所述静态方法调用指令中的常量池中静态方法引用中的偏移量找到对应的方法,即为静态方法,将所述静态方法设置为静态状态,同时需要查找构造器方法,取消所述构造器方法的静态状态。
10.根据权利要求8所述的一种可执行二进制文件格式逆向分析方法,其特征在于:通过所述构造器方法调用指令中的常量池中静态方法引用中的偏移量找到对应的构造器方法,取消所述构造器方法的静态状态。
11.根据权利要求1所述的一种可执行二进制文件格式逆向分析方法,其特征在于:步骤S16中所述方法的描述符信息获取顺序为先获取被调用方法的描述符信息,后获取调用方法的描述符信息,通过推断局部变量的类型以推断出所述方法的描述符信息。
12.根据权利要求1所述的一种可执行二进制文件格式逆向分析方法,其特征在于,步骤S16包括通过栈模拟执行所述方法中的指令,根据所述指令隐含信息,推断数组类型以获取所述方法的描述符信息。
13.根据权利要求1所述的一种可执行二进制文件格式逆向分析方法,其特征在于:步骤S16包括根据被调用函数的参数类型和栈顶的数据进行匹配,推断参数类型。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111674158.3A CN114519043B (zh) | 2021-12-31 | 2021-12-31 | 一种可执行二进制文件格式逆向分析方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111674158.3A CN114519043B (zh) | 2021-12-31 | 2021-12-31 | 一种可执行二进制文件格式逆向分析方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN114519043A true CN114519043A (zh) | 2022-05-20 |
CN114519043B CN114519043B (zh) | 2024-05-24 |
Family
ID=81596613
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111674158.3A Active CN114519043B (zh) | 2021-12-31 | 2021-12-31 | 一种可执行二进制文件格式逆向分析方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114519043B (zh) |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100115287A1 (en) * | 2008-10-31 | 2010-05-06 | Apple Inc. | System and method for obfuscating constants in a computer program |
CN105718764A (zh) * | 2016-01-19 | 2016-06-29 | 北京鼎源科技有限公司 | 一种基于Android***陷阱指令的软件加固方法 |
CN109359468A (zh) * | 2018-08-23 | 2019-02-19 | 阿里巴巴集团控股有限公司 | 漏洞检测方法、装置及设备 |
CN110119601A (zh) * | 2019-03-28 | 2019-08-13 | 江苏通付盾信息安全技术有限公司 | 基于应用程序安装包的程序加固方法及装置 |
CN110147655A (zh) * | 2019-03-28 | 2019-08-20 | 江苏通付盾信息安全技术有限公司 | 应用程序的安全防护***及方法 |
US10656940B1 (en) * | 2019-02-04 | 2020-05-19 | Architecture Technology Corporation | Systems, devices, and methods for source code generation from binary files |
CN113360910A (zh) * | 2021-06-30 | 2021-09-07 | 中国农业银行股份有限公司 | 恶意应用的检测方法、装置、服务器和可读存储介质 |
CN113590133A (zh) * | 2021-08-09 | 2021-11-02 | 咪咕文化科技有限公司 | 安卓***注入检测方法、装置、设备以及计算机存储介质 |
-
2021
- 2021-12-31 CN CN202111674158.3A patent/CN114519043B/zh active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100115287A1 (en) * | 2008-10-31 | 2010-05-06 | Apple Inc. | System and method for obfuscating constants in a computer program |
CN105718764A (zh) * | 2016-01-19 | 2016-06-29 | 北京鼎源科技有限公司 | 一种基于Android***陷阱指令的软件加固方法 |
CN109359468A (zh) * | 2018-08-23 | 2019-02-19 | 阿里巴巴集团控股有限公司 | 漏洞检测方法、装置及设备 |
US10656940B1 (en) * | 2019-02-04 | 2020-05-19 | Architecture Technology Corporation | Systems, devices, and methods for source code generation from binary files |
CN110119601A (zh) * | 2019-03-28 | 2019-08-13 | 江苏通付盾信息安全技术有限公司 | 基于应用程序安装包的程序加固方法及装置 |
CN110147655A (zh) * | 2019-03-28 | 2019-08-20 | 江苏通付盾信息安全技术有限公司 | 应用程序的安全防护***及方法 |
CN113360910A (zh) * | 2021-06-30 | 2021-09-07 | 中国农业银行股份有限公司 | 恶意应用的检测方法、装置、服务器和可读存储介质 |
CN113590133A (zh) * | 2021-08-09 | 2021-11-02 | 咪咕文化科技有限公司 | 安卓***注入检测方法、装置、设备以及计算机存储介质 |
Non-Patent Citations (3)
Title |
---|
于璐;吴礼发;庄洪林;沈毅;: "Fuzzing测试中异常分析技术的研究", 小型微型计算机***, no. 07, 15 July 2012 (2012-07-15) * |
李广旭;李伟华;潘炜;史豪斌;: "软件安全逆向分析中程序结构解析模型设计", 计算机工程与应用, no. 32, 11 November 2008 (2008-11-11) * |
齐宁;丁松阳;孙维新;赵荣彩;: "基于加载机制分析的ELF文件main函数定位技术", 计算机工程, no. 06, 20 March 2007 (2007-03-20) * |
Also Published As
Publication number | Publication date |
---|---|
CN114519043B (zh) | 2024-05-24 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8020156B2 (en) | Bulk loading system and method | |
US8307350B2 (en) | Multi level virtual function tables | |
US8112388B2 (en) | Dependency processing of computer files | |
US8250536B2 (en) | Analysis of a legacy source code application | |
CN110825385B (zh) | React Native离线包的构建方法及存储介质 | |
JP7212793B2 (ja) | 関数ジャンプを実現するための方法、装置及びコンピュータ記憶媒体 | |
US9477496B2 (en) | Method and apparatus for loading classes and re-organizing class archives | |
US20130138895A1 (en) | Method and system for maintaining a pointer's type | |
US6681381B1 (en) | Arrangement for executing program code with reduced memory requirements | |
US6901591B1 (en) | Frameworks for invoking methods in virtual machines | |
CN111125216B (zh) | 数据导入Phoenix的方法及装置 | |
CN114519043A (zh) | 一种可执行二进制文件格式逆向分析方法 | |
CN112445706A (zh) | 程序异常代码获取方法、装置、电子设备以及存储介质 | |
US7080370B1 (en) | Method and apparatus for compiling source programs using one or more libraries | |
CN111309402B (zh) | 数据监测及针对应用程序的处理方法、装置及设备 | |
US20120072399A1 (en) | Non-intrusive data logging | |
US10848410B2 (en) | Ranking service implementations for a service interface | |
CN116010461A (zh) | 数据血缘关系解析方法及装置、存储介质及电子设备 | |
US20160055168A1 (en) | Method and apparatus for scanning files | |
WO2008041026A1 (en) | Method and apparatus for administering a process filesystem with respect to program code conversion | |
CN113360503A (zh) | 分布式数据库的测试数据跟踪方法及装置 | |
Yang et al. | Acquisition of ERA models from data intensive code | |
US20100251212A1 (en) | Version Type Traversal | |
CN117573566B (zh) | 多***测试用例生成方法、装置及存储介质 | |
CN118170389A (zh) | 任务数据血缘解析方法、装置、电子设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |