Chinaunix首页 | 论坛 | 博客
  • 博客访问: 22318
  • 博文数量: 12
  • 博客积分: 287
  • 博客等级: 二等列兵
  • 技术积分: 115
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-26 00:05
文章分类

全部博文(12)

文章存档

2011年(12)

我的朋友
最近访客

分类: Delphi

2011-02-26 00:36:55

话一:

曾经看过一些文章里大言不惭的写着,“不是VB6不支持指针,而是你水平太低”,接着还会告诉你用VarPtr获取变量地址,再用RtlMoveMemory函数来使用变量地址赋值。

我不得不说,此话的作者肯定是VB6的终极fans。为什么?两点原因:

1、此话作者对VB6的驾驭显得驾轻就熟,令我望其项背。

2、此话作者对指针的认识着实无法无天,令我极其汗颜。

为什么如此说呢?

首先,此类做法的确可以模拟个指针操作出来。其次,这样的操作效率能和指针的操作效率相提并论吗?实为照虎画猫,画蛇添足之作。

因而,坦然的说,不要迷恋所谓的无所不能,而要相信马克思前辈的客观唯物。

 

话二:

曾经看过一些VB6写外挂的同志用到一个名叫“clsAsm”的VB6类,用来实现VB6.0内嵌汇编。

原理如何呢?将一段汇编指令机器码写入内存,然后转交指令控制权于此段机器码开端,然后,这段机器码就得以执行了,当然这中间还需要对进行栈的维护和最终的RET。

此法很高明,可以通过内嵌汇编来高效执行一些代码。但,此法亦不足为效。

原因有二:

1、这个汇编类可以执行的汇编指令少的可怜,虽然可以扩充,也是一件很麻烦的事情,稍不留神就出错。

2、这个汇编类只是简单的顺序流程汇编指令序列。对于高级的内嵌汇编而言,简直是一无是处。再想想,如果这个汇编类真的很高明,人们还有必要去用汇编编译器么?

相对而言,VC6.0的内嵌汇编类则高明多了。这是由它的编译机制决定的。

俗话说,工具是死的,人是活的。我们不需要去照着虎模拟一个猫,而是需要选择恰当的东西做恰当的事。

 

最后,附上自己写的简单VB6.0内嵌汇编类。如果有兴趣,可以直接用Emit方法通过16进制机器码扩充此类或者直接使用机器码。但是上面已经说过了,不推荐。

  1. Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

  2. Dim CodeStr As String
  3. Dim AsmCode() As Byte

  4. Public Function Init()
  5.   CodeStr = "585959595950" '''维护栈
  6. End Function
  7. Public Sub Emit(ByVal opcode As String)
  8.   CodeStr = CodeStr & opcode
  9. End Sub

  10. Public Function Run()
  11.   CodeStr = CodeStr & "c3" '''RET
  12.   ReDim AsmCode(Len(CodeStr) / 2 - 1) As Byte
  13.   For i = 0 To UBound(AsmCode)
  14.     AsmCode(i) = CByte("&H" & Mid(CodeStr, i * 2 + 1, 2))
  15.   Next i
  16.   Run = CallWindowProc(VarPtr(AsmCode(0)), 0, 0, 0, 0)
  17. End Function
阅读(1767) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~