找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1850|回复: 1

[源码分享] ASM32本地汇编库

[复制链接]
  • TA的每日心情

    2018-6-1 15:26
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    13

    主题

    21

    回帖

    320

    积分

    中级会员

    积分
    320
    QQ
    类人猿 发表于 2017-8-23 12:31:39 | 显示全部楼层 |阅读模式
    本帖最后由 类人猿 于 2017-8-29 23:52 编辑

       这个是按键精灵2014或者按键9有效。按键X版本无效。(按键2014风琪仙)
    1. Declare Function Asm Lib  "ToAsm" Alias  "Asm"(ByVal code As String,ByVal 长度 As Long) As Long
    2. Declare Function SetRec Lib  "user32" Alias  "SetRect"(ByVal 矩形 As Any,ByVal 左边 As Long,ByVal 顶边 As Long,ByVal 右边 As Long,ByVal 底边 As Long) As Long
    3. Declare Function LocalAlloc  Lib "kernel32" Alias "LocalAlloc" (ByVal wOemChar As Long,ByVal wOmChar As Long) As Long
    4. Declare Function LocalFree Lib "kernel32" Alias "LocalFree" (ByVal hMem As Long) As Long
    5. Declare Function LocalSize Lib "kernel32" (ByVal hMem As Long) As Long
    6. Declare Sub RtlMoveMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal h As Any, ByRef f As Any, ByVal Length As Long)
    7. Declare Function CallWindowProcA Lib  "user32.dll" Alias  "CallWindowProcA"(ByVal 前1窗口函数地址 As Long,byref 窗口句柄 As Long,ByVal 消息值 As Long,ByVal 附加参数1 As Long,ByVal 附加参数2 As Long) As Long
    8. Declare Function RtlFillMemory Lib  "kernel32.dll" Alias  "RtlFillMemory"(ByVal 目的内存 As String,ByVal 长度 As Long,ByVal 填充内容 As Any) As Long
    9. Declare Function LoadLibraryA Lib  "kernel32.dll" Alias  "LoadLibraryA"(ByVal 动态链接库名称 As String) As Long
    10. Declare Function GetProcAddress Lib  "kernel32.dll" Alias  "GetProcAddress"(ByVal 模块句柄 As Long,ByVal 进程名称 As String) As Long
    11. Declare Function GetModuleHandleA Lib  "kernel32.dll" Alias  "GetModuleHandleA"(ByVal 模块名 As String) As Long
    12. Declare Function SetWindowsHook Lib  "user32.dll" Alias  "SetWindowsHookExA"(ByVal 钩子类型 As Long,ByVal 回调函数地址 As Long,ByVal 实例句柄 As Long,ByVal 线程ID As Long) As Long
    13. Declare Function UnhookWindowsHookEx Lib  "user32.dll" Alias  "UnhookWindowsHookEx"(ByVal 钩子句柄 As Long) As Long
    14. Declare Function RtlZeroMemory Lib  "kernel32.dll" Alias  "RtlZeroMemory"(ByVal 目的内存 As String,ByVal 长度 As Long) As Long
    15. Declare Function MultiByteToWideChar Lib  "kernel32.dll" Alias  "MultiByteToWideChar"(ByVal CodePage As Long,ByVal dwFlags As Long,ByVal lpMultiByteStr As Long,ByVal cchMultiByte As Long,ByVal lpWideCharStr As Long,ByVal lpWideCharStr As Long) As Long



    16. Function 取指针长度(指针)
    17. If 指针 > 0 Then
    18.         取指针长度 = LocalSize(指针)
    19.         Else
    20.         TracePrint "错误的指针!"
    21. End If
    22.         
    23. End Function


    24. Function 指针到文本(指针)
    25.   JS_txt_anjian = space(取指针长度(指针)\2)
    26.   RtlMoveMemory JS_txt_anjian, 指针, 取指针长度(指针)
    27.   指针到文本=JS_txt_anjian
    28. End Function


    29. Function  写代码(汇编代码)
    30.     Dim 局部数组, 指令集,临时值
    31.     指令集="EAX|EBX|ECX|EDX|ESP|EBP|ESI|EDI|AX|BX|CX|DX|AL|BL|CL|DL|AH|BH|CH|DH|DI|SI|BP|SP|IP|EIP|CS|DS|ES|SS"
    32.     //G_code_text = G_code_text + 汇编代码 + chr(10)
    33.     G_测试=汇编代码
    34.     If 汇编代码 <> "" Then
    35.         If Asm(G_测试, Len(G_测试)) = 0 Then //如果编译器认为出错

    36.             局部数组 = split(汇编代码, " ")
    37.             Select Case UBound(局部数组)
    38.             Case 0//为单一指令时,报错
    39.                 TracePrint "错误的指令>>>" + 汇编代码
    40.                 G_code_text = "XXXXXXXX"
    41.                 Goto OVER
    42.             Case 1// 为带操作数指令时,判断是否为调用函数
    43.                 临时值 = 取址(局部数组(1))
    44. //                TracePrint 临时值
    45.                 If 临时值>0 Then
    46.                     G_code_text = G_code_text + 局部数组(0) + " " + Cstr(临时值) + chr(10)
    47.                 Else
    48.                     If InStr("LOOP|JMP|JE|JNE|JB|JNB|JA|JNA|JCC|JZ|JE|JNZ|JNE|JS|JNS|JO|JNO|JP|JPE|JNP|JPO|JC|JB|JNAE|JNC|JNB|JAE", UCase(局部数组(0))) >= 0 Then
    49.                             if UBound(split(局部数组(1),","))=0 then
    50.                         G_code_text = G_code_text + 汇编代码 + chr(10)
    51.                             Goto over
    52.                         end if
    53.                     End If


    54.                     局部数组 = split(汇编代码, ",")
    55.                     If UBound(局部数组) = 1 Then
    56.                         临时值 = 取址(局部数组(1))
    57.                         If 临时值>0 Then
    58.                             G_code_text = G_code_text + 局部数组(0) + "," + Cstr(临时值) + chr(10)
    59.                         Else
    60.                             TracePrint "汇编代码:" + 汇编代码 + " 错误!" + "     位置>>>" + 局部数组(1)
    61.                            G_code_text = "XXXXXXXX"
    62.                             Goto OVER
    63.                         End If
    64.                     Else
    65.                         TracePrint "库中无此函数>>>" + 汇编代码
    66.                         G_code_text = "XXXXXXXX"
    67.                         Goto OVER
    68.                     End If
    69.                 End If        
    70.             End Select
    71.             //         TracePrint "汇编代码语法有误!错误的代码>>>【 " + G_测试+" 】"
    72.         Else
    73.             G_code_text = G_code_text +汇编代码+chr(10)
    74.         End If
    75.     End If
    76.     Rem OVER
    77.     写代码= 汇编代码
    78. End Function

    79. Function 运行代码Ex(代码指针,可选参数1, 可选参数2, 可选参数3, 可选参数4)
    80. if 代码指针<>0 then
    81. 运行代码Ex=CallWindowProcA(代码指针, 可选参数1, 可选参数2, 可选参数3, 可选参数4)
    82. Else
    83.    TracePrint "无效的指针"
    84.    运行代码Ex=0
    85. end if


    86. End Function

    87. Function 取代码指针()
    88. Dim 字节, 指针,数量
    89. 数量 = Asm(G_code_text, Len(G_code_text))//编译
    90. If 数量 > 0 Then
    91. CODE_字节 = space(数量)
    92. MultiByteToWideChar 0, 0, G_code_text, - 1 , CODE_字节, 数量//转换
    93. G_code_text=CODE_字节

    94.    字节 = split(G_code_text, "{")
    95.    字节 = split(字节(1), "}")
    96.    字节 = split(字节(0), ",")
    97.    取代码指针 = 写内存代码(字节)//装载


    98.    G_code_text = ""

    99.    Else
    100.    TracePrint "当前代码存在错误!请仔细检查。"
    101.    取代码指针 =0
    102. End If
    103. End Function

    104. sub 释放指针(指针)
    105. call LocalFree (指针)
    106. End sub


    107. Function 运行代码(可选参数1, 可选参数2, 可选参数3, 可选参数4)
    108. Dim 字节, 指针,数量
    109. 数量 = Asm(G_code_text, Len(G_code_text))//编译
    110. If 数量 > 0 Then
    111. CODE_字节 = space(数量)
    112. MultiByteToWideChar 0, 0, G_code_text, - 1 , CODE_字节, 数量//转换
    113. G_code_text=CODE_字节

    114.    字节 = split(G_code_text, "{")
    115.    字节 = split(字节(1), "}")
    116.    字节 = split(字节(0), ",")
    117.    指针 = 写内存代码(字节)//装载

    118. 运行代码 = CallWindowProcA(指针, 可选参数1, 可选参数2, 可选参数3, 可选参数4)//运行
    119.    G_code_text = ""
    120.    LocalFree 指针
    121.    Else
    122.    TracePrint "当前代码存在错误!请仔细检查。"
    123. End If
    124. End Function

    125. Function 取址(函数名)
    126.     Dim DLL集,lz,i,z
    127.     DLL集 = "kernel32.dll|user32.dll|winmm.dll|gdi32.dll|wininet.dll|"
    128.     DLL集=DLL集+dll_Name

    129.     lz=split(DLL集,"|")
    130.     For i = 0 To UBound(lz)
    131. TracePrint lz(i)
    132.         z = 取函数地址(lz(i), 函数名)
    133.         If z > 0 Then
    134.             Exit For
    135.         End If
    136.     Next
    137.     取址 = z
    138. End Function

    139. Sub 载入DLL(Dll名)
    140.     dll_Name=dll_Name+dll名+"|"
    141.     call LoadLibraryA(dll名)
    142. End Sub
    143. Function 取函数地址(dll名, 函数名)
    144.     Dim i,字节组,文本数组,字节数组,模块句柄,文_本_指_针
    145.     文_本_指_针 = LocalAlloc(0, len(函数名) + 1)
    146.     For i = 1 To len(函数名)
    147.         字节组=字节组&Asc(mid(函数名,i,1))&","               
    148.     Next
    149.     字节组 = 字节组 & "0"//Null结束符
    150.     文本数组 = split(字节组, ",")
    151.     字节数组 = 文本数组
    152.     For i = 0 To UBound(文本数组)
    153.         字节数组(i)=Cint(文本数组(i))
    154.     Next
    155.     字符_指针 = 写内存代码(字节数组)
    156.     模块句柄 = GetModuleHandleA(dll名)//先尝试获取模块句柄
    157.     If 模块句柄 <= 0 Then
    158.         模块句柄=LoadLibraryA(dll名)//如果模块没有加载,则加载
    159.     End If
    160.     //    MessageBox  模块句柄
    161.     取函数地址=GetProcAddress(模块句柄,字符_指针)
    162.     LocalFree 字符_指针        
    163. End Function
    164. Function 取数组指针(整数数组)'返回数组的首地址,构建和C语言一样的线性数组。
    165.     Dim 数组地址,结构指针
    166.     If VarType(整数数组) = 8204 Then
    167.         数组地址 = LocalAlloc(0, (UBound(整数数组) + 1) * 4)//申请内存构建数组,申请临时内存,用于取巧写整数,并内存清零!!
    168.         结构指针 = LocalAlloc(0, 16)
    169.         RtlFillMemory 数组地址, UBound(整数数组) + 1, 0
    170.         RtlFillMemory 结构指针, 16, 0
    171.         Dim 实际传送次数,写入指针,i//计算需要传送的次数,每次传送4个整数。不足4个算做4个。
    172.         实际传送次数 = UBound(整数数组)  + 1
    173.         实际传送次数 = 实际传送次数 \ 4
    174.         If 实际成员数 mod 4 <> 0 Then
    175.             实际传送次数 =实际传送次数+1
    176.         End If
    177.         写入指针=0//定义变量设置传送写入位置,开始循环写入,如果满4个,全部一起传送
    178.         For i = 0 To 实际传送次数
    179.             If i <= 实际传送次数 - 1 Then
    180.                 Call SetRec(结构指针, 整数数组(i*4), 整数数组(i*4+1), 整数数组(i*4+2), 整数数组(i*4+3))
    181.                 Call RtlMoveMemory (数组地址+写入指针*16, 结构指针, 16)//一次传送4个整数到内存。
    182.                 写入指针 = 写入指针 + 1
    183.                 //TracePrint i& "|" &整数数组(i * 4) & "|" & 整数数组(i * 4 + 1) & "|" & 整数数组(i * 4 + 2) & "|" & 整数数组(i * 4 + 3)
    184.             ElseIf i > 实际传送次数 - 1 Then//如果到了最后一次,可能不满4个
    185.                 If i * 4 = UBound(整数数组) Then //如果还剩一个
    186.                     Call SetRec(结构指针, 整数数组(i * 4), 0, 0, 0)
    187.                     Call RtlMoveMemory(数组地址 + 写入指针 * 16, 结构指针, 4)//传送1个整数到内存。
    188.                     //TracePrint "剩余1"
    189.                     Exit For
    190.                 ElseIf i * 4 + 1 = UBound(整数数组) Then//如果还剩二个
    191.                     Call SetRec(结构指针, 整数数组(i * 4), 整数数组(i * 4+1), 0, 0)
    192.                     Call RtlMoveMemory(数组地址 + 写入指针 * 16, 结构指针, 8)//传送2个整数到内存。
    193.                     //TracePrint "剩余2"
    194.                     Exit For
    195.                 ElseIf i * 4 + 2 = UBound(整数数组) Then//如果还剩3个
    196.                     Call SetRec(结构指针, 整数数组(i * 4), 整数数组(i * 4+1), 整数数组(i * 4+2), 0)
    197.                     Call RtlMoveMemory(数组地址 + 写入指针 * 16, 结构指针, 12)//传送3个整数到内存。
    198.                     //TracePrint "剩余3"
    199.                     Exit For
    200.                 ElseIf i * 4 + 3 = UBound(整数数组) Then//如果还剩4个
    201.                     Call SetRec(结构指针, 整数数组(i * 4), 整数数组(i * 4+1), 整数数组(i * 4+2), 整数数组(i * 4+3))
    202.                     Call RtlMoveMemory(数组地址 + 写入指针 * 16, 结构指针, 16)//传送4个整数到内存。
    203.                     //TracePrint "剩余4"
    204.                     Exit For
    205.                 End If
    206.             End If
    207.         Next
    208.         //TracePrint "写数组指针值:"&写入指针
    209.         写入指针=0
    210.         LocalFree 结构指针//释放临时申请的内存。
    211.         取数组指针 = 数组地址 //返回数组所在的地址。
    212.     Else         
    213.         取数组指针=0
    214.         TracePrint "这不一个整数型数组"               
    215.     End If
    216. End Function
    217. Function 写内存代码(字节数组)
    218.     Dim  i,临时数组
    219.     //写一个函数本身需要的汇编代码到内存,这个写的方试比汇编慢,用于支持第二步的进行。
    220.     临时数组 = Array(83, 51, 192, 51, 219, 139, 93, 12, 138, 69, 16, 136, 3, 91, 195)//汇编代码,写内存字节
    221.     Ccode = LocalAlloc(0, UBound(临时数组) + 1)
    222.     临时地址 = LocalAlloc(0, 16)
    223.     For i = 0 To UBound(临时数组)
    224.         Call SetRec (临时地址, 临时数组(i), 0, 0, 0)
    225.         Call RtlMoveMemory (Ccode+i, 临时地址, 1        )//拷贝到代码地址
    226.     Next
    227.     //申请内存装载汇编代码,及内存清零处理。
    228.     CS_code = LocalAlloc(0, UBound(字节数组) + 1)
    229.     RtlFillMemory CS_code, UBound(字节数组) + 1, 0
    230.     //把主代码写到内存
    231.     //    MessageBox  UBound(字节数组)
    232.     For i = 0 To UBound(字节数组)
    233.         call  CallWindowProcA(Ccode, CS_code + i, Clng(字节数组(i)), 0, 0)
    234.     Next
    235.     //返回和释放资源
    236.     写内存代码 =CS_code
    237.     LocalFree Ccode
    238.     LocalFree 临时地址
    239. End Function
    复制代码


    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|虫虫联盟 ( 备案号:蜀ICP备15018121号-1 )

    GMT+8, 2024-11-21 16:50 , Processed in 0.335924 second(s), 27 queries .

    Powered by Discuz! X3.5 Licensed

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表