发新话题
打印

[转载]完全用VB进行ASM编程的示例

[转载]完全用VB进行ASM编程的示例

文章作者:Vxk

完全用VB进行ASM编程的示例

                        by Vxk/CVC.GB

下面的例子完全用VB进行ASM编程的示例,本例获得CPU ID.

工程文件分为一个form1.frm 和一个模块module1.bas

---------------------form1.frm的源文件---------------------
复制内容到剪贴板
代码:
VERSION 5.00

Begin VB.form form1

  Caption      =  "form1"

  ClientHeight   =  1965

  ClientLeft    =  60

  ClientTop     =  345

  ClientWidth    =  3105

  LinkTopic     =  "form1"

  ScaleHeight    =  1965

  ScaleWidth    =  3105

  StartUpPosition =  2  'Bildschirmmitte

  Begin VB.CommandButton Command1

    Caption      =  "Get CPU Name"

    Height       =  495

    Left        =  840

    TabIndex      =  0

    Top         =  315

    Width        =  1425

  End

  Begin VB.Label Label2

    Alignment     =  2  'Zentriert

    AutoSize      =  -1  'True

    BeginProperty Font

      Name        =  "MS Sans Serif"

      Size        =  9.75

      Charset      =  0

      Weight       =  400

      Underline     =  0  'False

      Italic       =  0  'False

      Strikethrough  =  0  'False

    EndProperty

    Height       =  240

    Left        =  1515

    TabIndex      =  2

    Top         =  1065

    Width        =  60

  End

  Begin VB.Label Label1

    Alignment     =  2  'Zentriert

    AutoSize      =  -1  'True

    BeginProperty Font

      Name        =  "Arial"

      Size        =  12

      Charset      =  0

      Weight       =  700

      Underline     =  0  'False

      Italic       =  0  'False

      Strikethrough  =  0  'False

    EndProperty

    Height       =  285

    Left        =  1515

    TabIndex      =  1

    Top         =  1350

    Width        =  75

  End

End

Attribute VB_Name = "form1"

Attribute VB_GlobalNameSpace = False

Attribute VB_Creatable = False

Attribute VB_PredeclaredId = True

Attribute VB_Exposed = False

Option Explicit



Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, x As Single, Y As Single)



  Label1 = ""

  Label2 = ""



End Sub



Private Sub Command1_Click()

  

  Label1 = GetCpuName() & " CPU"

  Label2 = "You have a" & IIf(InStr("AEIOU", Left$(Label1, 1)), "n", "")



End Sub
------------------------------end---------------------------------

下面是modu1e.bas的源代码

----------------------module1.bas的源文件--------------------------
复制内容到剪贴板
代码:
Option Explicit

'

'This shows how to incorporate machine code into VB

'''''''''''''''''''''''''''''''''''''''''''''''''''

'The example fills the array with a few machine instructions and then copies

'them to a procedure address. The modified procedure is then called thru

'CallWindowProc. The result of this specific machine code is your CPU Vendor Name.

'

'##########################################################################

'Apparently it gets a Stack Pointer Error, but I don't know why; if anybody

'can fix that please let me know...                  [email]UMGEDV@AOL.COM[/email]

'The Error is not present in the native compiled version; so I think it got

'something to do with the P-Code Calling Convention (strange though)...

'##########################################################################

'

'Sub Dummy serves to reserve some space to copy the machine instructions into.

'

'

'Tested on Intel and AMD CPU's (uncompiled and compiled)

'

'

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

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)

Private x As Long



Public Function GetCpuName() As String



Dim MachineCode(0 To 35)  As Byte

Dim VarAddr          As Long

Dim FunctAddr         As Long

Dim EAX             As Long

Dim CPUName(1 To 12)    As Byte



'set up machine code

  

  MachineCode(0) = &H55   'push ebp

  

  MachineCode(1) = &H8B   'move ebp,esp

  MachineCode(2) = &HEC

  

  MachineCode(3) = &H57   'push edi

  

  MachineCode(4) = &H52   'push edx

  

  MachineCode(5) = &H51   'push ecx

  

  MachineCode(6) = &H53   'push ebx

  

  MachineCode(7) = &H8B   'move eax,dword ptr [ebp+8]

  MachineCode(8) = &H45

  MachineCode(9) = &H8

  

  MachineCode(10) = &HF   'cpuid

  MachineCode(11) = &HA2

  

  MachineCode(12) = &H8B  'mov edi,dword ptr [ebp+12]

  MachineCode(13) = &H7D

  MachineCode(14) = &HC

  

  MachineCode(15) = &H89  'move dword ptr [edi],ebx

  MachineCode(16) = &H1F

  

  MachineCode(17) = &H8B  'mov edi,dword ptr [ebp+16]

  MachineCode(18) = &H7D

  MachineCode(19) = &H10

  

  MachineCode(20) = &H89  'move dword ptr [edi],ecx

  MachineCode(21) = &HF

  

  MachineCode(22) = &H8B  'mov edi,dword ptr [ebp+20]

  MachineCode(23) = &H7D

  MachineCode(24) = &H14

  

  MachineCode(25) = &H89  'move dword ptr [edi],edx

  MachineCode(26) = &H17

  

  MachineCode(27) = &H58  'pop ebx



  MachineCode(28) = &H59  'pop ecx



  MachineCode(29) = &H5A  'pop edx



  MachineCode(30) = &H55  'pop edi

  

  MachineCode(31) = &HC9  'leave



  MachineCode(32) = &HC2  'ret 16    I tried everything from 0 to 24

  MachineCode(33) = &H10  '        but all produce the stack error

  MachineCode(34) = &H0

  

  'tell cpuid what we want

  EAX = 0

  

  'get address of Machine Code

  VarAddr = VarPtr(MachineCode(0))

  

  'get address of Sub Dummy

  FunctAddr = GetAddress(AddressOf Dummy)

  

  'copy the Machine Code to where it can be called

  CopyMemory ByVal FunctAddr, ByVal VarAddr, 35 '35 bytes machine code

  

  'call it

  On Error Resume Next 'apparently it gets a stack pointer error when in P-Code but i dont know why

    CallWindowProc FunctAddr, EAX, VarPtr(CPUName(1)), VarPtr(CPUName(9)), VarPtr(CPUName(5))

    'Debug.Print Err; Err.Description

    'MsgBox Err & Err.Description

  On Error GoTo 0

  

  GetCpuName = StrConv(CPUName(), vbUnicode) 'UnicodeName

  

End Function



Private Function GetAddress(Address As Long) As Long



  GetAddress = Address



End Function



Private Sub Dummy()



'the code below just reserves some space to copy the machine code into

'it is never executed



  x = 0

  x = 1

  x = 2

  x = 3

  x = 4

  x = 5

  x = 6

  x = 7

  x = 8

  x = 9

  x = 10

  x = 0

  x = 1

  x = 2

  x = 3

  x = 4

  x = 5

  x = 6

  x = 7

  x = 8

  x = 9

  x = 10

  

End Sub
人情如冰六月寒,花做一份艳,为谁笑人间? 如果任何人发现我转载的有图像的文章中图像失效或者文章有问题,请及时短消息通知我。先谢谢。::)) coup de foudre

TOP

[s:71]  [s:71]  [s:71]
vb 写 asm 这样也行 哈哈
爱我所爱 无愿无悔

TOP





basic里直接使用二进制指令,很古老的技术了:-)不过VB的代码还是第一次得见,细节上还是不一样.
不管怎么说,看上去真j8亲切...
Very Idiotic Person

TOP

发新话题