当前位置:编程学习 > VB >>

请大家帮我看看这几个函数的功能是什么,谢谢了。

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
'Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess as long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize as long, lpNumberOfBytesWritten as long) as long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesRead As Long) As Long
'Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject as long) as long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Const PROCESS_ALL_ACCESS = &H1F0FFF
Dim h As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function CreateRemoteThread Lib "kernel32" (ByVal hProcess As Long, lpThreadAttributes As Any, ByVal dwStackSize As Long, lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long
Private Declare Function VirtualFreeEx Lib "kernel32" (ByVal hProcess As Long, lpAddress As Any, ByVal dwSize As Long, ByVal dwFreeType As Long) As Long
Private Declare Function VirtualAllocEx Lib "kernel32" (ByVal hProcess As Long, lpAddress As Any, ByVal dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long
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

Const PAGE_EXECUTE_READWRITE = &H40
Const MEM_COMMIT = &H1000
Const MEM_RESERVE = &H2000
Const MEM_RELEASE = &H8000
Dim OPcode As String

Public Function Get_Result() As String
Dim i As Long
ReDim AsmCode(Len(OPcode) / 2 - 1) As Byte   'ReDim 语句 (Visual Basic)为数组变量重新分配存储空间?


For i = 0 To UBound(AsmCode) '可以使用UBound 确定数组中元素的总数,但是必须调整它返回的值,以解释下标从0 开始这一事实。
    AsmCode(i) = CByte("&H" & Mid(OPcode, i * 2 + 1, 2)) 'CByte()是将字符串、数字转换为Byte型,  Hex()是把10进制转换为16进制
Next
Get_Result = CallWindowProc(VarPtr(AsmCode(0)), 0, 0, 0, 0)
End Function

Public Function Get_Code() As String
Get_Code = OPcode
End Function

Public Function Run_ASM(hProcess As Variant) As Long
Dim i As Long, tmp_Addr As Long
ReDim AsmCode(Len(OPcode) / 2 - 1) As Byte
For i = 0 To UBound(AsmCode)
    AsmCode(i) = CByte("&H" & Mid(OPcode, i * 2 + 1, 2))
Next
tmp_Addr = VirtualAllocEx(hProcess, ByVal 0&, UBound(AsmCode) + 1, MEM_COMMIT, PAGE_EXECUTE_READWRITE)
WriteProcessMemory hProcess, ByVal tmp_Addr, ByVal VarPtr(AsmCode(0)), UBound(AsmCode) + 1, ByVal 0&
CreateRemoteThread hProcess, ByVal 0&, 0, ByVal tmp_Addr, ByVal 0&, ByVal 0&, ByVal 0&
VirtualFreeEx hProcess, tmp_Addr, UBound(AsmCode) + 1, MEM_RELEASE
End Function
--------------------编程问答-------------------- 全都是危险分子啊 --------------------编程问答-------------------- 等待高手啊。。 --------------------编程问答-------------------- 楼主想干什么?木马? --------------------编程问答-------------------- 哪里。。这个是人家写的VB汇编类的前面几个函数 。看不懂。请假大家一下。。非木马。 
--------------------编程问答-------------------- 从上至下:

'========================API声明==================
'根据类名或标题名获取窗口句柄
'获取指定线程的标识符(PID)
'打开进程
'写入进程内存数据
'读取内存进程数据
'关闭指定句柄
'复制内存
'关闭指定句柄----重复了
'写入进程内存数据----重复了
'创建远程线程
'在指定进程的虚拟空间释放内存
'在指定进程的虚拟空间分配内存
'函数回调 - 执行指定句柄处函数(VB内嵌汇编类主要函数) ==== 除了本函数,以上的声明主要用于远程注入(即将一段汇编代码注入到另一个已启动的线程,很多游戏外挂的常用方法!)
'=========================三个函数===================
'Get_Result - 执行当前汇编代码数据(16进制字符串)
'    首先将 16进制的字符串 形式的汇编代码转为 字节数组数据,然后执行 CallWindowProc 即可.
'    补充: 使用字符串操作不是效率的方法, 而且这个汇编类未考虑 CallWindowProc 参数的入栈出栈问题.
'Get_Code - 获取当前汇编代码的字符串数据
'Run_ASM - 远程注入当前汇编代码段到指定进程 (参数为进程句柄)
'    将字符串转字节数据并分配内存,然后拷贝汇编数据到指定内存,创建指定线程等待执行汇编代码,最后释放分配的内存.
'    补充: 对数据处理和释放的代码不是很完善.


将我现在在使用的汇编类截取一小部分供您参考(汇编数据以字节数据方式存储而不是使用字符串):
其中的 mAsmCode 是一个 CByteStream 类,即字节数据流处理类,包括了对字节数组常用的 添加/删除/提取/查看/清除等一系列操作.

'执行模块中的汇编代码段
Friend Function AsmRun() As Long
    Dim lRet As Long
    Dim TempCode As CByteStream
    If Started = False Then Exit Function
    If mAsmCode.Count = 0 Then Exit Function
    
    Set TempCode = mAsmCode.Clone
    Call FillAsmCode
    
    lRet = modBase.CallWindowProc(mAsmCode.DataPtr, 0, 0, 0, 0)        'VB中运行汇编最根本的就是这个函数
    
    mAsmCode.CloneFrom TempCode
    Set TempCode = Nothing
    Started = False
    AsmRun = lRet
End Function

'这个是往某个进程中注入所写的汇编代码
'注入的时候千万不要传入本程序中的任何东西的地址,比如字符串或者某个变量的地址,那样会让注入的程序崩溃
'记得一定要在汇编代码中加RET,不然也会让注入的进程崩溃
Friend Sub Inject(ByVal hPid As Long)
    Dim i As Long, tmp_Addr As Long, hProcess As Long, RThwnd As Long, lRet As Long
    Dim TempCode As CByteStream
    
    If mAsmCode.Count Then
        Set TempCode = mAsmCode.Clone
        Call FillAsmCode
        
        hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, hPid) '打开进程,得到进程句柄
        tmp_Addr = VirtualAllocEx(hProcess, ByVal 0&, mAsmCode.Count, MEM_COMMIT, PAGE_EXECUTE_READWRITE)
        WriteProcessMemory hProcess, ByVal tmp_Addr, ByVal mAsmCode.DataPtr, mAsmCode.Count, ByVal 0&
        RThwnd = CreateRemoteThread(hProcess, ByVal 0&, 0, ByVal tmp_Addr, ByVal 0&, ByVal 0&, ByVal 0&)
        Do
            lRet = WaitForSingleObject(RThwnd, 100)
            DoEvents
        Loop Until lRet <> WAIT_TIMEOUT
        VirtualFreeEx hProcess, ByVal tmp_Addr, mAsmCode.Count, MEM_DECOMMIT
        CloseHandle RThwnd
        CloseHandle hProcess
        
        mAsmCode.CloneFrom TempCode
        Set TempCode = Nothing
    End If
End Sub

'AsmRun / Inject 调用. 检查并修正汇编代码段的开头和结尾部分,确保堆栈平衡/指令完整结束等
Private Sub FillAsmCode()
    Const LENGTH_STEP As Long = 64
    Dim FillArr() As Byte, TmpArr() As Byte
    Dim i As Long, J As Long, L As Long
    '======================================
    ReDim FillArr(5)
    FillArr(0) = &H58         'POP AX
    FillArr(1) = &H59         'POP CX
    FillArr(2) = &H59         'POP CX
    FillArr(3) = &H59         'POP CX
    FillArr(4) = &H59         'POP CX
    FillArr(5) = &H50         'PUSH AX
    mAsmCode.PeekData TmpArr, , 6

    For i = 0 To 5
        If TmpArr(i) <> FillArr(i) Then Exit For
    Next i
    'lg = LenB(TmpArr(0)) * (UBound(TmpArr) + 1)
    'If modBase.CompMemory(TmpArr(0), FillArr(0), lg) <> lg Then  '保持堆栈平衡和保存返回地址
    If i <> 6 Then  '保持堆栈平衡和保存返回地址
        mAsmCode.GetData TmpArr
        mAsmCode.AddData FillArr
        mAsmCode.AddData TmpArr
    End If
    
    '======================================
    ReDim FillArr(2)
    FillArr(0) = &HC3         'RET 确保指令结尾加了RET
    FillArr(1) = &H90         'NOP 添加空指令防止将前次部分代码误认为地址等错误
    FillArr(2) = &H90         'NOP
    
    mAsmCode.PeekData TmpArr, mAsmCode.Count - 3, 3
    For i = 0 To 2
        J = i
        L = 0
        Do While (TmpArr(J) = FillArr(L))
            J = J + 1
            L = L + 1
            If J > 2 Then Exit For
        Loop
    Next i
    If L < 3 Then
        mAsmCode.AddData4Ptr VarPtr(FillArr(L)), 3 - L
    End If
    Erase FillArr: Erase TmpArr
    
    '======================================
    L = mAsmCode.Count Mod LENGTH_STEP      '为一个欲执行的代码段补齐 64 字节
    If L Then mAsmCode.Count = mAsmCode.Count + (LENGTH_STEP - L)
End Sub
--------------------编程问答-------------------- 好东西当然要收藏了 --------------------编程问答-------------------- 顶 --------------------编程问答-------------------- 貌似很清了
“远程注入当前汇编代码段到指定进程” --------------------编程问答-------------------- 万分感谢你。。。
补充:VB ,  基础类
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,