Sub CallAsmRun(x As Single, y As Single, z As Single, fly As Long) '走路
Dim asm As New clsASM
Const Address1 = &H45E2F0
Const Address2 = &H461D60
Const Address3 = &H45E6F0
With asm
    .Pushad                                '!PUSHAD
    .SUB_ESP &HC                          '!SUB ESP,&HC
    .Mov_EAX_DWORD_Ptr World2_Asm          '!MOV EAX, DWORD PTR DS:[%W2i_Base]
    .Mov_EAX_DWORD_Ptr_EAX_Add &H1C        '!MOV EAX, DWORD PTR DS:[EAX+&H1C]
    .Mov_ESI_DWORD_Ptr_EAX_Add &H20        '!MOV ESI, DWORD PTR DS:[EAX+&H20]
    .Mov_ECX_DWORD_Ptr_ESI_Add &HB74      '!MOV ECX, DWORD PTR DS:[ESI+&HB74]
    .Push 1                                '!PUSH 1
    .Mov_EDX Address1                      '!MOV EDX,&H45E9B0
    .Call_EDX                              '!CALL EDX
    .Mov_EDI_EAX                          '!MOV EDI, EAX
    .Mov_EAX Float2Int(x)                  '!MOV EAX,x
    .Mov_DWORD_Ptr_ESP_EAX                '!MOV [ESP],EAX
    .Mov_EAX Float2Int(z)                  '!MOV EAX,z
    .Mov_DWORD_Ptr_ESP_ADD_EAX &H4        '!MOV [ESP+4],EAX
    .Mov_EAX Float2Int(y)                  '!MOV EAX,y
    .Mov_DWORD_Ptr_ESP_ADD_EAX &H8        '!MOV [ESP+8],EAX
    .Push_ESP                              '!PUSH ESP
    .Push fly                              '!PUSH fly
    .Mov_ECX_EDI                          '!MOV ECX, EDI
    .Mov_EDX Address2                      '!MOV EDX,&H462410
    .Call_EDX                              '!CALL EDX
    .Push 0                                '!PUSH 0
    .Push 1                                '!PUSH 1
    .Push_EDI                              '!PUSH EDI
    .Mov_ECX_DWORD_Ptr_ESI_Add &HB74      '!MOV ECX, DWORD PTR DS:[ESI+&HB74]
    .Push 1                                '!PUSH 1
    .Mov_EDX Address3                      '!MOV EDX,&H45EDB0
    .Call_EDX                              '!CALL EDX
    .Mov_EAX_DWORD_Ptr World2_Asm          '!MOV EAX, DWORD PTR DS:[%W2i_Base]
    .Mov_EAX_DWORD_Ptr_EAX_Add &H1C        '!MOV EAX, DWORD PTR DS:[EAX+&H1C]    .Mov_EBX_ESP                          '!MOV EBX,ESP
    .Mov_EAX_DWORD_Ptr_EBX                '!MOV EAX, DWORD PTR [EBX]
    .Mov_DWORD_Ptr_ECX_ADD_EAX &H20        '!MOV [ECX+&H20], EAX
    .Mov_EAX_DWORD_Ptr_EBX_Add &H4        '!MOV EAX, DWORD PTR [EBX+4]
    .Mov_DWORD_Ptr_ECX_ADD_EAX &H24        '!MOV [ECX+&H24], EAX
    .Mov_EAX_DWORD_Ptr_EBX_Add &H8        '!MOV EAX, DWORD PTR [EBX+8]
    .Mov_DWORD_Ptr_ECX_ADD_EAX &H28        '!MOV [ECX+&H28], EAX
    .Add_ESP &HC                          '!ADD ESP,&HC
    .Popad                                '!POPAD
    .ret
End With
asm.inject hProcId
asm.Run_ASM hProcId, 0
asm.free hProcId, 0
End Sub 上面是所谓vb调用call的代码
vb调用call就是调用游戏内部函数吗?
原理是什么哪?

解决方案 »

  1.   

    内嵌汇编的一种方法,必须有汇编原理知识和vb函数编译知识,知道vb源码编译后函数使用的栈、寄存器等规则。
      

  2.   

    很明显这个程序虽然是用VB写的,但其实是用汇编写的。并且这个汇编类被封装了,就是这个call开头定义的clsASM,这个类里边把汇编指令都封装了,然后在这个call函数里就如同用汇编语言一样的写了这些程序。这些程序vb的程序员很难读懂,你最好还是问汇编的程序员吧。
      

  3.   

    没有接触过VB写汇编的内容,开了眼界楼主可以考虑用Delphi来代替,Delphi可以很方便的内嵌汇编。