分析过程
首先给出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权威详解》里面处理器模块来编写反汇编器,不知道这样分析得够不够,这是很让人烦恼的的地方,我个人觉得是不太够的,但是不知道后续还要怎样去分析比较好。