main和Sub_E90函数分析

Hello world,hello blog!

Posted by 吴柚 on May 21, 2019

分析过程

首先给出main函数的C语言伪代码

如果a4 !=2 ,则跳转到 fprintf(stderr, "Usage: %s <myvm program>\n", *a1, a3);

此条语句的含义有点看不懂,猜测是C++里的重载函数,猜测为:将*a1、a3"Usage: %s <myvm program>\n"的格式输入至studder这个流中。

然后再看了一下fprintf函数的构成:

发现如果是函数重载的话,fprintf即为C语言中的一个函数,返回一个整型的值,但在程序中给出的函数中,返回值一直为0;

将a4 !=0 的情况分析完了,现在进入a4==0这种情况。

signal(2, (__sighandler_t)handler)

此条语句的含义为:在捕捉2号信号的同时,将unk_202014赋值为1;

接下来就直接进入循环;接下来就调用了Sub_E90这个函数,所以对Sub_E90进行分析。

首先明确一点,这个函数我并没有分析完毕,没有一条一条语句去读将它读懂,我分析了这个函数返回的结果。这是同时分析了C语言伪代码和汇编代码得到的结果

首先第一个程序结束的语句为第36行的exit(-1); 然后直接跳转到函数最后,返回v2,此时v2=1;

后面就进入Switch-case阶段,不过此阶段过于复杂,但是所有的结果都是返回v2;v2可能的值为0或者2;

所以v5 = sub_E90(v4) 此条语句的结果为v5=0、1、2共三个结果。

继续分析接下来的代码,当v5=1或者2时,循环结束,当v5=2是,输出Illegal Instruction;当v5=1是,程序继续执行nullsub_1(v4)函数,这个函数看它的汇编代码,发现就是直接return,什么都不做。

当v5=0时,执行if ( !unk_202014 ),由于前面给出了unk_202014=1,所以语句为真,直接执行goto LABEL_8,也就是上面所说的nullsub_1(v4)函数。最后以一个return 0ll结束了函数。

一些疑问

做到这里,main函数差不多就分析结束了,整个myvm程序大概的一些东西我也了解了,现在我就是需要研究一下《IDA Pro权威详解》里面处理器模块来编写反汇编器,不知道这样分析得够不够,这是很让人烦恼的的地方,我个人觉得是不太够的,但是不知道后续还要怎样去分析比较好。