有一个程序,WDSM反编译后发现是VB编的,因为调用了MSVBVM60.DLL,但是同时也引用了windows的另外两个标准DLL:
+++++++++++++++++++ IMPORTED FUNCTIONS ++++++++++++++++++
Number of Imported Modules = 3 (decimal) Import Module 001: KERNEL32.DLL
Import Module 002: ADVAPI32.DLL
Import Module 003: MSVBVM60.DLL+++++++++++++++++++ IMPORT MODULE DETAILS +++++++++++++++ Import Module 001: KERNEL32.DLL Addr:77E8399F hint(0000) Name: Sleep
Addr:77E8B6CE hint(0000) Name: CreateDirectoryA
Addr:77E9CB5F hint(0000) Name: GetComputerNameA Import Module 002: ADVAPI32.DLL Addr:77DB41D4 hint(0000) Name: RegCreateKeyExA
Addr:77DB213D hint(0000) Name: RegCloseKey
Addr:77DB523F hint(0000) Name: RegDeleteKeyA
Addr:77DB431F hint(0000) Name: RegSetValueExA
Addr:77DB3A3A hint(0000) Name: RegEnumKeyExA
Addr:77DB2276 hint(0000) Name: RegOpenKeyExA
Addr:77DB2A57 hint(0000) Name: RegQueryValueExA
Addr:77DB6835 hint(0000) Name: RegQueryInfoKeyA Import Module 003: MSVBVM60.DLL
我知道VB对DLL的调用通常都是 DllFunctionCall 实现的,那么另外两个DLL的直接调用是如何实现的?
难道是VC编程调用的VB6的MSVBVM60.DLL?
+++++++++++++++++++ IMPORTED FUNCTIONS ++++++++++++++++++
Number of Imported Modules = 3 (decimal) Import Module 001: KERNEL32.DLL
Import Module 002: ADVAPI32.DLL
Import Module 003: MSVBVM60.DLL+++++++++++++++++++ IMPORT MODULE DETAILS +++++++++++++++ Import Module 001: KERNEL32.DLL Addr:77E8399F hint(0000) Name: Sleep
Addr:77E8B6CE hint(0000) Name: CreateDirectoryA
Addr:77E9CB5F hint(0000) Name: GetComputerNameA Import Module 002: ADVAPI32.DLL Addr:77DB41D4 hint(0000) Name: RegCreateKeyExA
Addr:77DB213D hint(0000) Name: RegCloseKey
Addr:77DB523F hint(0000) Name: RegDeleteKeyA
Addr:77DB431F hint(0000) Name: RegSetValueExA
Addr:77DB3A3A hint(0000) Name: RegEnumKeyExA
Addr:77DB2276 hint(0000) Name: RegOpenKeyExA
Addr:77DB2A57 hint(0000) Name: RegQueryValueExA
Addr:77DB6835 hint(0000) Name: RegQueryInfoKeyA Import Module 003: MSVBVM60.DLL
我知道VB对DLL的调用通常都是 DllFunctionCall 实现的,那么另外两个DLL的直接调用是如何实现的?
难道是VC编程调用的VB6的MSVBVM60.DLL?
就像VC++的MSvcCtr.dll一样
你可以搜索win32.tlb
其实VB也没什么稀奇嘛,调用Windows API 只要用Declare声明,对COM对象(包括ActiveX DLL,也就是你说的OCX)只要CreateObject就可以,而且VB的集成开发界面也可以直接导入tlb(Type Library), Lib(Library) 甚至VC程序员熟悉的 .Res等等其实我觉得反汇编 关键找到跳转点(函数调用位置) 和 关键的标识(字符串,Addr等等)
你可以尝试 用VB开发一个程序 用Declare声明三个API
Public Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)Public Declare Function CreateDirectory Lib "kernel32" Alias "CreateDirectoryA" (ByVal lpPathName As String, lpSecurityAttributes As SECURITY_ATTRIBUTES) As LongPublic Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long反汇编应该也能看到:
Import Module 001: KERNEL32.DLL Addr:77E8399F hint(0000) Name: Sleep
Addr:77E8B6CE hint(0000) Name: CreateDirectoryA
Addr:77E9CB5F hint(0000) Name: GetComputerNameA
重复
我贴的API 来自API Viewer for Microsoft Visual Basic
那个程序是按格式来合成代码字符串的,如果Sleep有SleepA 和 SleepW两个版本
才是Alias既然大家那么热情我也逆向一下看看吧,大家学习学习!
现成的win.tlb,估计也用不上,因为我要把一些东西用VC 做成DLL, 所以现成的tlb里肯定没有我的API。看来还要去学习如何制作TLB,要学习的东西实在太多了。