《****核心原理》学习笔记(五)
《****核心原理》学习笔记(五)
记录下第八章对于vb程序的逆向调试分析。
od载入,在EP代码中首先做的是调用VB引擎的主函数(ThunRTMain())
EP地址为00401238,401238地址处的PUSH 401E14指令是用来把RT——MainStruct结构体的地址(401E14)压栈,40123D地址处的call指令是调用401232处的jmp指令,该jmp指令会跳转到VB引擎的主函数ThunRTMain(),前面401E14的值作为ThunRTMain()的参数。
这里40123D地址的call指令是调用ThunRTMain()函数,但是不是直接转到MSVBVM60.DLL的ThunRTMain()函数,而是通过中间401232地址的jmp指令跳转
这就是VC++、VB编译器中常用的间接调用法(Indirect Call)
分析
查看字符串 找到输入错误时显示的字符串
往上查找,果然只要到包含条件转移语句的代码(判断用户输入的***与字符串是否相同)
403329地址的__vbaVarTstEq()函数,比较test指令返回值(AX)后,由403332地址的条件转移指令(JE指令)决定执行的代码为"真"还是"假"
在__vbaVarTstEq()比较函数上面可以看到两条push指令,为比较函数的参数
00403321 . 8D55 BC lea edx,dword ptr ss:[ebp-0x44] 00403324 . 8D45 CC lea eax,dword ptr ss:[ebp-0x34]
这里SS是栈段,EBP是基址指针寄存器。SS:[EBP-44]指的是栈内地址,它恰好又是函数中声明的局部对象的地址(局部对象存储在栈区)。
现在我们来看看生成serial的算法
往上看 找到了明显函数形成栈帧的地方,我们可以在这里下个断点(00402ED0)
往下分析 可看到在地址00402F8E处函数把局部对象SS:[EBP-88]地址传递(push)给了函数的参数。
可以看到name字符串以字符串对象的形式存储到了[EBP-88]地址
继续往下调试分析,我们可以看到一系列循环语句。