Tan's Blog.

304Challenge:代码分析2

字数统计: 770阅读时长: 2 min
2019/04/24 Share

main函数

继续分析main函数,昨天分析了main函数的前一部分,把文件内容以二进制形式读取到v4中,之后令unk_202014 = 1,进入一个循环中,调用sub_E90函数,传参v4。打开sub_E90的伪代码,发现一堆形式上有些类似的代码,猜测可能是指令集吧。
sub_E90有许多switch条件选择语句,通过不同的匹配执行不同的操作指令,将二进制指令转化为汇编指令,并执行。
接下来我将会依据sub_E90中的一些语句,搜集机器指令转为汇编指令的资料。

关于指令

机器指令

机器指令是CPU能直接识别并执行的指令,它的表现形式是二进制编码。机器指令通常由操作码和操作数两部分组成,操作码指出该指令所要完成的操作,即指令的功能,操作数指出参与运算的对象,以及运算结果所存放的位置等。

汇编指令

汇编指令是汇编语言中使用的一些操作符和助记符,还包括一些伪指令(如assume,end)。用于告诉汇编程序如何进行汇编的指令,它既不控制机器的操作也不被汇编成机器代码,只能为汇编程序所识别并指导汇编如何进行。

机器指令转为汇编指令

根据编译原理的相关知识,对一段语句进行分析时,要进行词法分析->语法分析->语义分析->(中间代码生成)->目标代码生成,通过这样一个过程,可以将高级语言源程序生成为汇编代码,生成的汇编代码再由汇编器连接器等生成目标机器上的可执行代码。

那对于机器指令转为汇编指令其实原理也很相似,先进行分词,sub_CE0关闭文件流后,执行一大段SSE指令,应该是完成这个功能的。一条汇编指令是由指令码、源操作数SRC、目的操作数DST、注释几个部分组成。通过分词可以很清晰的看出这几个部分。
将分好的内容返回给main函数,之后进入sub_E90,也就是所谓的语法分析+语义分析。

对于一个反向汇编系统而言,它要从第一条指令开始反向汇编。读进来第一个字节,这个字节肯定是指令,而不是数据。查找指令表,看其指令结构是几个字节的,如00,是空操作。那么就直接解析为NOP(空操作)从字节00->变成了NOP。如25H,00H,表示把00H内存单元和A单元内容相加放到A。
比如通过分析下面几条十六进制指令可以得到这样的汇编指令:
0200250000002500->LJMP 0025H,NOP,NOP,NOP,ADD A,0
0025000025020025->NOP,ADD A,0,NOP,ADD A,02,NOP,ADD A,?
2500025020025000->ADD A,0,LJMP 5020H,LJMP 5000H

CATALOG
  1. 1. main函数
  2. 2. 关于指令
    1. 2.1. 机器指令
    2. 2.2. 汇编指令
    3. 2.3. 机器指令转为汇编指令