CN111124527A - 一种对动态链接库中虚表函数列表的提取方法 - Google Patents
一种对动态链接库中虚表函数列表的提取方法 Download PDFInfo
- Publication number
- CN111124527A CN111124527A CN201911014844.0A CN201911014844A CN111124527A CN 111124527 A CN111124527 A CN 111124527A CN 201911014844 A CN201911014844 A CN 201911014844A CN 111124527 A CN111124527 A CN 111124527A
- Authority
- CN
- China
- Prior art keywords
- rtti
- virtual table
- class
- type information
- pointer
- 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.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 24
- 230000007246 mechanism Effects 0.000 claims abstract description 8
- 230000003068 static effect Effects 0.000 claims description 6
- 230000006870 function Effects 0.000 description 22
- 238000012360 testing method Methods 0.000 description 4
- 230000004048 modification Effects 0.000 description 3
- 238000012986 modification Methods 0.000 description 3
- 230000006978 adaptation Effects 0.000 description 2
- 238000000605 extraction Methods 0.000 description 2
- 230000008569 process Effects 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 238000002474 experimental method Methods 0.000 description 1
- 238000007373 indentation Methods 0.000 description 1
- 230000007774 longterm Effects 0.000 description 1
- 238000012545 processing Methods 0.000 description 1
- 238000011084 recovery Methods 0.000 description 1
- 230000009467 reduction Effects 0.000 description 1
- 230000001172 regenerating effect Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
- G06F8/433—Dependency analysis; Data or control flow analysis
- G06F8/434—Pointers; Aliasing
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种对动态链接库中虚表函数列表的提取方法,其具体操作如下:对RTTI结构中的目标函数进行定位并提取RTTI所提供的类型信息;对所获取的RTTI结构类型信息进行解析,在还原结构体后,就能够以结构化的方式访问任何需要的字段和信息,其中便包含了虚表及其类型名,最后进行格式化输出即可。本发明通过从虚表的实现机制入手,对程序的数据进行搜索,从而提出了可以批量导出程序虚表函数的方法。基于此方法,测试人员可以快速获得程序内的虚表函数进行下一步工作,从而大大节省工作时间,提升工作效率。
Description
技术领域
本发明涉及计算机技术领域,具体涉及一种对动态链接库中虚表函数列表的提取方法。
背景技术
动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个DLL文件中,该DLL包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL还有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL副本的内容。
使用动态链接库可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。例如,一个大型网络游戏,如果把整个数百MB甚至数GB的游戏的代码都放在一个应用程序里,日后的修改工作将会十分费时,而如果把不同功能的代码分别放在数个动态链接库中,无需重新生成或安装整个程序就可以应用更新。
动态链接库文件,是一种不可执行的二进制程序文件,它允许程序共享执行特殊任务所必需的代码和其他资源。Windows提供的DLL文件中包含了允许基于Windows的程序在Windows环境下操作的许多函数和资源。一般被存放在电脑的"C:\Windows\System32"目录下。
Windows中,DLL多数情况下是带有".dll"扩展名的文件,但也可能是".ocx"或其他扩展名;Linux系统中常常是".so"的文件。它们向运行于Windows操作系统下的程序提供代码、数据或函数。程序可根据DLL文件中的指令打开、启用、查询、禁用和关闭驱动程序。
目前,基于C++开发的动态链接库,可执行程序等,由于C++机制原因,没有工具可以批量化导出程序内的虚表函数列表,无法对已经编译好的程序进行直接分析。
发明内容
为克服上述存在之不足,本发明的发明人通过长期的探索尝试以及多次的实验和努力,不断改革与创新,提出了一种对动态链接库中虚表函数列表的提取方法,该方法可以批量导出程序虚表函数。
为实现上述目的本发明所采用的技术方案是:一种对动态链接库中虚表函数列表的提取方法,该方法是基于C++开发的动态链接库,其具体操作如下:
对RTTI结构中的目标函数进行定位并提取RTTI所提供的类型信息;
对所获取的RTTI结构类型信息进行解析,具体是对RTTI结构进行类型解析、对RTTI结构的基类进行解析和对RTTI结构进行类层次解析,使其以结构体的方式出现在IDA中,使用IDA提供的接口进行静态分析;
在还原结构体后,就能够以结构化的方式访问任何需要的字段和信息,其中便包含了虚表及其类型名,最后进行格式化输出即可。
根据本发明中所述的一种对动态链接库中虚表函数列表的提取方法,其进一步地优选技术方案是,对RTTI结构中的目标函数进行定位具体是通过基类的指针或引用来获取所指对象的实际类型信息,RTTI提供的类型信息通过typeid或dynamic_cast<>来获取和操作,在每个类的虚表前都放置了一个结构体指针,利用此结构体指针,找到RTTI机制提供的所有信息。
根据本发明中所述的一种对动态链接库中虚表函数列表的提取方法,其进一步地优选技术方案是,所述在每个类的虚表前放置一个结构体指针是采用的msvc编译器实现。
根据本发明中所述的一种对动态链接库中虚表函数列表的提取方法,其进一步地优选技术方案是,在利用结构体指针的具体操作是对.rdata段进行扫描,通过一定的特征来获取虚表位置,这个特征是虚表内容一定会被代码交叉引用且其表项存在于.text段中,扫描完成后,就获取了所有的COL结构地址,从而找到RTTI机制提供的所有信息。
根据本发明中所述的一种对动态链接库中虚表函数列表的提取方法,其进一步地优选技术方案是,在对所获取的RTTI结构类型信息进行解析时对每一个结构都定义一个注册类,并按照应有的定义为其添加成员字段,使其以结构体的方式出现在IDA中,以方便后续的静态分析。
本发明的有益效果是通过从虚表的实现机制入手,对程序的数据进行搜索,从而提出了可以批量导出程序虚表函数的方法。基于此方法,测试人员可以快速获得程序内的虚表函数进行下一步工作,从而大大节省工作时间,提升工作效率。
附图说明
为了更清楚地说明本发明实施方式的技术方案,下面将对实施方式中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1是本发明操作流程框图。
具体实施方式
为使本发明目的、技术方案和优点更加清楚,下面对本发明实施方式中的技术方案进行清楚、完整地描述,显然,所描述的实施方式是本发明的一部分实施方式,而不是全部的实施方式。基于本发明中的实施方式,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施方式,都属于本发明保护的范围。因此,以下提供的本发明的实施方式的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施方式。
实施例
如图1所示,本发明是通过RTTICompleteObjectLocator(RTTI结构对象定位器),RTTITypeDescriptor(RTTI类型描述器),RTTIBaseClassDescriptor(RTTI基类描述器),RTTIClassHierarchyDescriptor(RTTI类层次描述器),四部分对程序的RTTI结构进行解析。然后对解析后的结果利用创建结构体的方式,实现格式上的统一。
RTTI(run-time type identification)能够通过基类的指针或引用来获取所指对象的实际类型信息,在C++中,RTTI提供的类型信息可通过typeid或dynamic_cast<>来获取和操作。在逆向工程中,RTTI提供的信息对理解各个类及其继承关系是非常有帮助的。msvc编译器在每个类的虚表前都放置了一个结构体指针,称为Complete Object Location(COL),利用这个结构,就能找到RTTI机制提供的所有信息,该结构定义如表1:
表1
因此,要提取RTTI所提供的类型信息,只需要找到该结构并进行解析即可,而在编译完成后,该结构出现在其对应类的虚表之前,虚表通常存在于.rdata段,可以直接对.rdata段进行扫描,通过一定的特征来获取虚表位置,这个特征是虚表内容一定会被代码交叉引用且其表项存在.text段中,扫描完成后,就获取了所有的COL结构地址。
获取了想要的材料信息后,接下来就是对其进行解析来提取期望的信息。使用IDA提供的接口进行静态分析,当然也可以采用能达到相同目的的方式进行,在本实施例中就不一一例举。前述解析,本质上是先创建RTTI相关结构体类型,然后将ida数据库中对应内存数据结构化,最后将数据枚举出来即可。所以这里的关键是对相关结构体的还原,包括之前提到的RTTICompleteObjectLocator,RTTITypeDescriptor,RTTIBaseClassDescriptor,RTTIClassHierarchyDescriptor。其具体操作以代码示例分别参见表2、表3和表4。
表2
表3
表4
它们间的关系大致如下:
-RTTICompleteObjectLocator
-TypeDescripto
-RTTIClassHierarachyDescriptor
-RTTIBaseClassDescriptor
每一次缩进都表示该结构为上级结构的一个成员字段。所以,可以对每一个结构都定义一个注册类,并按照应有的定义为其添加成员字段,使其以结构体的方式出现在IDA中,以方便后续的静态分析以完成还原结构体。在还原结构体后,就能够以结构化的方式访问任何需要的字段和信息,其中便包含了虚表及其类型名,最后以美观的方式进行格式化输出即可。
以待分析动态链接库:“test.dll”,“myplugin.dll”为例,通过上述方法处理后,可以得到对应的文件:“test.dll”,“test.idb”,“test.txt”,“myplugin.dll”,“myplugin.idb”,“myplugin.txt”。每个动态链接库的虚表函数列表储存在对应的“txt”文件中,完成对虚表函数的提取。具体如表5所示:
表5
以上仅是本发明的优选实施方式,应当指出的是,上述优选实施方式不应视为对本发明的限制,本发明的保护范围应当以权利要求所限定的范围为准。对于本技术领域的普通技术人员来说,在不脱离本发明的精神和范围内,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (5)
1.一种对动态链接库中虚表函数列表的提取方法,其特征在于,该方法是基于C++开发的动态链接库,其具体操作如下:
对RTTI结构中的目标函数进行定位并提取RTTI所提供的类型信息;
对所获取的RTTI结构类型信息进行解析,具体是对RTTI结构进行类型解析、对RTTI结构的基类进行解析和对RTTI结构进行类层次解析,使其以结构体的方式出现在IDA中,使用IDA提供的接口进行静态分析;
在还原结构体后,就能够以结构化的方式访问任何需要的字段和信息,其中便包含了虚表及其类型名,最后进行格式化输出即可。
2.根据权利要求1所述的一种对动态链接库中虚表函数列表的提取方法,其特征在于,对RTTI结构中的目标函数进行定位具体是通过基类的指针或引用来获取所指对象的实际类型信息,RTTI提供的类型信息通过typeid或dynamic_cast<>来获取和操作,在每个类的虚表前都放置了一个结构体指针,利用此结构体指针,找到RTTI机制提供的所有信息。
3.根据权利要求2所述的一种对动态链接库中虚表函数列表的提取方法,其特征在于,所述在每个类的虚表前放置一个结构体指针是采用的msvc编译器实现。
4.根据权利要求2所述的一种对动态链接库中虚表函数列表的提取方法,其特征在于,在利用结构体指针的具体操作是对.rdata段进行扫描,通过一定的特征来获取虚表位置,这个特征是虚表内容一定会被代码交叉引用且其表项存在于.text段中,扫描完成后,就获取了所有的COL结构地址,从而找到RTTI机制提供的所有信息。
5.根据权利要求1所述的一种对动态链接库中虚表函数列表的提取方法,其特征在于,在对所获取的RTTI结构类型信息进行解析时对每一个结构都定义一个注册类,并按照应有的定义为其添加成员字段,使其以结构体的方式出现在IDA中,以方便后续的静态分析。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911014844.0A CN111124527A (zh) | 2019-10-24 | 2019-10-24 | 一种对动态链接库中虚表函数列表的提取方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911014844.0A CN111124527A (zh) | 2019-10-24 | 2019-10-24 | 一种对动态链接库中虚表函数列表的提取方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN111124527A true CN111124527A (zh) | 2020-05-08 |
Family
ID=70495535
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911014844.0A Pending CN111124527A (zh) | 2019-10-24 | 2019-10-24 | 一种对动态链接库中虚表函数列表的提取方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111124527A (zh) |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1393087A (zh) * | 2000-09-28 | 2003-01-22 | 皇家菲利浦电子有限公司 | 网络接口驱动器和方法 |
CN102707947A (zh) * | 2012-04-25 | 2012-10-03 | 北京大学 | 一种高效的动态类型转换的实现方法 |
CN110032425A (zh) * | 2019-03-22 | 2019-07-19 | 北京智游网安科技有限公司 | 一种动态链接库文件虚拟化方法、系统及存储介质 |
CN110187988A (zh) * | 2019-06-06 | 2019-08-30 | 中国科学技术大学 | 适用于虚函数和函数指针的静态函数调用图构建方法 |
-
2019
- 2019-10-24 CN CN201911014844.0A patent/CN111124527A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1393087A (zh) * | 2000-09-28 | 2003-01-22 | 皇家菲利浦电子有限公司 | 网络接口驱动器和方法 |
CN102707947A (zh) * | 2012-04-25 | 2012-10-03 | 北京大学 | 一种高效的动态类型转换的实现方法 |
CN110032425A (zh) * | 2019-03-22 | 2019-07-19 | 北京智游网安科技有限公司 | 一种动态链接库文件虚拟化方法、系统及存储介质 |
CN110187988A (zh) * | 2019-06-06 | 2019-08-30 | 中国科学技术大学 | 适用于虚函数和函数指针的静态函数调用图构建方法 |
Non-Patent Citations (1)
Title |
---|
公众号PYTHON学习开发: ""【转】逆向分析技巧"" * |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107918666B (zh) | 一种区块链上的数据同步方法和系统 | |
US5946486A (en) | Apparatus and method for tracing entries to or exits from a dynamic link library | |
US5761510A (en) | Method for error identification in a program interface | |
US8286149B2 (en) | Apparatus for and method of implementing feedback directed dependency analysis of software applications | |
US5146593A (en) | Procedure call interface | |
US6363436B1 (en) | Method and system for loading libraries into embedded systems | |
US6304867B1 (en) | System and method for enhanced performance of a relational database management system through the use of application-specific memory-resident data | |
US8762946B2 (en) | Method for automatic extraction of designs from standard source code | |
US7565364B1 (en) | Annotation processor discovery | |
CN109614165B (zh) | 一种com组件的多版本并行运行方法和装置 | |
EP1662380A2 (en) | Time stamp methods for unified plant model | |
US6961931B2 (en) | Dependency specification using target patterns | |
CA2172772A1 (en) | Method and apparatus for an improved optimizing compiler | |
CN109032631B (zh) | 应用程序补丁包获取方法、装置、计算机设备及存储介质 | |
CN106991100B (zh) | 数据导入方法及装置 | |
CN109710220B (zh) | 关系型数据库查询方法、装置、设备及存储介质 | |
US7028293B2 (en) | Constant return optimization transforming indirect calls to data fetches | |
US20040123308A1 (en) | Hybird of implicit and explicit linkage of windows dynamic link labraries | |
US6240546B1 (en) | Identifying date fields for runtime year 2000 system solution process, method and article of manufacture | |
US7219341B2 (en) | Code analysis for selective runtime data processing | |
US6810519B1 (en) | Achieving tight binding for dynamically loaded software modules via intermodule copying | |
CN107122203B (zh) | 一种配置文件的设置方法及装置 | |
US20050071809A1 (en) | System and method for serializing objects in a compiled programming language | |
CN113065137A (zh) | Php项目中开源组件漏洞检测方法 | |
US20020046398A1 (en) | Recognition of command related items in object code |
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 | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20200508 |