设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2686|回复: 4
打印 上一主题 下一主题

[已经解决] 求API TerminateProcess函数使用方法0.0

[复制链接]
头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
11 小时
注册时间
2011-3-9
帖子
13
跳转到指定楼层
1
发表于 2011-3-14 11:20:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
2
发表于 2011-3-14 12:37:32 | 只看该作者
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 处理。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
11 小时
注册时间
2011-3-9
帖子
13
3
 楼主| 发表于 2011-3-14 13:31:59 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
4
发表于 2011-3-14 23:33:01 | 只看该作者
本帖最后由 苏小脉 于 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
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
11 小时
注册时间
2011-3-9
帖子
13
5
 楼主| 发表于 2011-3-15 10:05:11 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-12-26 09:50

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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