- UID
- 2927
注册时间2005-8-29
阅读权限20
最后登录1970-1-1
以武会友
该用户从未签到
|
反编译常用工具:EXDEC,VBDE,VBParser
调试常用工具: WKTVBDE
要分析vb编译的P-CODE格式的程序,最好采用动静结合的方法。
可以先用vb反编译工具VBParser v1.2反编译,找到我们感兴趣的代码地址。
然后用wktvbde加载程序动态跟踪。当然一些简单的程序直接用wktvbde加载
分析就可以。
下面先说一下wktvbde安装:
安装的时候会出现提示:Error opening file for writing:.....没关系,直接
忽略。安装完成后会在桌面上创建一个快捷方式,不过这个快捷方式有点问题,
我们打开快捷方式的属性/查找目标,找到安装位置重新建立一个吧。
如果不能正常加载程序请注意下面几点:
1、用wktvbde调试程序的时候,被调试的程序要把只读属性去掉,不然会出现
Can NOT open selected File:
Please check that file is not being used by another process
的提示.
2、如果是调试vb6编译的程序,系统目录的system32目录下要有msvbvm60.dll
这个文件尽量用2001年以后的版本.否则可能无法加载程序。
我用的是从Visual Studio 6.0 Service Pack6 中的Msvbvm60.cab提取出来
的6.0.97.82英文版本。
2000和xp系统通常这样就可以了,98下我没有做过测试,抱歉,我也是刚刚开始用
这个工具,为了加入PYG组织,不得不解决掉PYG的CrackMe成员认证,偏偏这个东东
是vb p-code格式的。只好用wktvbde来分析,可是总是不能正常加载程序,开始我
还以为是Crackme搞的鬼,自己编译了一个程序测试了一下,还是不行,这说明是
wktvbde的问题,我从网上找了n个不wktvbde试了还是不行。还好天道酬勤,老天有眼
让我发现了上面的两个关键。呵呵~~差点忘记了,还有那个快捷方式,加载的时候
提示:Can't load wktvbde.dll or bdasmdll.dll,please check that you've these
files in the app folder or in your window's system directory.
重新建立一个就没事了。害的我考贝了n次也没解决掉,呵呵~~走错路的人是没法到
达目的地的。
我不太喜欢暴力,1C,1D改来改去,或用F4往堆栈里入0或1的方法我想大家都会,
至于分析程序的算法才是我们应该努力的方向,我用的方法我自己都觉得很笨的,
不知道有没有什么更好的方法,希望和大家交流。
好,不多说了,开始加载程序,
点击On Execution(Ctrl+E),打开Current bpx and bpm list窗口,添入我们用反编译
工具找到的关键地址,关闭它。点击Memory Dump(Ctrl+M)打开Memory viewer and editor
窗口。Go!(F5)
断下来之后,注意观察Stack里的数据,如果是个地址,在memory viewer and editor
里添入,来看这个地址的内在值,一般这个值只是个vb数据类型的十进制索引值,
用oleview查看msvbvm60.dll,可以看到这样定义
// Generated .IDL file (by the OLE/COM Object Viewer)
//
// typelib filename: MSVBVM60.DLL
[
uuid(000204EF-0000-0000-C000-000000000046),
version(6.0),
helpstring("Visual Basic For Applications"),
helpfile("VBA.HLP"),
helpcontext(0x000f6791)
]
library VBA
{
// TLib : // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
importlib("stdole2.tlb");
// Forward declare all types defined in this typelib
interface _HiddenInterface;
interface _ErrObject;
interface _Collection;
typedef [uuid(ED822010-6D7F-11CF-B949-00AA004455EA), helpcontext(0x0010fe25)]
enum {
vbEmpty = 0,
vbNull = 1,
vbInteger = 2,
vbLong = 3,
vbSingle = 4,
vbDouble = 5,
vbCurrency = 6,
vbDate = 7,
vbString = 8,
vbObject = 9,
vbError = 10,
vbBoolean = 11,
vbVariant = 12,
vbDataObject = 13,
vbDecimal = 14,
vbByte = 17,
vbUserDefinedType = 36,
vbArray = 8192
} VbVarType
真正的值在后面的第9个字节,比如是8,表示vbString,第9个字节是E0 FF 12,那么
这个12FFE0就是这个字符串的地址,接着在memory viewer and editor里添入12FFE0就
在memory viewer and editor看到这个字符串了,一般是UNICODE的串。
如果是2呢就是vbInteger类型的,后面的第9个字节就是其值了。
一步步的跟踪,同时注意观察,就能发现程序执行的具体操作了。
分析出算法就看你有没有耐心了,做什么事不需要耐心呢?
各位见笑了,请大家多提宝贵意见,祝福我们的组织不断的发展壮大,我会继续努力的。
同时祝愿我国的软件事业蒸蒸日上。
最后感谢飘云接受我的申请,同意我加入组织。
完。
surge[PYG]
2005-9-20 |
|