是通过什么函数杀挂钩OPENPROCESS的杀进程函数的

是通过什么函数杀挂钩OPENPROCESS的进程的_百度知道
是通过什么函数杀挂钩OPENPROCESS的进程的
我有更好的答案
OPENPROCESS的进程
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。查看:3796|回复:7
复制内容到剪贴板代码:DWORD enterProcess[1024] = {0},ProcessNum=0,needC
if (!EnumProcesses(enterProcess,sizeof(enterProcess),&needChar))
MessageBox(TEXT(&失败&));
//算出进程个数
ProcessNum = needChar/sizeof(DWORD);
//枚举进程
for (int index=0;index&ProcessN++index)
HANDLE hprocess = OpenProcess(PROCESS_ALL_ACCESS,false,enterProcess[index]);
int indexi = GetLastError();//此处错误返回有时候说拒绝访问,有时候说参数错误,求解析
if (hprocess)
TCHAR *pName = NULL;
DWORD len = 0;
len = GetModuleFileName((HMODULE)hprocess,pName,len);
pName = new TCHAR[len];
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
GetModuleFileName((HMODULE)hprocess,pName,len);
GetListCtrl().InsertItem(ProcessNum,pName);
delete [] pN
CloseHandle(hprocess);
}我写了个函数,想枚举所有的进程,可是OpenProcess这里运行遇到问题,问题见代码注释,谢谢!!!
版规,发帖可获2无忧币
中级工程师
论坛首席砖家
是否使用管理员运行?
版规,回帖可获2无忧币
引用:原帖由 OH51888 于
18:20 发表
是否使用管理员运行? 有道理
是不是权限问题
引用:原帖由 OH51888 于
18:20 发表
是否使用管理员运行? 是管理员
版规,回帖可获2无忧币
引用:原帖由 向立天 于
18:37 发表
是不是权限问题 是管理员
版规,回帖可获2无忧币
我试了一下你的代码
有的进程确实获取失败
但是有成功的
方法名称:OpenProcess
位置:Kernel32.dll
OpenProcess 函数用来打开一个已存在的进程对象,并返回进程的句柄。
1.函数原型
HANDLE OpenProcess(
DWORD dwDesiredAccess, //渴望得到的访问权限(标志)
BOOL bInheritHandle, // 是否继承句柄
DWORD dwProcessId// 进程标示符
2.返回值:
如成功,返回值为指定进程的句柄。
如失败,返回值为空,可调用GetLastError获得错误代码。
-------------------------------------------------------------
HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pID );
在OpenProcess之前,给你程序提升下权限看看!
版规,回帖可获2无忧币利用Hook API函数OpenProcess与TerminateProcess来防止任务管理器结束进程【转】 - Delphi7456 - 博客园
3个月学会delphi From
&&&&& 思路:其实比较简单,还是利用DLL,首写跟据API函数OpenProcess与TerminateProcess的结构自已编写两个与这两个API一样的函数,再利用GetProcAddress获取系统的那两个API函数入口地址,最后用WriteProcessMemory将你写的函数的地址替换掉原来系统的函数地址。这样所有调用这两系统API都将先执行你的函数。如果只Hook其中一个函数比如只hook OpenProcess的话那么任务管理器将不能获取到你的进程信息那么会出错。如果只hook TerminateProcess那样也不行,因为一个进程的句柄在本进程与别的进程中是不一样的,所以如果你不知道自已进程在别人进程中的句柄那么是没办法hook TerminateProcess的。本例中首先利用OpenProcess获取自已在别的进程中的句柄,然后hook TerminateProcess进程监控,如果发现有程序调用TerminateProcess并且所结束的对象正是自已,那么就给出提示窗口。------------------------------------------------调用部分unit Unit1;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdC
TForm1 = class(TForm)
Button1: TB
Button2: TB
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
{ Private declarations }
{ Public declarations }
Form1: TForm1;
procedure StartHook(pid: DWORD); external 'hookdll.dll';
procedure EndH external 'hookdll.dll';
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
StartHook(GetCurrentProcessId);
procedure TForm1.Button2Click(Sender: TObject);
-----------------------------------------------------------------------------------------DLL文件,全部实现都在这里---------------------& Hookdll.dprlibrary H
Windows,Dialogs,
unitHook in 'unitHook.pas';
HOOK_MEM_FILENAME
'tmp.hkt';
hhk: HHOOK;
Hook: array[0..2] of TNtHookC
//内存映射
MemFile: TH
startPid: PDWORD;
fhProcess: TH
//保存本进程在远程进程中的句柄
//拦截 OpenProcess
function NewOpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): TH
TNewOpenProcess = function (dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): TH
if startPid^ = dwProcessId then begin
Hook[1].UnH
Result := TNewOpenProcess(Hook[1].BaseAddr)(dwDesiredAccess, bInheritHandle, dwProcessId);
fhProcess:=R
Hook[1].UnH
Result := TNewOpenProcess(Hook[1].BaseAddr)(dwDesiredAccess, bInheritHandle, dwProcessId);
function NewTerminateProcess(hProcess: THuExitCode: UINT): BOOL; S
TNewTerminateProcess = function (hProcess: THuExitCode: UINT): BOOL; S
if fhProcess = hProcess then begin
showmessage('不准关闭我!');
Hook[2].UnH
Result := TNewTerminateProcess(Hook[2].BaseAddr)(hProcess, uExitCode );
procedure InitH
//安装 Hook
Hook[1] := TNtHookClass.Create('kernel32.dll', 'OpenProcess', @NewOpenProcess);
hook[2] := TNtHookClass.Create('kernel32.dll', 'TerminateProcess', @NewTerminateProcess);
procedure UninitH
//删除 Hook
for I := 0 to High(Hook) do
FreeAndNil(Hook[I]);
procedure MemShared();
MemFile:=OpenFileMapping(FILE_MAP_ALL_ACCESS,False, HOOK_MEM_FILENAME);
//打开内存映射文件
if MemFile = 0 then begin
MemFile := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0,
4, HOOK_MEM_FILENAME);
if MemFile && 0 then
//映射文件到变量
startPid := MapViewOfFile(MemFile,FILE_MAP_ALL_ACCESS,0,0,0);
//传递消息
function HookProc(nCode, wParam, lParam: Integer): I
Result := CallNextHookEx(hhk, nCode, wParam, lParam);
//开始HOOK
procedure StartHook(pid: DWORD);
startPid^ :=
hhk := SetWindowsHookEx(WH_CALLWNDPROC, HookProc, hInstance, 0);
//结束HOOK
procedure EndH
if hhk && 0 then
UnhookWindowsHookEx(hhk);
//环境处理
procedure DllEntry(dwResaon: DWORD);
case dwResaon of
DLL_PROCESS_ATTACH: InitH
DLL_PROCESS_DETACH: UninitH //DLL删除
StartHook, EndH
{ 分配DLL程序到 DllProc 变量 }
DllProc := @DllE
{ 调用DLL加载处理 }
DllEntry(DLL_PROCESS_ATTACH);
---------------------------&& 单元unitHook.pasunit unitH
Windows, Messages, Classes, SysU
//NtHook类相关类型
TNtJmpCode=packed record
Addr:DWORD;
dwReserved:B
TNtHookClass=class(TObject)
hProcess:TH
NewAddr:TNtJmpC
OldAddr:array[0..7] of B
BaseAddr:P
constructor Create(DllName,FuncName:NewFunc:Pointer);
destructor D
procedure H
procedure UnH
implementation
//==================================================
//NtHOOK 类开始
//==================================================
constructor TNtHookClass.Create(DllName: FuncName:NewFunc:Pointer);
DllModule:HMODULE;
dwReserved:DWORD;
//获取模块句柄
DllModule:=GetModuleHandle(PChar(DllName));
//如果得不到说明未被加载
if DllModule=0 then DllModule:=LoadLibrary(PChar(DllName));
//得到模块入口地址(基址)
BaseAddr:=Pointer(GetProcAddress(DllModule,PChar(FuncName)));
//获取当前进程句柄
hProcess:=GetCurrentP
//指向新地址的指针
NewAddr.MovEax:=$B8;
NewAddr.Addr:=DWORD(NewFunc);
NewAddr.JmpCode:=$E0FF;
//保存原始地址
ReadOK:=ReadProcessMemory(hProcess,BaseAddr,@OldAddr,8,dwReserved);
//开始拦截
//释放对象
destructor TNtHookClass.D
CloseHandle(hProcess);
//开始拦截
procedure TNtHookClass.H
dwReserved:DWORD;
if (ReadOK=False) then E
//写入新的地址
WriteProcessMemory(hProcess,BaseAddr,@NewAddr,8,dwReserved);
//恢复拦截
procedure TNtHookClass.UnH
dwReserved:DWORD;
if (ReadOK=False) then E
//恢复地址
WriteProcessMemory(hProcess,BaseAddr,@OldAddr,8,dwReserved);博客分类:
如果需要结束其他进程的执行,可以使用TerminateProcess函数。
BOOL TermintaeProcess(HANDLE hProcess,UINT uExitCode );
hProcess是要结束的目标进程的句柄,uExitCode指定目标进程的退出代码,可以使用GetExitCodeProcess取得一个进程的退出代码。
对于一个已经存在的进程,只能使用OpenProcess函数来取得这个进程的访问权限。
HANDLE OpenProcess(DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwProcessId );
dwDesiredAccess参数指定了对该进程的访问权限,这些权限可以是:PROCESS_ALL_ACCESS即所有可进行的权限;PROCESS_QUERY_INFORMATION即查看该进程信息的权限;还有很多。bInheritHandle参数指定此函数返回的句柄是否可以被继承。dwProcessId参数指定了要打开进程的ID号,可以从任务管理器中找到它们,也可以使用ToolHelp函数获取。
我用VB写的shellCmd类:
Option Explicit
Private Const PROCESS_ALL_ACCESS = &H1F0FFF
Private Const PROCESS_QUERY_INFORMATION = &H400
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32.dll" (ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32.dll" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Public Function CloseProcess(ByVal dwProcessId As Long) As Boolean
Dim hProcess As Long
Dim lpExitCode As Long
hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, dwProcessId)
If hProcess = 0 Then
CloseProcess = False
Exit Function
If GetExitCodeProcess(hProcess, lpExitCode) = 0 Then
CloseProcess = False
CloseHandle (hProcess)
Exit Function
If TerminateProcess(hProcess, lpExitCode) = 0 Then
CloseProcess = False
CloseProcess = True
CloseHandle (hProcess)
End Function
Public Function IsRunning(ByVal ProgramID) As Boolean
Dim hProgram As Long
hProgram = OpenProcess(PROCESS_QUERY_INFORMATION, False, ProgramID)
If hProgram && 0 Then
IsRunning = True
IsRunning = False
CloseHandle hProgram
End Function
我用VB写的调用这个类的函数:
'shellCmd在ASP中调用CMD.EXE执行DOS下的EXE程序
'cmdStr为由CMD.exe及DOS下的EXE文件名路径名组成的字符串
'返回值为执行EXE所用的秒数
Public Function myShell(cmdStr) As Single
Dim start, b, PID, ret, useTime, hProcess
Set myshellclass = New shellCmd
startTime = GetTickCount()
useTime = 0
PID = Shell(cmdStr, vbHide)
'vbNormalFocus显示窗口
Do While myshellclass.IsRunning(PID) And useTime & 3000
useTime = GetTickCount() - startTime
Call myshellclass.CloseProcess(PID) '若该进程在运行则关闭它
myShell = GetTickCount() - startTime
End Function
hanbaohong
浏览: 247823 次
来自: 广州
最近了解到一款StratoIO打印控件,功能如下:1、Html ...
收下以后有空再看,朋友最好是将所有文件打包上传,好上我这些初 ...
不错呀,总结得很好.......
代表广大学习人民,谢谢您.. ...
弃暗投明,呵呵~~
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 c 监控进程获取函数 的文章

 

随机推荐