将cm拖进OD就直接弹出异常,第一反应是加壳,反调试了!
用PEid一看是vc的程序,但是ida看导入表一对vb的函数,什么鬼!
还有就算加壳,一般也是运行中才会反跳试,这是加载程序就出问题了!
在ida中看到eop居然是400000,这.不是PE头吗,直接运行又是可以的,这究竟是怎么回事!
换一个调试器windbg,可以加载运行成功,然后去确认是不是直接eop的400000
执行eop的代码位置如下(xpsp3,每次重启地址不一样):
下断方式:
运行
还真的是入口在这,可是这个段不是只读的吗?
可以确认是只读的,但是确实已经执行了(OD无法加载,可能跟加载机制有关,没有细究,大神请指点,爱情海挖的坑!)
这里确认是从400000执行的,这地址究竟是怎么回事呢?
PE头MZ被解析成了dec ebp, pop edx,这里为了平衡堆栈,加入了push edx, inc ebp,然后就是挑战到401090,真正的入口
这里用PE工具将入口偏移修改为1090,就可以用OD调试了。
可是这里看到sub_408e00内部一大堆东西,不知道做了什么,我是直接忽略的,因为我记得vb入口会调用ThunRTMain,所以我对401088下断,断下后
调用401090时,可以看到返回地址是40109A,其实就是在call sub_408e00内部转了一圈然后调用了ThunRTMain
这里可以直接修改为call 401088,这样就是一个标准的vb程序开始了。
由于很少分析vb,各种工具翻来覆去用vb parser,wktvbdebug, vb decompiler。
wktvbdebug调试字体太小了(难受),vb decomplier真不错,反编译器基本还原了算法(在Check_Click_40864c中), Form_Load_408040初始化了几个全局变量(算法中会使用)
算法部分
其中global_52, global_60, global_68这几个不知道值,就通过调试去确认了一下,方法如下:
将vb decompiler切换到反汇编窗口,找到访问global_52的代码,然后用OD对4083F1下内存断点,go
断下后,执行如下代码(vb虚拟机中了,补了cyclotron大大的vb系列),此时esi地址是4083F1
继续跟入jmp地址,执行到72A4193E,就是加载global_52的值了,ds:[0025C0AC]=0.0,是0.0
同样的其他2两个变量也同样方式,确认是0.0
那么算法的表达式就可以搞了,看到那么多括号,^,肯定被吓着了,整理一下,其实是这样的:
//上面显示错误的是(k*a*b/((k+a+b)*(kb)*(ka)*(ak))^0.5 = R1)
通过化解得到
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)