>> 欢迎您, 傲气雄鹰: 重登陆 | 退出 | 注册 | 资料 | 设置 | 排行 | 新贴 | 精华 | 管理 | 帮助 首页

  小榕软件实验室
  刀光雪影
  来教你如何在vb里嵌入汇编![转帖]
发表文章 发表涂鸦
  回复数:7  点击数:195 将此页发给您的朋友        
作者 主题: 来教你如何在vb里嵌入汇编![转帖] 回复 | 收藏 | 打印 | 篇末
傲气雄鹰帅哥哦
级别:本论坛版主
威望:0
经验:33
货币:3395
体力:99
来源:云南昆明
总发帖数:1599
注册日期:2002-01-21
查看 邮件 主页 QQ 消息 引用 复制 下载 

本贴绝对值得你珍藏.

下面的例子完全用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... UMGEDV@AOL.COM
'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
------------------------------end---------------------------
----------------------------------------------------------
本论坛不欢迎如下类型的帖子,此类帖子会被关闭或删除,本人恕不回复。
一,刀光雪影完全无关
二,无内容或内容过于简单,标题无意义的
三,个人联系的帖子。和标题为“某某请进”之类的
四,要求代破密码的
五,同一帖子多次重复的,灌水的
六,政治敏感话题,语言不文明,攻击他人的
七,溯雪手册中已有详细介绍或前面帖子中已有大量回复的

编辑 删除 发表时间发表于 2002-04-22.12:30:43   MSIE 5.01 Windows 2000IP: 已记录
傲气雄鹰帅哥哦
级别:本论坛版主
威望:0
经验:33
货币:3395
体力:99
来源:云南昆明
总发帖数:1599
注册日期:2002-01-21
查看 邮件 主页 QQ 消息 引用 复制 下载 

我看了觉得不错,因为高级语言很难完成低级所能完成,目前好象只有C语言才能调用,不知道大家怎么看!
----------------------------------------------------------
本论坛不欢迎如下类型的帖子,此类帖子会被关闭或删除,本人恕不回复。
一,刀光雪影完全无关
二,无内容或内容过于简单,标题无意义的
三,个人联系的帖子。和标题为“某某请进”之类的
四,要求代破密码的
五,同一帖子多次重复的,灌水的
六,政治敏感话题,语言不文明,攻击他人的
七,溯雪手册中已有详细介绍或前面帖子中已有大量回复的

编辑 删除 发表时间发表于 2002-04-22.12:39:07   MSIE 5.01 Windows 2000IP: 已记录
阿布帅哥哦
级别:一般站友
威望:0
经验:0
货币:204
体力:33.8
来源:丐帮天下
总发帖数:30
注册日期:2002-04-14
查看 邮件 主页 QQ 消息 引用 复制 下载 

如果可以那实在是好
----------------------------------------------------------

编辑 删除 发表时间发表于 2002-04-22.12:50:36   MSIE 5.0 Windows 98IP: 已记录
勇敢的人帅哥哦
级别:新手上路
威望:0
经验:0
货币:106
体力:30.2
来源:福建
总发帖数:2
注册日期:2002-04-22
查看 邮件 主页 QQ 消息 引用 复制 下载 

vb实现汇编??
晕了不起

编辑 删除 发表时间发表于 2002-04-22.13:07:18   MSIE 5.01 Windows 2000IP: 已记录
woodpecher帅哥哦
级别:中级站友
威望:0
经验:0
货币:18
体力:0.6
来源:上海
总发帖数:62
注册日期:2002-03-23
查看 邮件 主页 QQ 消息 引用 复制 下载 

将会带来病毒开发的新天地

编辑 删除 发表时间发表于 2002-04-22.14:29:59   MSIE 6.0 Windows 2000IP: 已记录
无产阶级帅哥哦
级别:老 站 友
威望:0
经验:0
货币:2157
体力:100
来源:218.0.29.*
总发帖数:461
注册日期:2002-03-23
查看 邮件 主页 QQ 消息 引用 复制 下载 

不会吧.病..我扫.
----------------------------------------------------------
代表中共无产阶级人民欢迎您的到来.
[img]http://www.22gb.com/forum/attachments/1Dp4dA_admin.gif[img]

编辑 删除 发表时间发表于 2002-04-22.14:38:10   MSIE 6.0 Windows 98IP: 已记录
kof2000帅哥哦
级别:光明使者
威望:0
经验:4
货币:5203
体力:98
来源:VisualStudio
总发帖数:2018
注册日期:2002-03-06
查看 邮件 主页 QQ 消息 引用 复制 下载 

VB使用ASM还有个办法是哟感一个老外的DLL来实现

总体太麻烦,没必要..
----------------------------------------------------------
VB/C/C++,网络安全技术...

编辑 删除 发表时间发表于 2002-04-22.15:45:21   MSIE 5.0 Windows 98IP: 已记录
金枪鱼帅哥哦
级别:新手上路
威望:0
经验:0
货币:143
体力:32.1
来源:新疆
总发帖数:5
注册日期:2002-04-22
查看 邮件 主页 QQ 消息 引用 复制 下载 

我的IE浏览器默认当前页被禁止使用,如何解决???请指教!!!

编辑 删除 发表时间发表于 2002-04-22.18:55:23   MSIE 5.0 Windows 98IP: 已记录
选择回复        
 快速回复主题: >>>高级模式
  用户名: 没有注册? 密码: 忘记密码?
记住密码
HTML语法
禁止IDB代码
禁止表情字符

[按 Ctrl+Enter 快捷键可直接提交帖子]
 投票评分: 共 0 票  
所有时间均为: 北京时间 ↑TOP 
关闭主题 拉前主题 移动主题 主题置顶 取消置顶 总固顶主题 取消总固顶 加入精华 移出精华 删除主题