安暮雨 发表于 2024-3-16 14:00:24

易语言调用dma实现监控按键的一种另类方法

本帖最后由 安暮雨 于 2024-3-16 14:02 编辑

国外uc论坛或其他地方给出的方案都是读主机csrss进程某个函数地址实现,但是这种方法经常由于各种用户系统问题不能兼容全面;
各位大鸟求轻喷
拿cs2举例把,找到某按键状态的地址通过读该地址的值去判断按键状态相对上面提出的方案会好用一点,但是弊端也很多,比如每个按键都要找到相对应的地址,但是这种方法是最快速的(以我目前所了解的),因为它所读取的地址是静态的,可以使用分散式读取,相比实时 VMMDLL_MemReadEx() 速度更快,下面是我分享的一个简单例子
不能用的自己删了,我直接复制的
.版本 2

.DLL命令 VMMDLL_CloseAll, , "vmm.dll", "@VMMDLL_CloseAll"

.DLL命令 VMMDLL_ProcessGetModuleBaseU, 长整数型, "vmm.dll", "@VMMDLL_ProcessGetModuleBaseU"
    .参数 句柄, 整数型
    .参数 PID, 整数型
    .参数 模块名称, 文本型

.DLL命令 VMMDLL_ProcessGetProcAddressU, 长整数型, "vmm.dll", "@VMMDLL_ProcessGetProcAddressU"
    .参数 h, 整数型
    .参数 pid, 整数型
    .参数 uszModuleName, 文本型
    .参数 szFunctionName, 文本型

.DLL命令 VMMDLL_MemWrite, 逻辑型, "vmm.dll", "@VMMDLL_MemWrite"
    .参数 句柄, 整数型
    .参数 PID, 整数型
    .参数 地址, 长整数型
    .参数 写入值, 字节集, 传址
    .参数 长度, 整数型

.DLL命令 VMMDLL_MemReadEx, 逻辑型, "vmm.dll", "@VMMDLL_MemReadEx"
    .参数 句柄, 整数型
    .参数 PID, 整数型
    .参数 地址, 长整数型
    .参数 返回值, 字节集, 传址
    .参数 长度, 整数型
    .参数 pcbReadOpt, 整数型, 传址
    .参数 flags, 长整数型

.DLL命令 VMMDLL_Scatter_Initialize, 整数型, "vmm.dll", "@VMMDLL_Scatter_Initialize", , HS
    .参数 句柄, 整数型
    .参数 PID, 整数型
    .参数 flags, 整数型, , 1

.DLL命令 VMMDLL_Scatter_CloseHandle, , "vmm.dll", "@VMMDLL_Scatter_CloseHandle", , HS
    .参数 hs, 整数型

.DLL命令 VMMDLL_Scatter_ExecuteRead, 逻辑型, "vmm.dll", "@VMMDLL_Scatter_ExecuteRead", , HS
    .参数 hs, 整数型

.DLL命令 VMMDLL_Scatter_Read, 逻辑型, "vmm.dll", "@VMMDLL_Scatter_Read"
    .参数 hs, 整数型
    .参数 va, 长整数型
    .参数 cd, 整数型
    .参数 pb, 字节集, 传址
    .参数 pcbRead, 整数型, 传址

.DLL命令 VMMDLL_Scatter_Prepare, 逻辑型, "vmm.dll", "@VMMDLL_Scatter_Prepare"
    .参数 hs, 整数型
    .参数 va, 长整数型
    .参数 cd, 整数型

.DLL命令 VMMDLL_Scatter_Clear, 逻辑型, "vmm.dll", "@VMMDLL_Scatter_Clear"
    .参数 hs, 整数型
    .参数 pid, 整数型
    .参数 flags, 整数型

.DLL命令 VMMDLL_Initialize, 整数型, "vmm.dll", "@VMMDLL_Initialize"
    .参数 数量, 整数型
    .参数 参数, 文本型, 数组

.DLL命令 VMMDLL_PidGetFromName, 逻辑型, "vmm.dll", "@VMMDLL_PidGetFromName"
    .参数 句柄, 整数型
    .参数 进程名称, 文本型
    .参数 返回进程ID, 整数型, 传址

.DLL命令 VMMDLL_ProcessGetInformationAll, 逻辑型, "vmm.dll", "@VMMDLL_ProcessGetInformationAll"
    .参数 hVMM, 整数型
    .参数 pProcessInformationAll, VMMDLL_PROCESS_INFORMATION, 传址 数组
    .参数 cProcessInformation, 整数型, 传址

.DLL命令 VMMDLL_PidList, 逻辑型, "vmm.dll", "@VMMDLL_PidList"
    .参数 hVMM, 整数型
    .参数 数据, 字节集, 传址
    .参数 pcPIDs, 长整数型, 传址

.DLL命令 IsBadStringPtrA, 整数型, "kernel32.dll", "IsBadStringPtrA", , 指针是否有效,无否返回1
    .参数 指针, 整数型
    .参数 ucchMax, 整数型, , 指针长度

.DLL命令 VMMDLL_ProcessGetInformation, 逻辑型, "vmm.dll", "@VMMDLL_ProcessGetInformation"
    .参数 hVMM, 整数型
    .参数 dwPID, 整数型
    .参数 pProcessInformation, VMMDLL_PROCESS_INFORMATION, 传址
    .参数 pcbProcessInformation, 长整数型

.DLL命令 LocalSize__, 整数型, "kernel32.dll", "LocalSize"
    .参数 hMem, VMMDLL_PROCESS_INFORMATION

.DLL命令 VMMDLL_Pid_List, 文本型, "vmm.dll", "@VMMDLL_Pid_List"
    .参数 hVMM, 整数型
    .参数 dwPid, 整数型

.DLL命令 su_init_config, 长整数型, "SuGetKeyState", "su_init_config"
    .参数 h, 整数型
    .参数 dwPID, 整数型
    .参数 address, 长整数型

.DLL命令 GetAsyncKeyState, 整数型, "user32.dll", "GetAsyncKeyState", , 确定在调用函数时键是向上还是向下,以及键是在上一次调用GetAsyncKeyState 后按下的。
    .参数 vKey, 整数型, , 您可以使用左区分和右区分常量来指定某些键。有关详细信息,请参阅备注部分。

.DLL命令 VMMDLL_Map_GetModuleFromNameU, 逻辑型, "vmm.dll", "@VMMDLL_Map_GetModuleFromNameU"
    .参数 hVMM, 整数型
    .参数 dwPID, 整数型
    .参数 uszModuleName, 文本型
    .参数 ppModuleMapEntry, VMMDLL_MAP_MODULEENTRY, 传址
    .参数 flags, 整数型

.DLL命令 VMMDLL_Map_GetEATU, 逻辑型, "vmm.dll", "@VMMDLL_Map_GetEATU"
    .参数 hVMM, 整数型
    .参数 dwPID, 整数型
    .参数 uszModuleName, 文本型
    .参数 ppEatMap, VMMDLL_MAP_EAT, 传址

.DLL命令 VMMDLL_MemFree, , "vmm.dll", "@VMMDLL_MemFree"
    .参数 pvMem, 整数型, 传址

.DLL命令 dma_key_init, 长整数型, "dmatool.dll", "@dma_key_init"
    .参数 hVMM, 整数型

.DLL命令 update_keystate, 逻辑型, "dmatool.dll", "@update_keystate"
    .参数 hVMM, 整数型
    .参数 vk, 整数型


分散
.版本 2

.子程序 DMA分散初始化, 整数型
.参数 dwPID, 整数型

返回 (VMMDLL_Scatter_Initialize (VMM句柄, dwPID, 位与 (1, 32)))

.子程序 DMA分散设置, 逻辑型
.参数 hs, 整数型
.参数 地址, 长整数型
.参数 长度, 整数型

返回 (VMMDLL_Scatter_Prepare (hs, 地址, 长度))

.子程序 DMA分散读取, 字节集
.参数 hs, 整数型
.参数 地址, 长整数型
.参数 长度, 整数型
.局部变量 _局部1, 字节集
.局部变量 _局部2, 整数型

_局部1 = 取空白字节集 (长度)
VMMDLL_Scatter_Read (hs, 地址, 长度, _局部1, _局部2)
返回 (_局部1)

.子程序 DMA分散执行, 逻辑型
.参数 hs, 整数型

返回 (VMMDLL_Scatter_ExecuteRead (hs))

.子程序 DMA分散关闭
.参数 hs, 整数型

VMMDLL_Scatter_CloseHandle (hs)

.子程序 DMA分散清除, 逻辑型
.参数 hs, 整数型
.参数 dwpid, 整数型
.参数 flags, 整数型

返回 (VMMDLL_Scatter_Clear (hs, dwpid, flags))


.版本 2

.子程序 分散读字节集ex, 字节集
.参数 句柄, 整数型
.参数 地址, 长整数型
.参数 长度, 整数型
.局部变量 返回值, 字节集

.如果真 (句柄 > 0)
    .如果真 (DMA分散执行 (句柄))
      返回值 = DMA分散读取 (句柄, 地址, 长度)
    .如果真结束

.如果真结束
返回 (返回值)分散操作句柄 = DMA分散初始化 (PID)
DMA分散设置 (分散操作句柄 , 左键状态, 4)

左键状态 = 取字节集数据 (分散读字节集ex (分散操作句柄 , 左键地址, 4), #整数型, ) = 65535‘65535为按住,最好是判断按住的值

yxlm2003 发表于 2024-3-21 13:16:04

哥那个dam 读写 能加个特征码搜索吗
页: [1]
查看完整版本: 易语言调用dma实现监控按键的一种另类方法