待补完
导入表为空,纯静态编译
经检查初始化和推出程序均空
程序执行会有 input 字符串,这是线索(这里用 ida 远程启动,会有其它信息
input 直接在 string 中搜到,有如下交叉引用:
直接下断点动调,发现 1780 是 main 函数,会 printf(input)
init 函数做了一个初始化:
sub_402000 是一个大虚拟机,不多赘述。
那么按照虚拟机的思路对函数重新命名
1 | __int64 sub_401780() |
对虚拟机init的一些初始判断:
1 | __int64 __fastcall init(struct_vm *vm, __int64 a2, int mem_size, int code_size) |
在当前这一步,我们可以确定的分析不多,但有一点———该虚拟机似乎缺少了对寄存器的初始化,只进行了两个内存空间——很可能是代码和栈空间的初始化;接下来我们会印证这个想法。
该虚拟机的指令相当多,这里简单对内存空间进行扫描,取出大概率实际用到的指令
举例分析几个指令:
注意,我这里用的“弹”是偏主观的理解,按实际的来说,这里并没有专门的寄存器来接收“弹”出的栈顶变量,而是在语句中临时赋值。而后栈顶指针会往下移动,符合“弹”的感觉(x