环境
Windows xp sp3
工具
1.VBExplorer
2.ollydbg
查壳
OD载入往上翻可以看出是vb程序,看到
00401042 .- FF25 60104100 jmp dword ptr ds:[<&MSVBVM50.MethCallEngine>] ; MSVBVM50.MethCallEngine
可以知道是p-code的了
测试
OD载入后搜字符串是搜不到的东西了。
参考
《使用OllyDbg从零开始Cracking》第29和30章关于p-code的内容之后就可以分析出来了。
0040E393前面的是一些对输入内容长度格式等判断
0040E393 循环开始
0040E3A6 读入name
0040E3B8 name入栈
0040E3BB 将name从str变成variant类型
0040E3BE 这个是指向上面的variant的指针
0040E3C1 这是取第一个字符函数
0040E3C6 将上面的函数计算出的结果进栈
0040E3C9
0040E3CD 将刚刚进栈的字符转成数值
0040E3D2 将刚刚得到的数值保存起来
0040E3D5 将得到的数值转成10进制然后再转为字符串
0040E3D9 将得到的字符串转回variant
0040E3EF 跳回去0040E3930040E3F5 这里是将上面循环得到的字符串入栈
0040E3F8 得到上面入栈字符串的长度
0040E402 与0x9比较
0040E404 相等就跳到40E425
0040E407 将上面循环得到的字符串入栈
0040E40A push了一个圆周率
0040E416 字符串转为数值除以3.141592654
0040E41A 将结果入栈
0040E422 jmp 0040E3F50040E425 将上面的结果取整入栈
0040E430 将栈中的值转为16进制后再与0x30F85678进行异或运算
0040E434
0040E438 将上面的计算结果入栈
0040E43E
0040E441 将0xD8B3入栈
0040E445 将0040E438处入栈的值减去0xD8B3,并将结果入栈
0040E449
0040E44D
0040E452
0040E455 0040E45A 开始for循环
0040E460
0040E463
0040E464
0040E46D 读取serial
0040E472 serial入栈
0040E475
0040E478
0040E47A
0040E47D
0040E480 这里push了一个值
0040E481 和输入的serial比较是否相同
0040E483
0040E486
0040E489 相同则跳到0040E48C
0040E48C
0040E48F 跳回循环0040E4A2 读入serial
0040E4A7
0040E4AA 将字符串转为variant
0040E4AD 将上面的计算的值存了进来
0040E4B0 用字符串的字面值减去上面计算的值
0040E4B4
0040E4B7
0040E4C1 读入name
0040E4C6
0040E4C9 计算name长度
0040E4CF 判断是否相等,不相等就为0
0040E4DE 如果上面判断结果为0就跳到错误消息框,
还是和Native-code代码一样,在分析算法中还是存在许多东西可以跳过的。
指令的位置可以用VBExplorer反编译出来。
然后用OD动态调试观察执行细节就行了
总结起来就是:
将name中每一个字符转成ascii值。
如:abcdefg
变成:979899100101102103
再判断这个值长度是否大于0x9
如果是就除以3.141592654
重复直到长度不大于0x9
于是就有:351021547
再将结果与0x30F85678异或
变成:605323155
减去0xD8B3,
变成:605267680
最后加上name的长度7:
变成:605267687