ccfer2007(修正版)-简单分析
无聊到底,继续炒冷饭.跟踪的过程郁闷而无趣,备受折磨,找到关键代码也没什么喜悦.害得我在海边看沙滩美女都没什么感觉.终于在中秋前搞完.好在跟踪过程中,对vm的生成器有了点灵感,回头也写个vm生成器.
最初两天,忍住不看源代码,不看提示.还在网上狂翻资料,恶补了柯西不等式.这个vm的opcode貌似简单,多数很好识别,写了几个od脚本跟踪记录,可只搞懂前面几句opcode是干什么的,后面成千上万的opcode不知其所云.各种手段都用了,没任何结果.
其后只好看cc的源代码,貌似简单,还是不知它的vm里到底搞了些什么,算法都藏在vm里了,不过找到了几条之前没分析出来的关键的opcode(vcall,vretn,vset port,vget port),本以为应和vmp差不多,vcall,和vretn是突破口,跟了两天,还是没有结果.
根据牛人指点,依照源代码写代码还原器,先写个动态的,看不出什么,又增加了静态的,将全部代码还原.后在button事件后逐条比对跟踪vm.在一个又一个循环中绕了两天.终于在醒悟,vset port,vget port是关键指令.
终于,在跳出一个循环,经过两个vretn后,到达了一片从没到过的代码区.
简单记录如下:
1.OD载入运行,输入name和regcode.
2.设LBUTTONUP的消息断点.
3.中断后,在vmopcode的跳转处
004048FD >|. 83FA 0F |cmp edx, 0F ; Switch (cases 0..F)
设条件断点[8f0048]=0x608
从8f0048开始是16个vm的寄存器,reg[0..16],reg[0]为Veip,reg[1]为Vesp,reg[2]为Veax.....这里设条件断点,是为了到达下面的关键代码区.
4.等几分钟,如果是和我一样的烂机器的话,可以先去冲个凉.
5.中断后,将004048FD处的条件断点更改为普通断点.数据显示区跳转到8f0048处.
6.参考如下还原的代码,f9单步运行vm指令.看见里面的vcall 07d3了吗?就是这个函数折磨了我几天,貌似里面是设置像素颜色和设置控件.
6.1这段代码,先是校验regcode的合法性,要求其为数字和大写字母,长度为16个字符.
6.2其后似乎有几段while循环干扰代码,分别对regcode进行加减乘除异或等运算,但运算结果被抛弃,这些可被nop掉.
6.3最后就是关键运算代码了.
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)