看了软件加密技术内幕的最后关于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编译。

  • 标 题: 答复
  • 作 者:laomms
  • 时 间:2006-05-24 11:39

首先你要确定关联好ML.EXE,在链接旁边有个测试按钮测试一下,还有,直接在VB中运行是没有效果的,要编译成EXE文件后才可以实现,为了测试,你可以将设置中的DEBUG OPTIONS选项全部勾上,在编译的过程中就是会提示编译状态,而且在目录中做了纪录。

  • 标 题: 答复
  • 作 者:laomms
  • 时 间:2006-05-24 12:20

发现另外一个VB插件,可以在VB内嵌C和ASM代码:
ThunderVB is an add-in for VB6. ThunderVB let's you embed Asm and C instructions directly in you VB source programs. Furthermore ThunVB let's you create a true StdCall Dlls. Moreover ThunVB can extend VB IDE to a basic Asm/C code editor. That means it can do syntax-highlighting of Asm/C keywords and supports intelli-sense for InlineAsm code as well. See the screenshots bellow. --- ThunderVB Development Team [ drkIIRaziel & Libor ] ---

http://www.pscode.com/vb/scripts/ShowCode.asp?lngWId=1&txtCodeId=62038

  • 标 题: 答复
  • 作 者:laomms
  • 时 间:2006-05-28 11:04

关于ThunderVB,最新的版本是1.01,可惜作者已经停止开发,它可以在VB中直接内嵌ASM代码和C代码,还可以对代码进行着色,插入代码时会有即时帮助提示。但有几个注意点:
1. 首先安装 MASM 和 VC++ 环境,因为需要调用到vc 编译器cl.exe 和 MASM 编译器 ml.exe(MASM6.1以上的都可以,VC++ 6.0以上),并在插件中设置好ml.exe和cl.exe 的路径。
2. 可以下载其例子,如果例子中有调用库文件Lib  #include ,需要修改好对应的路径,inc很lib路径。
3. 由于是混合编译,所以必须完全编译运行(不能解释运行) 才能看到效果,即不能用P-CODE编译。
4. 目前好象还不支持中文的VB,作者说主要是由于它自己看不懂中文,他也没有没有中文版的VB。即该插件只支持英文版VB6.0,而且要打上英文版补丁SP6。另外不能跟前面介绍的inlineASM插件混用。
5. 调用方式:
   ASM代码:建一个类,贴上代码,汇编语句都是以'#asm'开头,如:

  Public Function IsAsmOn() As Boolean
  '#asm'
  '#asm'  mov eax, -1 
  '#asm'  retx         
  '#asm'
  End Function

   C代码:建一个类,贴上代码,汇编语句都是以'#c'开头,如:
   
   Public Function IsCOn() As Boolean
   '#c' int IsCOn()
   '#c' {
   '#c' return -1;
   '#c' }
   End Function

如果有兴趣可以到我的网络硬盘里下载或到官方网站下载:
http://free5.ys168.com/?langxang
http://sourceforge.net/projects/thundervb/
英文版VB和SP6补丁可以用电驴去搜索一下,挺多的,或者下英文版Microsoft Visual Studio 6.0,如果找不到可以联系我。