CN110515655B - 一种数据指令分析方法 - Google Patents
一种数据指令分析方法 Download PDFInfo
- Publication number
- CN110515655B CN110515655B CN201910797007.3A CN201910797007A CN110515655B CN 110515655 B CN110515655 B CN 110515655B CN 201910797007 A CN201910797007 A CN 201910797007A CN 110515655 B CN110515655 B CN 110515655B
- Authority
- CN
- China
- Prior art keywords
- linked list
- data
- data instruction
- memory
- address
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/75—Structural analysis for program understanding
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/901—Indexing; Data structures therefor; Storage structures
- G06F16/9024—Graphs; Linked lists
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Databases & Information Systems (AREA)
- Data Mining & Analysis (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种数据指令分析方法,包括:从数据指令集合中获取若干数据指令;基于各数据指令的机器码和内存地址为各数据指令进行分类,获得若干类别;基于各数据指令所属的类别及运行顺序号建立三维链表,以将各数据指令分别存储在所述三维链表的各链表结点中;基于各数据指令位于三维链表中的第二维方向的坐标以及各数据指令对应的第三指针地址所对应的后缀内存地址建立后缀字典链表,以将各数据指令位于三维链表中的第三指针地址存放在后缀字典链表的各结点中;比较后缀字典链表中相邻两个结点中对应的后缀内存地址,获得最大重复前缀;基于最大重复前缀删除三维链表中相应的链表结点,并统计删除的链表结点所对应的数据指令,获得分析结果。
Description
技术领域
本发明涉及软件逆向工程技术领域,特别是涉及一种数据指令分析方法。
背景技术
在数据指令逻辑划分领域,通常需要先获取数据指令,然后再进行逻辑架构分析。现有技术的代表为IDA的F5键:伪代码(Pseudocode)标签页功能。该功能的本质是IDA利用本身自带的逻辑架构对数据指令进行模型拟合,当数据指令类型超出其识别范围,或数据指令并非由其可识别的编译器编译的情况下,伪代码标签页是无法发挥任何作用的。此外当数据指令存在复杂代码混浠或堆栈不平衡的情况时,伪代码标签页也是无法发挥作用的,因此无法准确的对数据指令进行逻辑架构分析。
发明内容
本发明实施例的目的在于提供一种数据指令分析方法,用于解决现有技术中无法准确的对数据指令进行分析的问题。
为了解决上述技术问题,本申请的实施例采用了如下技术方案:一种数据指令分析方法,包括:
获取数据指令集合;
从所述数据指令集合中获取若干数据指令,各数据指令中包含有机器码、内存地址以及运行顺序号;
基于各数据指令的机器码和内存地址为各所述数据指令进行分类,获得若干类别;
基于各数据指令所属的类别以及运行顺序号建立三维链表,以将各数据指令分别存储在所述三维链表的各链表结点中;各所述链表结点分别包含:沿相同类别的第一维方向的第一指针地址,沿不同类别的第二维方向的第二指针地址以及沿运行顺序号的第三维方向的第三指针地址。
基于各数据指令位于所述三维链表中的第二维方向的坐标以及各数据指令对应的第三指针地址所对应的后缀内存地址建立后缀字典链表,以将各数据指令位于所述三维链表中的第三指针地址存放在所述后缀字典链表的各结点中;
比较所述后缀字典链表中相邻两个结点中的第三指针地址所对应的后缀内存地址,以获得相邻两个结点对应的后缀内存地址的最大重复前缀;
基于所述最大重复前缀中的内存地址,沿所述三维链表的第三维方向删除存储有所述内存地址的链表结点,获得当前三维链表;
统计删除的所述链表结点所对应的数据指令,获得分析结果。
可选的,所述获取数据指令集合,具体包括:
确定目标信息以及与目标信息对应的目标进程;
查找所述目标信息的内存地址;
基于所述内存地址设置内存断点,以在所述目标进程运行至所述内存断点所对应的位置时触发第一异常;
在所述目标进程触发所述第一异常时,获取与所述目标进程对应的若干目标线程;
对所述各目标线程分别设置硬件断点,以在各所述目标线程运行至所述硬件断点所对应的位置时触发第二异常;其中,所述硬件断点的地址值与所述内存断点的地址值相同;
在所述目标线程触发所述第二异常时,采用单步模式来执行目标线程中的各数据指令,以获取目标线程处于中断态下的当前的数据指令;
对获得的各当前数据指令按照预定的格式进行保存,获得数据指令集合。
可选的,所述获取与所述目标进程对应的若干线程,具体包括:
确定所述目标进程的进程ID;
对系统中的所有线程进行快照,以获取当前系统下的所有线程;
基于所述目标进程的进程ID对各线程的进程ID进行筛选,获得目标线程。
可选的,所述采用单步模式来执行目标线程中的各数据指令,以获取目标线程处于各单步中断态下的各当前的数据指令,具体包括:
重复将标志寄存器的跟踪标志位置位为1,使CPU每执行目标线程中的一条指令后均产生单步中断;
获取在所述单步中断状态下,CPU正在执行指令的内存地址;
基于所述内存地址获取与所述内存地址对应的数据指令。
可选的,在查找到目标信息的内存地址后,所述方法还包括:将所述目标信息的内存地址按照查找到的顺序存放在一数组中;
所述基于所述内存地址设置内存断点,具体包括:在所述数组中的第一个值所对应的位置设置内存断点。
可选的,在对各目标线程设置硬件断点之后,所述方法还包括:删除所述内存断点。
可选的,所述从所述数据指令集合中获取若干数据指令,具体包括:每次按照预定行数从所述数据指令集合中获取预定行数的数据指令;其中每行对应一条数据指令;
对获取的各行的数据指令进行转换,以获得与各数据指令对应的运行顺序号、内存地址以及机器码;
可选的,所述方法还包括:
以各数据指令位于所述三维链表中的第三指针地址为遍历起始地址,沿第三维方向遍历所述三维链表中的各剩余链表结点;
获得所述各剩余链表结点中的内存地址;
将获得的各所述内存地址按照获得的顺序进行合并,获得与各数据指令的第三指针地址对应的后缀内存地址。
可选的,所述方法还包括:将最大重复前缀的字符数量值与预设的门限值进行比较,在所述最大重复前缀的字符数大于或等于所述预设的门限值时,对所述三维链表进行删除链表结点的操作;
在所述最大重复前缀的字符数小于所述预设的门限值时,对所述三维链表停止删除链表结点的操作。
可选的,在获得当前三维链表后,所述方法还包括:基于所述最大重复前缀中的内存地址,删除所述后缀字典链表中与所述内存地址对应的第三指针地址所对应的结点,以获得当前后缀字典链表,以利用所述当前后缀字典链表和所述三维链表重新获得最大重复前缀,以对所述三维链表重复进行删除链表结点的操作,直至所述最大重复前缀小于所述预设的门限值时,停止删除链表结点的操作。
本发明实施例通过建立三维链表来存放各个数据指令,通过建立后缀字典链表来存放各数据指令位于所述三维链表中的地址,这样就可以根据后缀字典链表中各结点存放的地址来遍历三维链表,进而快速的获得与后缀字典链表各结点对应的后缀内存地址,以为后续根据相邻两个结点对应后缀内存地址比较获得最大重复前缀提供了保证。在获得最大重复前缀后即可删除三维链表中相应的链表结点,删除的链表结点即代表了重复出现次数最多的数据指令,从而准确的实现对数据指令逻辑架构的分析。
附图说明
图1为本发明实施例指令分析方法的流程图;
图2为本发明实施例三维链表的结构示意图;
图3为本发明实施例后缀字典链表的结构示意图;
图4为本发明实施例三维链表中的若干链表节点后的当前三维链表结构示意图;
图5为本发明实施例指令分析方法的流程图。
具体实施方式
此处参考附图描述本申请的各种方案以及特征。
应理解的是,可以对此处申请的实施例做出各种修改。因此,上述说明书不应该视为限制,而仅是作为实施例的范例。本领域的技术人员将想到在本申请的范围和精神内的其他修改。
包含在说明书中并构成说明书的一部分的附图示出了本申请的实施例,并且与上面给出的对本申请的大致描述以及下面给出的对实施例的详细描述一起用于解释本申请的原理。
通过下面参照附图对给定为非限制性实例的实施例的优选形式的描述,本申请的这些和其它特性将会变得显而易见。
还应当理解,尽管已经参照一些具体实例对本申请进行了描述,但本领域技术人员能够确定地实现本申请的很多其它等效形式,它们具有如权利要求所述的特征并因此都位于借此所限定的保护范围内。
当结合附图时,鉴于以下详细说明,本申请的上述和其他方面、特征和优势将变得更为显而易见。
此后参照附图描述本申请的具体实施例;然而,应当理解,所申请的实施例仅仅是本申请的实例,其可采用多种方式实施。熟知和/或重复的功能和结构并未详细描述以避免不必要或多余的细节使得本申请模糊不清。因此,本文所申请的具体的结构性和功能性细节并非意在限定,而是仅仅作为权利要求的基础和代表性基础用于教导本领域技术人员以实质上任意合适的详细结构多样地使用本申请。
本说明书可使用词组“在一种实施例中”、“在另一个实施例中”、“在又一实施例中”或“在其他实施例中”,其均可指代根据本申请的相同或不同实施例中的一个或多个。
本发明实施例提供一种数据指令分析方法,具体包括如下步骤:
S101,获取数据指令集合;
本步骤中数据指令集合由若干数据指令构成。其中数据指令表示若干字符,或者字符和空格的组合,例如:| 7||005E0421||FF157484BF00|| CALL DWORD PTR DS:[12551284]|,即表示一条数据指令。
S102,从所述数据指令集合中获取若干数据指令,各数据指令中包含有机器码、内存地址以及运行顺序号;
本步骤中在获得若干数据指令时,具体可以以每次按照预定行数从所述数据指令集合中获取预定行数的数据指令;比如每次获取1000行数据指令,其中每行对应一条数据指令;(即每次获得1000条数据指令,)然后将获得的各条数据指令进行转换获得运行顺序号、内存地址以及机器码。例如对|7||005E0421||FF157484BF00||CALL DWORD PTR DS:[12551284]|进行转换,就可以得到数据指令的机器码为“FF157484BF00”,内存地址为“005E0421”,运行顺序号为"8"。然后再次获取1000行数据指令并进行转换。直到将所有数据指令转换完成。其中当最后一次不满1000时,其余行可以用空格补充。
S103,基于各数据指令的机器码和内存地址为各所述数据指令进行分类,获得若干类别;
S104,基于各数据指令所属的类别以及运行顺序号建立三维链表,以将各数据指令分别存储在所述三维链表的各链表结点中;各所述链表结点分别包含:沿相同类别的第一维方向的第一指针地址,沿不同类别的第二维方向的第二指针地址以及沿运行顺序号的第三维方向的第三指针地址。
本步骤中,三维链表的结构如图2所示(图2中三维链表的第三维方向为示出),在建立所述三维链表的时候具体可以先建立头链表结点ROOT,然后为新链表结点申请内存地址,将各数据指令分别存放在各新链表结点中。比如有10条数据指令,运行顺序号分别为1-10。将第一条数据指令1所在的链表在该新结点链在所述头链表结点ROOT的后面;然后对第二条数据指令2中的内存地址和机器码分别与第条指令1进行比较,比较结果为不同,则沿着第二维方向(right方向)将第二条数据指令2所对应的结点链在第一条数据指令1的结点的右方;将第三条数据指令中的内存地址和机器码依次与第一条指令及第二条指令中的内存地址和机器码比较,比较结果为不同,则将第三条数据指令3所对应的结点链在第二条数据指令2的结点的右方(right方向);在将第四条数据指令4中的内存地址和机器码依次与第一条数据指令1的内存地址和机器码进行比较,确定第四条数据指令4的内存地址和机器码均与第一条数据指令1的内存地址和机器码相同,即第四条数据指令4与第一条数指令据1为同一类别,则沿第一维方向将第四条数据指令4所对应的结点链在1所对应的结点的下方(down方向)。同理对剩余的6个数据指令中的内存地址和机器码与三维链表中第二维方向的各结点对应的数据指令中的内存地址和机器码进行比较,获得如图2所示三维链表。在图2所示的三维链表中同一列的结点的数据指令的内存地址和机器码是相同的。第一维方向即为1-4-7,2-5-8,3,6,9,10。第二维方向即为1-2-3-6-9-10。第三维方向(next方向)即为沿着各数据指令的运行顺序号的方向,即1-2-3-4-5-6-7-8-9-10。
S105,基于各数据指令位于所述三维链表中的第二维方向的坐标以及各数据指令对应的第三指针地址所对应的后缀内存地址建立后缀字典链表,以将各数据指令位于所述三维链表中的第三指针地址存放在所述后缀字典链表的各结点中;
本步骤中,后缀字典链表的建立是依据第二维度方向(down方向)的坐标号的大小(即列号大小),以及后缀内存地址中的字符的字典排序,来构建后缀字典链表的。后缀字典链表的每个结点存放的是在三维链表中的第三指针地址,但是所代表的内容确实以第三指针地址为遍历起点,沿第三维方向遍历三维链表中的各剩余链表结点获得的所有内存地址;比如步骤S104中图2中的三维链表,三维链表中的10个结点对应的10条数据指令分别为:数据指令1,的运行顺序号为1、内存地址为A、机器码为666,即第一条数据指令包含:1、A、666;第二条数据指令包含2、B、777,第三条数据指令包含3、C、888,以此类推简写为:4、A、666;5、B、777;6、X、000;7、A、666;8、B、777;9、C、888;10、D、999;那么后缀字典链表就会有10个结点。按照三维链表中各数据指令对应的列号由小到大的顺序,获取各列中(各第一维方向)的各链表结点中的数据指令所对应的后缀内存地址。具体的,获取后缀内存地址的过程为:以各数据指令位于所述三维链表中的第三指针地址为遍历起始地址,沿第三维方向遍历所述三维链表中的各剩余链表结点;获得所述各剩余链表结点中的内存地址;将获得的各所述内存地址按照获得的顺序进行合并,获得与各数据指令的第三指针地址对应的后缀内存地址。即先获得第一条数据指令1的后缀内存地址ABCABXABCD,简写为1、ABCABXABCD;再获得第四条数据指令4的后缀内存地址为ABXABCD,简写为4、ABXABCD,再第七条数据指令7的后缀内存地址为ABCD,简写为7、ABCD,以此类推获得各后缀内存地址:2、BCABXABCD;5、BXABCD;8、BCD;3、CABXABCD;9、CD;6、XABCD;10、D。然后对获得的各数据指令对应的后缀内存地址进行字典排序,排序结果为:1、ABCABXABCD;7、ABCD;4、ABXABCD;2、BCABXABCD;8、BCD;5、BXABCD;3、CABXABCD;9、CD;10、D;6、XABCD。然后按照获得的排序结果,将各指令对应的第三指针地址以次存放在后缀字典链表中,获得如图3所示的后缀字典链表。
S106,比较所述后缀字典链表中相邻两个结点中的第三指针地址所对应的后缀内存地址,以获得相邻两个结点对应的后缀内存地址的最大重复前缀;
本步骤中,例如通过对图3的后缀字典链表中,相邻两个链表结点的后缀内存地址的前缀进行比较,即可获得最大重复前缀“ABC”。
S107,基于所述最大重复前缀中的内存地址,沿所述三维链表的第三维方向删除存储有所述内存地址的链表结点,获得当前三维链表;
步骤中根据上述的获得的最大重复前缀“ABC”即可确定内存地址为A、B、C,然后沿第三维方向删除存有内存地址A的链表结点,删除存有内存地址B的链表结点,删除存有内存地址C的链表结点,即删除链表结点1、2、3,再删除链表结点7、8、9,即获得当前三维链表,如图4所示。
本步骤中,具体可以将最大重复前缀的字符数量值与预设的门限值进行比较,在所述最大重复前缀的字符数大于或等于所述预设的门限值时,对所述三维链表进行删除链表结点的操作。比如预设值为2,而获得最大重复前缀“ABC”为3,即可以进行链表结点删除操作。
S108,统计删除的所述链表结点所对应的数据指令,获得分析结果。
本实施例中在完成一次删除三维链表的链表结点后,还包括:基于所述最大重复前缀中的内存地址,删除所述后缀字典链表中与所述内存地址对应的第三指针地址所对应的结点,以获得当前后缀字典链表。
通过获得当前后缀字典链表和当前三维链表来重新查找最大重复前缀,以对所述三维链表重复进行删除链表结点的操作,直至所述最大重复前缀小于所述预设的门限值时,停止删除链表结点的操作。
发明实施例通过建立三维链表来存放各个数据指令,通过建立后缀字典链表来存放各数据指令位于所述三维链表中的地址,这样就可以根据后缀字典链表中各结点存放的地址来遍历三维链表,进而快速的获得与各结点对应的后缀内存地址,以为后续根据相邻两个结点对应后缀内存地址比较获得最大重复前缀提供了保证。在获得最大重复前缀后,即可基于最大重复前缀,删除三维链表中包含于最大重复前缀中相应的链表结点,删除的链表结点即代表了重复出现次数最多的数据指令,从而准确的实现对数据指令逻辑架构的分析。
与此同时通过建立三维链表,来将数据指令投射存放在三维链表中,然后根据后缀字典链表来查找后缀内存地址的最大重复前缀,此时只要找到最大重复前缀,即找到了内存地址和原始机器码均相同的数据指令,不必直接将各个原始机器码进行比较,减少了运算工作量,提高了效率。
本发明又一实施例提供一种数据指令分析方法,如图5所示,包括如下步骤:
步骤S201,确定目标信息以及与目标信息对应的目标进程;“
本实施例中“目标信息”是“目标进程”内存中的一个连续内存单元,具体指目标程序中的敏感信息,比如“银行管理系统中”某个用户的手机号。
其中目标进行表示某个目标程序多个进行中的一个预定进程。
步骤S202,查找所述目标信息的内存地址;
本步骤中,在在查找到目标信息的内存地址后,还包括:将所述目标信息的内存地址按照查找到的顺序存放在一数组中;
本步骤中在实际获取内存地址时,由于每个线程均会有若干个目标信息,因此会获得若干内存地址,这时就可以按照内存地址获得的先后顺序来依次将各内存地址存放在数组中
步骤S203,基于所述内存地址设置内存断点,以在所述目标进程运行至所述内存断点所对应的位置时触发第一异常;
具体的,在设置内存断点时,具体是在所述数组中的第一个值所对应的位置设置内存断点。
步骤S204,在所述目标进程触发所述第一异常时,获取与所述目标进程对应的若干目标线程;
本步骤中,获取与目标进程对应的若干目标线程,具体包括:确定所述目标进程的进程ID;对系统中的所有线程进行快照,以获取当前系统下的所有线程;基于所述目标进程的进程ID对各线程的进程ID进行筛选,获得目标线程。
步骤S205,对所述各目标线程分别设置硬件断点,以在各所述目标线程运行至所述硬件断点所对应的位置时触发第二异常;其中,所述硬件断点的地址值与所述内存断点的地址值相同;
本步骤中,在对各目标线程设置硬件断点之后,还包括:删除所述内存断点。
步骤S206,在所述目标线程触发所述第二异常时,采用单步模式来执行目标线程中的各数据指令,以获取目标线程处于中断态下的当前的数据指令;
本步骤中,采用单步模式来执行目标线程中的各数据指令,以获取目标线程处于各单步中断态下的各当前的数据指令,具体包括:重复将标志寄存器的跟踪标志位置位为1,使CPU每执行目标线程中的一条指令后均产生单步中断;获取在所述单步中断状态下,CPU正在执行指令的内存地址;基于所述内存地址获取与所述内存地址对应的数据指令。
步骤S207,对获得的各当前数据指令按照预定的格式进行保存,获得数据指令集合;
步骤S208,从所述数据指令集合中获取若干数据指令,各数据中包含有机器码、内存地址以及运行顺序号;
步骤S209,基于各数据指令的机器码和内存地址为各所述数据指令进行分类,获得若干类别;
步骤S210,基于各数据指令所属的类别以及运行顺序号建立三维链表,以将各数据指令分别存储在所述三维链表的各链表结点中;各所述链表结点分别包含:沿相同类别的第一维方向dowm的第一指针地址,沿不同类别的第二维方向right的第二指针地址以及沿运行顺序号的第三维方向next的第三指针地址;
步骤S211,基于各数据指令位于所述三维链表中的第二维方向的坐标以及各数据指令对应的第三指针地址所对应的后缀内存地址建立后缀字典链表,以将各数据指令位于所述三维链表中的第三指针地址存放在所述后缀字典链表的各结点中;
步骤S212,比较所述后缀字典链表中相邻两个结点中的第三指针地址所对应的后缀内存地址,以获得相邻两个结点对应的后缀内存地址的最大重复前缀;
步骤S213基于所述最大重复前缀中的内存地址,沿所述三维链表的第三维方向删除存储有所述内存地址的链表结点,获得当前三维链表;
步骤S214统计删除的所述链表结点所对应的数据指令,获得分析结果。
本发明实施例通过设置内存断点并在内存断点触发异常时,为各目标线程设置硬件断点,这样就能快速、准确的定位到与目标信息对应的数据指令,然后再通过单步执行各数据指令,就能准确的获得与目标信息相关的数据指令,为后续的数据指令的分析奠定了基础。
本发明另一实施例提供一种数据指令分析方法,比如需要获取某个目标信息相关的数据指令进行分析,在具体实施过程中包括如下步骤:
一、获取数据指令集合,具体包括如下步骤:
(1)确定目标信息以及与目标信息对应的目标进程。
(2)根据目标进程的进程ID(即pid)通过DebugActiveProcess(pid)函数附加到目标进程上。
(3)通过memorySearch函数查找目标信息在目标进程内存中的位置,用数组initalAdd[]记录。
(4)通过VirtualProtectEx函数在initalAdd[]数组中的第一个值initalAdd[0]处设置内存断点。
(5)运行目标进程等待内存异常触发:
①WaitForDebugEvent(&DebugEvent,INFINITE);获取当前触发异常。
②通过swicth结构进行EXCEPTION_ACCESS_VIOLATION异常的筛选。
③在触发与所述内存断点对应的异常时,通过hardBreakPhoto(pid,memoryFirst)为目标pid进程下所有线程设置DR0=memoryFirst的硬件断点(即DRX断点)。具体包括如下:
a.通过CreateToolhelp32Snapshot对操作系统下所有线程进行快照,获得所有线程。
b.循环筛选出te32.th32OwnerProcessID==pid的目标进程的所有线程,获得目标线程。
c.在满足b条件时调用SetHardWareBP函数,按需求设置目标线程的硬件断点。
(context.ContextFlags=CONTEXT_DEBUG_REGISTERS)
④硬件断点设置成功后,将PSW寄存器的第9位--TF标志位设置为1,跳出循环(5)。
⑤通过ContinueDebugEvent函数将被目标进程恢复到执行状态。
(6)通过VirtualProtectEx删除之前在initalAdd[0]处设置的内存断点。
(7)进入循环等待第二异常(int 1异常)触发:
①WaitForDebugEvent(&DebugEvent,INFINITE);获取当前触发异常。
②通过swicth结构进行EXCEPTION_SINGLE_STEP异常的筛选。
③在筛选后确定触发第二异常时,通过context.EFlags=context.EFlags+0x100循环将标志寄存器的跟踪标志位(TF标志位)置1。使CPU每执行目标线程中的一条指令后均产生单步中断;利用GetThreadContext(hThread,CONTEXT_FULL)读取中断状态下的线程信息。
④根据③中context.Eip的值,通过ReadProcessMemory读取原始机器码,获得数据指令。
⑤通过ShowDecoded函数按特定格式将数据指令保存到对应的txt文件中,获得数据指令集合。
⑥通过SetThreadContext(hThread,&context)修改当前线程的环境变量。
⑦通过ContinueDebugEvent函数将被目标进程恢复到执行状态。
(8)通过DebugActiveProcessStop(pid)将系统从被调试程序上解绑,完成数据指令的获取。
二、建立三维链表,具体包括如下步骤:
(1)一层循环:通过for(i=0;i<totalLine/1000+1;i++),每次读取上述txt文件中的1000行文本到内存中。
①通过fseek(fp,i*101*1000,0)控制读写的起始位置。
②通过fread(*txt,101*1000,1,fp)读入1000行(每行的100个字节和1个换行符)(每次固定读入1000行)。
③针对最后一次不一定满1000的情况,对cutTime(对txtContent划分次数)进行相应调整(cutTime=totalLine%1000)。
④二层循环:通过for(j=0;j<cutTime;j++)把每行信息存放到线性链表的结点中。
a.通过NODE*CUT=(NODE*)malloc(sizeof(NODE));为新结点申请内存地址。
b.例如CUT->number[n]=txtContent[m];将内存字节转换成结点对应变量的数值。其中变量的数值包括:运行顺序号,内存地址以及原始机器码。
c.三层循环:沿right方向遍历三维链表的首行:
c1.cutlie++列号没循环一次加1。(列号初始值为-1,因为(0,0)位置有头结点)
c2.判断:新建结点的内存地址eip和机器码opcode的变量值与ADDRIGHT指针所指的首行结点的对应变量值是否相同。若相同,则将新建结点链在ADDRIGHT所指结点down方向的最下面(四层循环中控制行号变量cuthang++),并将addflag标志位置1(控制跳出和首行增加)。
c3.判断:if(addflag==1)标志位是被置位。若置位,增加一次重复次数,break跳出三层循环。
c4.判断:if(ADDRIGHT->right==NULL&&addflag==0)。若标志位为0且ADDRIGHT指向三维链表首行right方向最后一个结点位置,统计独立结点个数的变量duli++。
三、建立后缀字典链表,通过不断迭代来查找删除链表结点之后的最大重复前缀,并不断迭代删除最大重复前缀,实现对数据指令按不同参数标准进行逻辑划分的目的。具体执行步骤如下:
1)循环:通过while(repeatlength!=0)判断是否达到最大重复前缀是否达到门限值。
①repeatlength=LONGESTREPEAT(ROOT);通过后缀内存地址得到当前最长重复元组的长度repeatlength,并用全局指针数组*EACHLONGESTREPEAT记录各次重复的起始位置的地址。
a.通过循环遍历三维链表(即ROOT链表),按列号以及字典排序规则,构建三维链表的后缀字典链表。
a1.malloc申请新后缀指针地址结点,并初始化DICNEW->REAR=PMOVE。
a2.判断当前新申请的结点是否为最初申请的结点。
a21.若为最初申请结点:直接链在后缀字典链表头结点DICHEAD的next即可。
a22.若不为最初申请结点:进入二层循环来循环遍历已建立的后缀字典链表。
a221.判断:如果已经到后缀字典链表结尾,直接加在结尾的next方向即可。
a222.利用(SUFFIXDIC(DICNEW->REAR,DICADD->next-
>REAR)<0)来断:是否满足列号大小的排位关系,若满足则把新建结点插入到当前遍历位置。
b.通过循环比较后缀字典链表相邻结点,找到最大重复前缀的起始地址和重复次数。
b1.通过if(SAMEPREFIX(PREFIX,PREFIX->next)>maxlength)判断当前后缀字典链表中当前遍历位置的相邻结点的重复前缀是否为新的最大重复前缀。若是新的最大重复前缀:完全重建当前函数中最大前缀的记录链表prehead(函数中的局部链表),continue跳出本步循环。
b2.通过if(SAMEPREFIX(PREFIX,PREFIX->next)==maxlength)判断当前后缀字典链表中遍历位置相邻结点的原始机器码opcode的重复前缀是否与函数内当前记录的最大重复前缀长度相等。若相等则把新建后缀地址结点PRENEW链在后缀字典链表(prehead链表)的尾部。
c.通过全局结点地址指针数组来存储函数中最大重复的记录链表prehead(函数中的局部链表)的所有值。
c1.通过循环统计后缀字典链表(prehead链表)的长度。
c2.通过双重循环,遍历后缀字典链表(prehead链表)同时调整全局指针数组*EACHLONGESTREPEAT标号的位置,将链表的值转移到全局数组中。
②统计全局指针数组*EACHLONGESTREPEAT中记录地址的个数nodelength。
③二层循环:删除三维链表中最大重复前缀所对应的所有结点:
a.三层循环:通过循环判断DELETEBEFORE->next!=CUT,找到最长链前一个结点的地址DELETEBEFORE。
b.将cuttime变量置零。
c.三层循环:通过循环判断cuttime<repeatlength,找到最长链后一个结点的地址END。
d.通过DELETEBEFORE->next=END,完成一次最大循环元组的删除。
四、统计每次删除的链表节点对应的数据指令,获得若干单次报告,基于各单次报告进行分析,获得目标进程的特定操作过程的逻辑划分。
发明实施例通过建立三维链表来存放各个数据指令,通过建立后缀字典链表来存放各数据指令位于所述三维链表中的地址,这样就可以根据后缀字典链表中各结点存放的地址来遍历三维链表,进而快速的获得与各结点对应的后缀内存地址,以为后续根据相邻两个结点对应后缀内存地址比较获得最大重复前缀提供了保证。在获得最大重复前缀后即可删除三维链表中相应的链表结点,删除的链表结点即代表了重复出现次数最多的数据指令,从而准确的实现对数据指令逻辑架构的分析。
以上实施例仅为本发明的示例性实施例,不用于限制本发明,本发明的保护范围由权利要求书限定。本领域技术人员可以在本发明的实质和保护范围内,对本发明做出各种修改或等同替换,这种修改或等同替换也应视为落在本发明的保护范围内。
Claims (10)
1.一种数据指令分析方法,其特征在于,包括:
获取数据指令集合;
从所述数据指令集合中获取若干数据指令,各数据指令中包含有机器码、内存地址以及运行顺序号;
基于各数据指令的机器码和内存地址为各所述数据指令进行分类,获得若干类别;
基于各数据指令所属的类别以及运行顺序号建立三维链表,以将各数据指令分别存储在所述三维链表的各链表结点中;各所述链表结点分别包含:沿相同类别的第一维方向的第一指针地址,沿不同类别的第二维方向的第二指针地址以及沿运行顺序号的第三维方向的第三指针地址;
基于各数据指令位于所述三维链表中的第二维方向的坐标以及各数据指令对应的第三指针地址所对应的后缀内存地址建立后缀字典链表,以将各数据指令位于所述三维链表中的第三指针地址存放在所述后缀字典链表的各结点中;
比较所述后缀字典链表中相邻两个结点中的第三指针地址所对应的后缀内存地址,以获得相邻两个结点对应的后缀内存地址的最大重复前缀;
基于所述最大重复前缀中的内存地址,沿所述三维链表的第三维方向删除存储有所述内存地址的链表结点,获得当前三维链表;
统计删除的所述链表结点所对应的数据指令,获得分析结果。
2.如权利要求1所述的方法,其特征在于,所述获取数据指令集合,具体包括:
确定目标信息以及与目标信息对应的目标进程;
查找所述目标信息的内存地址;
基于所述内存地址设置内存断点,以在所述目标进程运行至所述内存断点所对应的位置时触发第一异常;
在所述目标进程触发所述第一异常时,获取与所述目标进程对应的若干目标线程;
对所述各目标线程分别设置硬件断点,以在各所述目标线程运行至所述硬件断点所对应的位置时触发第二异常;其中,所述硬件断点的地址值与所述内存断点的地址值相同;
在所述目标线程触发所述第二异常时,采用单步模式来执行目标线程中的各数据指令,以获取目标线程处于中断态下的当前的数据指令;
对获得的各当前数据指令按照预定的格式进行保存,获得数据指令集合。
3.如权利要求2所述的方法,其特征在于,所述获取与所述目标进程对应的若干线程,具体包括:
确定所述目标进程的进程ID;
对系统中的所有线程进行快照,以获取当前系统下的所有线程;
基于所述目标进程的进程ID对各线程的进程ID进行筛选,获得目标线程。
4.如权利要求2所述的方法,其特征在于,所述采用单步模式来执行目标线程中的各数据指令,以获取目标线程处于各单步中断态下的各当前的数据指令,具体包括:
重复将标志寄存器的跟踪标志位置位为1,使CPU每执行目标线程中的一条指令后均产生单步中断;
获取在所述单步中断状态下,CPU正在执行指令的内存地址;
基于所述内存地址获取与所述内存地址对应的数据指令。
5.如权利要求2所述的方法,其特征在于,在查找到目标信息的内存地址后,所述方法还包括:将所述目标信息的内存地址按照查找到的顺序存放在一数组中;
所述基于所述内存地址设置内存断点,具体包括:在所述数组中的第一个值所对应的位置设置内存断点。
6.如权利要求2所述的方法,其特征在于,在对各目标线程设置硬件断点之后,所述方法还包括:删除所述内存断点。
7.如权利要求1所述的方法,其特征在于,所述从所述数据指令集合中获取若干数据指令,具体包括:每次按照预定行数从所述数据指令集合中获取预定行数的数据指令;其中每行对应一条数据指令;
对获取的各行的数据指令进行转换,以获得与各数据指令对应的运行顺序号、内存地址以及机器码。
8.如权利要求1所述的方法,其特征在于,所述方法还包括:
以各数据指令位于所述三维链表中的第三指针地址为遍历起始地址,沿第三维方向遍历所述三维链表中的各剩余链表结点;
获得所述各剩余链表结点中的内存地址;
将获得的各所述内存地址按照获得的顺序进行合并,获得与各数据指令的第三指针地址对应的后缀内存地址。
9.如权利要求1所述的方法,其特征在于,所述方法还包括:将最大重复前缀的字符数量值与预设的门限值进行比较,在所述最大重复前缀的字符数大于或等于所述预设的门限值时,对所述三维链表进行删除链表结点的操作;
在所述最大重复前缀的字符数小于所述预设的门限值时,对所述三维链表停止删除链表结点的操作。
10.如权利要求9所述的方法,其特征在于,在获得当前三维链表后,所述方法还包括:基于所述最大重复前缀中的内存地址,删除所述后缀字典链表中与所述内存地址对应的第三指针地址所对应的结点,以获得当前后缀字典链表,以利用所述当前后缀字典链表和所述三维链表重新获得最大重复前缀,以对所述三维链表重复进行删除链表结点的操作,直至所述最大重复前缀小于所述预设的门限值时,停止删除链表结点的操作。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910797007.3A CN110515655B (zh) | 2019-08-27 | 2019-08-27 | 一种数据指令分析方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910797007.3A CN110515655B (zh) | 2019-08-27 | 2019-08-27 | 一种数据指令分析方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110515655A CN110515655A (zh) | 2019-11-29 |
CN110515655B true CN110515655B (zh) | 2023-04-18 |
Family
ID=68627194
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910797007.3A Active CN110515655B (zh) | 2019-08-27 | 2019-08-27 | 一种数据指令分析方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110515655B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115982311B (zh) * | 2023-03-21 | 2023-06-20 | 广东海洋大学 | 一种链表的生成方法、装置、终端设备及存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6708326B1 (en) * | 2000-11-10 | 2004-03-16 | International Business Machines Corporation | Method, system and program product comprising breakpoint handling mechanism for debugging and/or monitoring a computer instruction sequence |
CN101227484A (zh) * | 2008-02-04 | 2008-07-23 | 北京北方烽火科技有限公司 | 一种WiMAX基站中基于IP的汇聚子层的实现方法 |
CN109583200A (zh) * | 2017-09-28 | 2019-04-05 | 中国科学院软件研究所 | 一种基于动态污点传播的程序异常分析方法 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5842017A (en) * | 1996-01-29 | 1998-11-24 | Digital Equipment Corporation | Method and apparatus for forming a translation unit |
US7062490B2 (en) * | 2001-03-26 | 2006-06-13 | Microsoft Corporation | Serverless distributed file system |
JP5807592B2 (ja) * | 2012-03-19 | 2015-11-10 | 富士通株式会社 | 符号化方法、符号化装置及びコンピュータプログラム |
US9760546B2 (en) * | 2013-05-24 | 2017-09-12 | Xerox Corporation | Identifying repeat subsequences by left and right contexts |
US9268749B2 (en) * | 2013-10-07 | 2016-02-23 | Xerox Corporation | Incremental computation of repeats |
-
2019
- 2019-08-27 CN CN201910797007.3A patent/CN110515655B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6708326B1 (en) * | 2000-11-10 | 2004-03-16 | International Business Machines Corporation | Method, system and program product comprising breakpoint handling mechanism for debugging and/or monitoring a computer instruction sequence |
CN101227484A (zh) * | 2008-02-04 | 2008-07-23 | 北京北方烽火科技有限公司 | 一种WiMAX基站中基于IP的汇聚子层的实现方法 |
CN109583200A (zh) * | 2017-09-28 | 2019-04-05 | 中国科学院软件研究所 | 一种基于动态污点传播的程序异常分析方法 |
Also Published As
Publication number | Publication date |
---|---|
CN110515655A (zh) | 2019-11-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8516456B1 (en) | Compact instruction format for content search systems | |
US7950001B2 (en) | Method and apparatus for instrumentation in a multiprocessing environment | |
US8595709B2 (en) | Building an application call graph from multiple sources | |
Phang et al. | Expositor: Scriptable time-travel debugging with first-class traces | |
US8997059B2 (en) | Reverse debugging | |
US20060259508A1 (en) | Method and apparatus for detecting semantic elements using a push down automaton | |
US7181464B2 (en) | Forward-only evaluation for XPATH inverse query processing | |
US20140033178A1 (en) | Method and apparatus for reverse debugging source code using causal analysis | |
US10853224B2 (en) | Indexing and searching a time-travel trace for arbitrary length/arbitrary alignment values | |
CN106547587B (zh) | 用于生成目标程序的配置文件的装置和方法 | |
CN110515655B (zh) | 一种数据指令分析方法 | |
US6598181B1 (en) | Method and system for debugging multiple function calls | |
CN109828759B (zh) | 代码编译方法、装置、计算机装置及存储介质 | |
CN108073709B (zh) | 一种数据记录的操作方法、装置、设备和存储介质 | |
ESENWEIN | VLDC string matching for associative computing and multiple broadcast mesh | |
CN113157212B (zh) | Flash存储方法、装置、智能穿戴设备及存储介质 | |
CN109582574A (zh) | 一种代码覆盖率统计方法、装置、存储介质及终端设备 | |
CN112740187A (zh) | 调试程序的方法和系统 | |
Kähkönen et al. | Testing programs with contextual unfoldings | |
CN107656868B (zh) | 一种利用线程私有数据获取线程名字的调试方法及系统 | |
CN112765963A (zh) | 语句分词方法、装置、计算机设备及存储介质 | |
Schwarz et al. | Efficiently extracting full parse trees using regular expressions with capture groups | |
CN117201138B (zh) | 一种基于漏洞子图的智能合约漏洞检测方法、系统和设备 | |
CN117171058B (zh) | 调用链实时追踪方法、系统及相关设备 | |
CN114328061B (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 |