一次猜谜的过程:在VB里调用没有接口说明的DLL函数
本文来自qingye2008所发的此帖的讨论,感谢陈辉、马云剑、qingye的耐心指点和分享。
1、引言
话说qingye同学得到了一个用于加解密的Dll(该动态库在这里下载),通过Dll Export Viewer看到dll有2个导出函数分别是Dll_EncIn和Dll_EncOut,qingye同学想在VB中使用这两个函数。因为搞不到接口说明,只好通过查看汇编代码来猜测参数数量和类型。通过同学们的一番摸索,大致的过程小结如下:
(1)先用IDA之类的静态反汇编工具看函数的参数有几个、有没有返回值;(确定是两个、没有返回值)
(2)再用OD之类的动态反汇编调试工具看寄存器里存的参数具体是啥,并根据函数的预定功能,来猜测参数应该声明成什么类型的、应该传什么内容。
a) 比如这个函数的功能是加密,那根据功能猜测要传进去的参数至少应该有明文、也可能还有长度。另外函数应该还有个办法来返回加密后的密文,既然函数没有返回值,那有可能还有个传地址的参数是密文。所以,初步猜测应该有两个参数,一个传明文字符串,一个用来接收密文字符串。
b) 用OD跟进去看寄存器里的内容,发现传字符串“123”,寄存器里写的是“03313233”;再传字符串“123123”,寄存器里写的是“06313233313233”。这就可以确定,这个参数是字符串,字符串的编码是ANSI的(因为&H31是数字1的ANSI编码),字符串缓冲区之前的首字节是这个ANSI字符串的字节长度。
c) 考虑到这是个用Delphi实现的动态库,所以查阅Delphi的相关文档,确认Delphi中有一种叫做Short String的字符串符合b)里描述的特征,所以印证了这种猜测。
d) 两个参数,是密文在前还是明文在前呢?根据OD观察的结果,并且记住第一个参数后入栈,可以确定是密文在前,明文在后。
(3)根据以上猜测构造在VB里的声明。这就要用到这篇博文和这篇博文里提到的知识了。
2、传结构指针
先来看陈辉写的代码,我觉得是最好最简捷的写法了。
Option Explicit
Private Declare Function Dll_EncIn Lib "d:\EncryptionA.dll" (ByVal lpstrOutput As Long, _
ByVal lpstrInput As Long) As Long
Private Declare Function Dll_EncOut Lib "d:\EncryptionA.dll" (ByVal lpstrOutput As Long, _
ByVal lpstrInput As Long) As Long
Private
相关文档:
通过调用CreateDataSetfromXml取得XML数据
Imports System.Xml
Public Const FILE_CONFIG = "MZZ.xml"
Public Const PATH_CONFIG = "\XML\"
Dim dstXML As DataSet
Dim tblXML_DB As DataTable
Dim dtCod As New DataTable
Dim strSQL As String = ""
clsPublic ......
这段时间在移植项目的过程中,起初我想判断一个字符串中是否存在某字符(串),直接的使用方法是用instr(start,string1,string2,VB compare),但经过分析在VB中可以只用一下方法来判断!
1.常用的INStr方法
Function InStr([Start], [String1], [String2], [Compare A ......
如果原来没有使用过正则表达式,那么可能对这个术语和概念会不太熟悉。不过,它们并不是您想象的那么新奇。
请回想一下在硬盘上是如何查找文件的。您肯定会使用 ? 和 * 字符来帮助查找您正寻找的文件。? 字符匹配文件名中的单个字符,而 * 则匹配一个或多个字符。一个如 'data?.dat' 的模式可以找到下述文件:
data1.dat
......
作者: 佚名, 出处:IT专家网, 责任编辑: 谢妍妍,
2010-04-23 11:20
本文介绍VB对程序运行的监控。
转眼间,本系列文章已经写到了第六个,今天写点什么呢?
还是得写,看似VB做不到的事情,那么今天起就写写VB对操作系统的控制吧。
首先,说一说,VB对于被调用后的程序的监控方法。
原型函数简 ......
Option Explicit
Public Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
Public Declare Function RegCreateKey Lib "advapi32.dll" Alias ......