Project1

标题: 求API TerminateProcess函数使用方法0.0 [打印本页]

作者: wwqwwqwd    时间: 2011-3-14 11:20
提示: 作者被禁止或删除 内容自动屏蔽
作者: 苏小脉    时间: 2011-3-14 12:37
TerminateProcess 接受的是一个进程句柄,进程句柄可以唯一标识一个进程,而进程的模块名(在你的场合下就是 keys.exe)则不能。你可以先通过 CreateToolhelp32Snapshot 和 Process32Next 枚举所有进程,找到其模块名匹配 "keys.exe" 的,然后获取它的进程标识(PID),再通过 OpenProcess 从进程标识获取一个进程句柄。在 Win32 环境中,大致框架如下:

create_toolhelp_32_snapshot = Win32API.new('kernel32', 'CreateToolhelp32Snapshot', 'll', 'i')
process_32_next = Win32API.new('kernel32', 'Process32Next', 'ip', 'i')
open_process = Win32API.new('kernel32', 'OpenProcess', 'lil', 'i')
terminate_process = Win32API.new('kernel32' , 'TerminateProcess', 'ii', 'i')

process_entry_32 = ' ' * 296
handle_snapshot = create_toolhelp_32_snapshot.call(2, 0)
while process_32_next.call(handle_snapshot, process_entry_32) == 1
  if process_entry_32[36..-1][/^keys\.exe/]
    pid = process_entry_32[8..12].unpack("L")[0]
    handle_process = open_process.call(1, 0, pid)
    terminate_process.call(handle_process, 0)
  end
end

Process32Next 获取的只有模块名,如果想获取模块的完整路径需要使用 Module32Next,这样你就能区分两个模块名都是 keys.exe 但却是完全两个不同程序的进程了。

顺便问下Win32API.new里的kernel32,pi,i都是控制什么的啊?

p(不区分大小写)表示传递的是字符串指针,而 i 是本地 int 类型。Ruby 1.8 的源代码我没看过,但根据 Ruby 1.9 的源代码,可传递的不同的类型就只有这两种加上 v(void),l 会被当作 i 处理。
作者: wwqwwqwd    时间: 2011-3-14 13:31
提示: 作者被禁止或删除 内容自动屏蔽
作者: 苏小脉    时间: 2011-3-14 23:33
本帖最后由 苏小脉 于 2011-3-14 23:33 编辑

我没你的环境,只能远程调试了,先把这段代码输出共享一下。

process_entry_32 = ' ' * 296
p handle_snapshot = create_toolhelp_32_snapshot.call(2, 0)
while process_32_next.call(handle_snapshot, process_entry_32) == 1
  if process_entry_32[36..-1][/^keys\.exe/]
    p pid = process_entry_32[8..12].unpack("L")[0]
    p handle_process = open_process.call(1, 0, pid)
    p terminate_process.call(handle_process, 0)
  end
end
作者: wwqwwqwd    时间: 2011-3-15 10:05
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1