💰 DmGuardParams 大漠防护盾参数
🎯功能
DmGuard的加强接口,用于获取一些额外信息. 具体看下面参数介绍
📜语法
结果 = dm.DmGuardParams(cmd, subcmd, param)
📥参数
参数 | 数据类型 | 解释 |
---|---|---|
cmd | 字符串 | 盾类型. 这里取值为"gr" 或者"th" (以后可能会有扩充). 这里要注意的是,如果要获取指定的盾类型信息,必须先成功用DmGuard 开启此盾.比如这里的"gr" 必须dm.DmGuard 1,"gr" 开启成功才可以 |
subcmd | 字符串 | 针对具体的盾类型,需要获取的具体信息, 详见后面表格 |
param | 字符串 | 参数信息, 这里具体的含义取决于cmd和subcmd, 详见后面表格 |
参数表格含义
参数cmd 值 | 参数subcmd 值 | 参数param 格式 | 解释 |
---|---|---|---|
"gr" | "enum" | "pid" | 枚举指定进程的所有句柄, pid 为进程PID, 10进制形式 |
"gr" | "get" | "pid handle" | 获取指定进程的指定句柄信息(类型, 名字, 权限值), pid 为进程PID,10进制形式, handle 为句柄值,10进制形式 |
"gr" | "set" | "pid handle access" | 设置指定进程的指定句柄的权限值, pid 为进程PID,10进制形式, handle 为句柄值,10进制形式,access 为权限值,10进制形式 |
"gr" | "close" | "pid handle" | pid 为进程PID,10进制形式,handle 为句柄值,10进制形式, |
"th" | "enum" | "pid" | 枚举指定进程的所有线程, pid 为进程PID, 10进制形式 |
"th" | "get" | "pid" | 获取指定线程的详细信息(句柄值,优先级,ETHREAD,TEB,win32StartAddresss,线程地址所在的模块名,交换次数,线程状态,挂起次数), pid 为进程PID, 10进制形式 |
"th" | "resume" | "pid" | 恢复指定的线程.不可操作本线程. 当suspend_count大于0时,每调用一次resume,都会让suspend_count减1,直到0为止才会真正的恢复线程, pid 为进程PID, 10进制形式 |
"th" | "suspend" | "pid" | 挂起指定线程. 不可操作本线程, pid 为进程PID, 10进制形式 |
"th" | "terminate" | "pid" | 结束指定线程. 不可操作本线程, pid 为进程PID, 10进制形式 |
📤返回
字符串
, 根据不同的cmd
和subcmd
,返回值不同, 详见下表
不同参数返回值格式如下
参数cmd 值 | 参数subcmd 值 | 返回值格式 |
---|---|---|
"gr" | "enum" | `"handle1 |
"gr" | "get" | `"type |
"gr" | "set" | 成功返回"ok" ,否则为空字符串 |
"gr" | "close" | 成功返回"ok" ,否则为空字符串 |
"th" | "enum" | `"tid1 |
"th" | "get" | `"tid |
"th" | "resume" | 成功返回"ok" ,否则为空字符串 |
"th" | "suspend" | 成功返回"ok" ,否则为空字符串 |
"th" | "terminate" | 成功返回"ok" ,否则为空字符串 |
💡示例
// 枚举进程的所有句柄,并获取此句柄的信息,并打印出来
dm_ret = dm.DmGuard(1,"gr")
dm_ret = dm.DmGuardParams("gr","enum","1024")
If len(dm_ret) > 0 Then
ss = split(dm_ret,"|")
index = 0
count = UBound(ss) + 1
Do While index < count
dm_ret = dm.DmGuardParams("gr","get","1024 " & ss(index))
TracePrint dm_ret
index = index +1
Loop
End If
// 关闭指定进程的句柄
dm_ret = dm.DmGuard(1,"gr")
dm_ret = dm.DmGuardParams("gr","close","1024 240")
TracePrint dm_ret
// 修改指定进程的句柄的权限
dm_ret = dm.DmGuard(1,"gr")
dm_ret = dm.DmGuardParams("gr","set","1024 240 12345")
TracePrint dm_ret
// 枚举进程的所有线程,并把线程的信息都打印出来
dm_ret = dm.DmGuard(1,"th")
dm_ret = dm.DmGuardParams("th","enum","1024")
If len(dm_ret) > 0 Then
ss = split(dm_ret,"|")
index = 0
count = UBound(ss) + 1
Do While index < count
dm_ret = dm.DmGuardParams("th","get",ss(index))
TracePrint dm_ret
index = index +1
Loop
End If
// 结束指定线程. 注意后面的338是线程tid. 不是进程pid
dm_ret = dm.DmGuardParams("th","terminate","338")
// 挂起指定线程
dm_ret = dm.DmGuardParams("th","suspend","338")
// 恢复指定线程
dm_ret = dm.DmGuardParams("th","resume","338")
📘备注
gr盾对应的这些subcmd
,其实最主要的目的是"set"
, 设置句柄权限.
比如 场景1: 我们需要打开进程,或者打开线程,文件等等,如果在打开进程的权限里写了最高权限,那么由于一些保护措施,往往会失败. 但是如果你降低一些权限,比如用最低权限,反而会成功. 所以我们可以先用低权限打开对应的句柄,然后用"set"
来提权,这样就相当于用间接的方式用最高权限打开了句柄.
再比如场景2: 某些时候,有坏人打开我们自己的进程来做一些非法的事情,这时候我们可以通过扫描("enum"
功能),来检查是否有关我们进程的句柄,如果有的话,我们可以考虑直接关闭句柄("close"
),或者给他降低权限("set"
).
其它场景,请自行脑补. 可能又有人会问, 我怎么知道设定的权限值到底是多少呢? 这个很简单。 每种句柄都对应不同的权限,我们可以自己创建一个最高权限的句柄,来获取("get"
)这个句柄的信息,就知道最高权限对应的权限到底是多少. 同样最低权限也一样。这里一定要注意,不同类型的句柄,权限定义是不同的. 比如"Event"
和"File"
就是完全不同的权限值.
这里对进程句柄举个例子. 比如我们想获取最高权限的进程句柄权限值,那么操作如下
// 我们打开进程id为1024的句柄, 1024只是一个例子,必须换成真实存在的pid
handle = dm.OpenProcess(1024)
dm_ret = dm.DmGuard(1,"gr")
my_pid = GetCurrentProcessId() // 这个GetCurrentProcessId是调用系统API,获取当前进程ID,因为打开的句柄在本进程里
info = dm.DmGuardParams("gr","get",cstr(my_pid)& " " & cstr(handle))
ss = split(info,"|")
access = clng(ss(2))
// 那么这里的access就是最高权限的值了.
一般来说,每种句柄权限在不同系统里的定义都是相同的. 所以你可以在一个系统里获取到后,在其它系统里也是通用的.
ps : 上次有人问我,如何把一个别人正在读写的文件给强行打开读写,其实也是一个权限的事,增加一个SHARE_READ和SHARE_WRITE就OK了. 具体方法和上面这个进程句柄大同小异.