看了软件加密技术内幕的最后关于VB内嵌汇编的部分,可惜小楼前辈对这部分讲的不是很详细,对我等菜鸟来说实在是不明不白。尤其是VBInlineAsm只是一笔带过,都不知道是怎么加载的,后来经过摸索,总算有点眉目,写出来供我等菜鸟分享心得:
一、启动VB6,选择菜单-外接程序-外接程序管理器-选中 Visual Component Manager6.0,勾选“在启动中加载”和“加载/卸载”。
二、重新启动VB6,这时,工具栏中已经多了个Visual Component Manager ,点击打开组建管理器,新建一组建文件夹,新建一个部件,选中VbInLineASM.dll即可,类型为COM Server Library,完成后工具栏中多出个VbInLineASM的ASM图标 .
三、先装好MASM编译器,设置好ML.EXE和LINK.EXE,然后设置VbInLineASM。点击ASM图标,选择Change Settings ,在底部的Assembler Path中选择ML.EXE的路径,一般在MASM的BIN文件夹下,勾选Keep Setting UP后按ESC键退出。
四、使用方法:
*VB中新建一个类
*声明方法:Public Function Test(Byval Argument1)
End Function
*ASM语句格式:'#ASM_START
...
'#ASM_END
五、一个实例:
Option Explicit
Dim ct As CTest, ct2 As CTest
Private Sub cmd2_Click()
Set ct2 = New CTest
MsgBox ct2.ClsFunc, , "cls #2"
End Sub
Private Sub cmdTesting_Click()
Set ct = New CTest
MsgBox ct.ClsFunc, , "cls #1"
End Sub
Private Sub Form_Unload(Cancel As Integer)
Set ct = Nothing
Set ct2 = Nothing
Set frmInterface = Nothing
End Sub
================CTest.CLS===============
Option Explicit
Public Function ClsFunc() As Long
'''The "_ClsFunc" variables are added by VB....
'#ASM_START
' push ebp ;Save EBP
' mov ebp, esp ; Move ESP into EBP so we can refer
' ; to arguments on the stack
' push ebx
' push esi ;save registers
' push edi
'
' ;Start Add code Here
'
' mov DWORD PTR _ClsFunc2$[ebp], 12345678 ;return this number
'
' ;End Add code Here
'
' mov eax, DWORD PTR _ClsFunc1$[ebp]
' mov ecx, DWORD PTR _ClsFunc2$[ebp]
' mov DWORD PTR [eax], ecx
'
' pop edi ;restore registers
' pop esi
' pop ebx
' mov esp, ebp ;MOV/POP is much faster
' pop ebp ;on 486 and Pentium than Leave
' ret 8 ; Return with 8 byte(long)
'#ASM_END
End Function
六、技术支持
网站 http://persistentrealities.com/vbfibre/ 有很多相关信息。
注意:该插件有个BUG,VB工程必须置于盘符根目录,文件名不能用中文(这点非常重要)。另外只有编译后汇编代码才能实现功能。不能用P-CODE编译。