终极结束进程方法API


引言

最近在机房里上课的时候,学生的电脑上都安装了相应的学生端软件,而这些软件并没法正常关闭,用任务管理器也无法关闭,下面我说一下如何用Windows API对这类顽固程序进行终结。


福利方法

由于相关方面的规定,这里我只列出相应的操作函数和一些实现原理,具体程序代码我就不贴上了,想深入了解的,可以私信我。


方法一. 消息投递

这里用到的方法就是获取要关闭进程的窗口句柄,然后发送关闭消息到进程的消息队列中,让进程执行关闭消息,这样进程就会以正常的方式自动关闭,而且不会引发内存泄露等问题。(此方法能关闭大部分进程)

涉及API

//API_获得窗口关联进程ID
DWORD WINAPI GetWindowThreadProcessId(_In_      HWND    hWnd,_Out_opt_ LPDWORD lpdwProcessId
);
//API_取进程快照
HANDLE WINAPI CreateToolhelp32Snapshot(_In_ DWORD dwFlags,_In_ DWORD th32ProcessID
);
//API_枚举父窗口
BOOL WINAPI EnumWindows(_In_ WNDENUMPROC lpEnumFunc,_In_ LPARAM      lParam
);
//API_快照中获取进程列表
BOOL WINAPI Process32First(_In_    HANDLE           hSnapshot,_Inout_ LPPROCESSENTRY32 lppe
);
//API_遍历快照中进程列表
BOOL WINAPI Process32Next(_In_  HANDLE           hSnapshot,_Out_ LPPROCESSENTRY32 lppe
);
//API_关闭内核对象
BOOL WINAPI CloseHandle(_In_ HANDLE hObject
);
//API_投递消息
BOOL WINAPI PostMessageA(_In_opt_ HWND   hWnd,_In_     UINT   Msg,_In_     WPARAM wParam,_In_     LPARAM lParam
);

PostMessageA函数是关闭程序的关键只需要将Msg参数设置为AE_RESACCESS2即可,对应的值为18。此常量来源于lmaudit.h

//lmaudit.h
/*** This file has no copyright assigned and is placed in the Public Domain.* This file is part of the mingw-w64 runtime package.* No warranty is given; refer to the file DISCLAIMER.PD within this package.*/
#ifndef _LMAUDIT_
#define _LMAUDIT_#ifdef __cplusplus
extern "C" {
#endif#ifndef _LMHLOGDEFINED_
#define _LMHLOGDEFINED_typedef struct _HLOG {DWORD time;DWORD last_flags;DWORD offset;DWORD rec_offset;} HLOG,*PHLOG,*LPHLOG;#define LOGFLAGS_FORWARD 0
#define LOGFLAGS_BACKWARD 0x1
#define LOGFLAGS_SEEK 0x2
#endifDWORD WINAPI NetAuditClear(LPCWSTR server,LPCWSTR backupfile,LPCWSTR service);DWORD WINAPI NetAuditRead(LPCWSTR server,LPCWSTR service,LPHLOG auditloghandle,DWORD offset,LPDWORD reserved1,DWORD reserved2,DWORD offsetflag,LPBYTE *bufptr,DWORD prefmaxlen,LPDWORD bytesread,LPDWORD totalavailable);DWORD WINAPI NetAuditWrite(DWORD type,LPBYTE buf,DWORD numbytes,LPCWSTR service,LPBYTE reserved);typedef struct _AUDIT_ENTRY {DWORD ae_len;DWORD ae_reserved;DWORD ae_time;DWORD ae_type;DWORD ae_data_offset;DWORD ae_data_size;} AUDIT_ENTRY,*PAUDIT_ENTRY,*LPAUDIT_ENTRY;#define REVISED_AUDIT_ENTRY_STRUCTtypedef struct _AE_SRVSTATUS {DWORD ae_sv_status;} AE_SRVSTATUS,*PAE_SRVSTATUS,*LPAE_SRVSTATUS;typedef struct _AE_SESSLOGON {DWORD ae_so_compname;DWORD ae_so_username;DWORD ae_so_privilege;} AE_SESSLOGON,*PAE_SESSLOGON,*LPAE_SESSLOGON;typedef struct _AE_SESSLOGOFF {DWORD ae_sf_compname;DWORD ae_sf_username;DWORD ae_sf_reason;} AE_SESSLOGOFF,*PAE_SESSLOGOFF,*LPAE_SESSLOGOFF;typedef struct _AE_SESSPWERR {DWORD ae_sp_compname;DWORD ae_sp_username;} AE_SESSPWERR,*PAE_SESSPWERR,*LPAE_SESSPWERR;typedef struct _AE_CONNSTART {DWORD ae_ct_compname;DWORD ae_ct_username;DWORD ae_ct_netname;DWORD ae_ct_connid;} AE_CONNSTART,*PAE_CONNSTART,*LPAE_CONNSTART;typedef struct _AE_CONNSTOP {DWORD ae_cp_compname;DWORD ae_cp_username;DWORD ae_cp_netname;DWORD ae_cp_connid;DWORD ae_cp_reason;} AE_CONNSTOP,*PAE_CONNSTOP,*LPAE_CONNSTOP;typedef struct _AE_CONNREJ {DWORD ae_cr_compname;DWORD ae_cr_username;DWORD ae_cr_netname;DWORD ae_cr_reason;} AE_CONNREJ,*PAE_CONNREJ,*LPAE_CONNREJ;typedef struct _AE_RESACCESS {DWORD ae_ra_compname;DWORD ae_ra_username;DWORD ae_ra_resname;DWORD ae_ra_operation;DWORD ae_ra_returncode;DWORD ae_ra_restype;DWORD ae_ra_fileid;} AE_RESACCESS,*PAE_RESACCESS,*LPAE_RESACCESS;typedef struct _AE_RESACCESSREJ {DWORD ae_rr_compname;DWORD ae_rr_username;DWORD ae_rr_resname;DWORD ae_rr_operation;} AE_RESACCESSREJ,*PAE_RESACCESSREJ,*LPAE_RESACCESSREJ;typedef struct _AE_CLOSEFILE {DWORD ae_cf_compname;DWORD ae_cf_username;DWORD ae_cf_resname;DWORD ae_cf_fileid;DWORD ae_cf_duration;DWORD ae_cf_reason;} AE_CLOSEFILE,*PAE_CLOSEFILE,*LPAE_CLOSEFILE;typedef struct _AE_SERVICESTAT {DWORD ae_ss_compname;DWORD ae_ss_username;DWORD ae_ss_svcname;DWORD ae_ss_status;DWORD ae_ss_code;DWORD ae_ss_text;DWORD ae_ss_returnval;} AE_SERVICESTAT,*PAE_SERVICESTAT,*LPAE_SERVICESTAT;typedef struct _AE_ACLMOD {DWORD ae_am_compname;DWORD ae_am_username;DWORD ae_am_resname;DWORD ae_am_action;DWORD ae_am_datalen;} AE_ACLMOD,*PAE_ACLMOD,*LPAE_ACLMOD;typedef struct _AE_UASMOD {DWORD ae_um_compname;DWORD ae_um_username;DWORD ae_um_resname;DWORD ae_um_rectype;DWORD ae_um_action;DWORD ae_um_datalen;} AE_UASMOD,*PAE_UASMOD,*LPAE_UASMOD;typedef struct _AE_NETLOGON {DWORD ae_no_compname;DWORD ae_no_username;DWORD ae_no_privilege;DWORD ae_no_authflags;} AE_NETLOGON,*PAE_NETLOGON,*LPAE_NETLOGON;typedef struct _AE_NETLOGOFF {DWORD ae_nf_compname;DWORD ae_nf_username;DWORD ae_nf_reserved1;DWORD ae_nf_reserved2;} AE_NETLOGOFF,*PAE_NETLOGOFF,*LPAE_NETLOGOFF;typedef struct _AE_ACCLIM {DWORD ae_al_compname;DWORD ae_al_username;DWORD ae_al_resname;DWORD ae_al_limit;} AE_ACCLIM,*PAE_ACCLIM,*LPAE_ACCLIM;#define ACTION_LOCKOUT 00
#define ACTION_ADMINUNLOCK 01typedef struct _AE_LOCKOUT {DWORD ae_lk_compname;DWORD ae_lk_username;DWORD ae_lk_action;DWORD ae_lk_bad_pw_count;} AE_LOCKOUT,*PAE_LOCKOUT,*LPAE_LOCKOUT;typedef struct _AE_GENERIC {DWORD ae_ge_msgfile;DWORD ae_ge_msgnum;DWORD ae_ge_params;DWORD ae_ge_param1;DWORD ae_ge_param2;DWORD ae_ge_param3;DWORD ae_ge_param4;DWORD ae_ge_param5;DWORD ae_ge_param6;DWORD ae_ge_param7;DWORD ae_ge_param8;DWORD ae_ge_param9;} AE_GENERIC,*PAE_GENERIC,*LPAE_GENERIC;#define AE_SRVSTATUS 0
#define AE_SESSLOGON 1
#define AE_SESSLOGOFF 2
#define AE_SESSPWERR 3
#define AE_CONNSTART 4
#define AE_CONNSTOP 5
#define AE_CONNREJ 6
#define AE_RESACCESS 7
#define AE_RESACCESSREJ 8
#define AE_CLOSEFILE 9
#define AE_SERVICESTAT 11
#define AE_ACLMOD 12
#define AE_UASMOD 13
#define AE_NETLOGON 14
#define AE_NETLOGOFF 15
#define AE_NETLOGDENIED 16
#define AE_ACCLIMITEXCD 17
#define AE_RESACCESS2 18
#define AE_ACLMODFAIL 19
#define AE_LOCKOUT 20
#define AE_GENERIC_TYPE 21#define AE_SRVSTART 0
#define AE_SRVPAUSED 1
#define AE_SRVCONT 2
#define AE_SRVSTOP 3#define AE_GUEST 0
#define AE_USER 1
#define AE_ADMIN 2#define AE_NORMAL 0
#define AE_USERLIMIT 0
#define AE_GENERAL 0
#define AE_ERROR 1
#define AE_SESSDIS 1
#define AE_BADPW 1
#define AE_AUTODIS 2
#define AE_UNSHARE 2
#define AE_ADMINPRIVREQD 2
#define AE_ADMINDIS 3
#define AE_NOACCESSPERM 3
#define AE_ACCRESTRICT 4#define AE_NORMAL_CLOSE 0
#define AE_SES_CLOSE 1
#define AE_ADMIN_CLOSE 2#define AE_LIM_UNKNOWN 0
#define AE_LIM_LOGONHOURS 1
#define AE_LIM_EXPIRED 2
#define AE_LIM_INVAL_WKSTA 3
#define AE_LIM_DISABLED 4
#define AE_LIM_DELETED 5#define AE_MOD 0
#define AE_DELETE 1
#define AE_ADD 2#define AE_UAS_USER 0
#define AE_UAS_GROUP 1
#define AE_UAS_MODALS 2#define SVAUD_SERVICE 0x1
#define SVAUD_GOODSESSLOGON 0x6
#define SVAUD_BADSESSLOGON 0x18
#define SVAUD_SESSLOGON (SVAUD_GOODSESSLOGON | SVAUD_BADSESSLOGON)
#define SVAUD_GOODNETLOGON 0x60
#define SVAUD_BADNETLOGON 0x180
#define SVAUD_NETLOGON (SVAUD_GOODNETLOGON | SVAUD_BADNETLOGON)
#define SVAUD_LOGON (SVAUD_NETLOGON | SVAUD_SESSLOGON)
#define SVAUD_GOODUSE 0x600
#define SVAUD_BADUSE 0x1800
#define SVAUD_USE (SVAUD_GOODUSE | SVAUD_BADUSE)
#define SVAUD_USERLIST 0x2000
#define SVAUD_PERMISSIONS 0x4000
#define SVAUD_RESOURCE 0x8000
#define SVAUD_LOGONLIM 0x00010000#define AA_AUDIT_ALL 0x0001
#define AA_A_OWNER 0x0004
#define AA_CLOSE 0x0008
#define AA_S_OPEN 0x0010
#define AA_S_WRITE 0x0020
#define AA_S_CREATE 0x0020
#define AA_S_DELETE 0x0040
#define AA_S_ACL 0x0080
#define AA_S_ALL (AA_S_OPEN | AA_S_WRITE | AA_S_DELETE | AA_S_ACL)
#define AA_F_OPEN 0x0100
#define AA_F_WRITE 0x0200
#define AA_F_CREATE 0x0200
#define AA_F_DELETE 0x0400
#define AA_F_ACL 0x0800
#define AA_F_ALL (AA_F_OPEN | AA_F_WRITE | AA_F_DELETE | AA_F_ACL)#define AA_A_OPEN 0x1000
#define AA_A_WRITE 0x2000
#define AA_A_CREATE 0x2000
#define AA_A_DELETE 0x4000
#define AA_A_ACL 0x8000
#define AA_A_ALL (AA_F_OPEN | AA_F_WRITE | AA_F_DELETE | AA_F_ACL)#ifdef __cplusplus
}
#endif
#endif

方法二. TerminateProcess 干掉进程

说到TerminateProcess 必要说一下ExitProcess,这两个函数都是用于干掉进程的,ExitProcess是用于干掉自身的,TerminateProcess 是用于干掉其它程序的进程的, 所以这里用TerminateProcess 来进行功能制作。
函数原型:

BOOL WINAPI TerminateProcess(_In_ HANDLE hProcess,_In_ UINT   uExitCode
);
VOID WINAPI ExitProcess(_In_ UINT uExitCode
);

主要步骤就是通过进程名获取窗口句柄,通过窗口句柄获取进程ID,然后通过进程ID获取进程ID的句柄,然后就可以终结了。这里还有一个API就是OpenProcess,通过这OpenProcess获得进程ID对应的句柄。

HANDLE WINAPI OpenProcess(_In_ DWORD dwDesiredAccess,_In_ BOOL  bInheritHandle,_In_ DWORD dwProcessId
);
//小例子
BOOL KillProcess(DWORD ProcessId) {HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, ProcessId);if(hProcess == NULL) return FALSE;if(!TerminateProcess(hProcess, 0)) return FALSE;return TRUE;
}

本人只是抛砖引玉,想研究的可以深入研究,此方面可以用于终止恶意顽固程序进程等。


博客名称:王乐平博客

博客地址:http://blog.lepingde.com

CSDN博客地址:http://blog.csdn.net/lecepin


这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401721.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Fragments 详细使用

2019独角兽企业重金招聘Python工程师标准>>> Fragments 诞生初衷 自从Android 3.0中引入fragments 的概念,根据词海的翻译可以译为:碎片、片段。其上的是为了解决不同屏幕分辩率的动态和灵活UI设计。大屏幕如平板小屏幕如手机,平板电脑的设计使得其有更多…

安卓UI适配限定符

引言 对于程序在不同尺寸的Android机器上运行,对UI的适用性造成了额外的开销,不过限定符的出现,很方便的解决了这个问题。通过创建限定符相关的文件夹来解决资源的加载。 限定符用处 限定符(mdpi,tvdpi,hdpi)可以帮助我们判断屏幕密度 限定…

docker install on centos 6.x

2019独角兽企业重金招聘Python工程师标准>>> 参考文档:http://docs.docker.com/installation/centos/ 安装epel源 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo 安装docker服务端 yum install docker-io 启动docker /etc/init.…

安卓活动(Activity)和碎片(Fragment)的生命周期

引言 对于安卓中生命周期的过程以及相应的事件的了解是非常重要的。 活动(Activity)的生命周期 Activity 类中定义了七个事件回调方法,与Activity生命周期的每一个环节对应。 1. onCreate() 这个方法你已经看到过很多次了,每个…

又开始写博了

2019独角兽企业重金招聘Python工程师标准>>> 因为太多东西需要记录,所以重新开博。脚印一把 转载于:https://my.oschina.net/junfrank/blog/286348

Android 代码实现查看SQLite数据库中的表

前言 以前写PHP的时候,内置了print_r()和var_dump()两个函数用于打印输出任意类型的数据内部结构,现在做Android的开发,发现并没有这种类似的函数,对于数据库的查看很不方便,于是就写了一下查看数据库表的方法代码。 …

Android 代码执行Linux Shell小记

引言 Android系统是基于Linux内核运行的,而做为一名Linux粉,不在Android上面运行一下Linux Shell怎么行呢? 最近发现了一个很好的Android Shell工具代码,在这里分享一下。 Shell核心代码 import java.io.BufferedReader; impor…

【iHMI43 4.3寸液晶模块】demo例程(版本1.02)发布

技术论坛:http://www.eeschool.org 博客地址:http://xiaomagee.cnblogs.com 官方网店:http://i-board.taobao.com 银杏科技 GINGKO TECH. 保留权利,转载请注明出处 一、简介: 1、iHMI43 演示程序(版本号:1…

Android 数据存储之文件存储小记

前言 Android操作文件的方式和JAVA I/O操作是十分类似的&#xff0c;在这个我小谈一下。 Android写入文件 在Android中Context类提供了openFileOutput()方法&#xff0c;用于文件写入。默认存储路径为/data/data/<package name>/files/中。 openFileOutput原型&#x…

Android 数据存储之SharedPreferences存储小记

前言 Android的数据存储机制中还提供了SharedPreferences&#xff0c;SharedPreferences是这其中最容易理解的数据存储技术&#xff0c;采用键值对的方式进行存储&#xff0c;而且支持存储多中数据类型。 获取SharedPreferences对象 SharedPreferences文件存放在/data/data/&…

Jackson、JSON-lib、Gson性能对比

2019独角兽企业重金招聘Python工程师标准>>> 近日做一些性能优化工作&#xff0c;在挑选JSON类库时&#xff0c;发现除了一般常用的JSON-lib外&#xff0c;还有一款号称性能最快的JSON处理器Jackson&#xff0c;于是用上了刚学会的JMeter&#xff0c;对这两个类库进…

IP地址定位器

软件截图 软件说明 软件名称&#xff1a;IP地址定位器 软件版本&#xff1a; 1.0 软件说明&#xff1a;当我们想通过IP具体到街道甚至门牌号&#xff0c;该怎么办&#xff1f;&#xff1f;&#xff1f;特开发IP地址定位器&#xff0c;结合高精度IP定位&#xff0c;可以通过I…

[题解]RQNOJ PID85 三个袋子

链接&#xff1a;http://www.rqnoj.cn/problem/85 思路&#xff1a;一个排列问题&#xff0c;递推式很简单&#xff0c;f(n1)3*f(n)-1 &#xff0c;由此可以推出通项公式&#xff0c;f(n)0.5*3^(n-1)0.5 。 但是这个数太大了&#xff0c;我们需要求的是f(n) mod K 。那么就必须…

CSS3媒体查询(@media)详细总结和Responsive浅谈

引言 一直想对CSS3的媒体查询和Responsive进行一下记录和总结&#xff0c;今天拿出点时间来做一下。 媒体查询的历史 随着浏览器终端的多样化&#xff0c;无法保证一个网页在不同的设备上呈现出想同的结果&#xff0c;所以Media Query诞生了&#xff0c;让一个页面适用不同的终…

华为路由交换VRRP配置

VRRP配置学习目的了解网络负载均衡的功能和作用理解VRRP协议的工作原理掌握三层交换环境单组VRRP的配置方法掌握VRRP认证配置方法掌握VRRP跟踪接口的配置方法掌握使用VRRP实现负载均衡的配置方法拓扑图场景你是公司的网络管理员。当前的网络中有两个用户。用R2、R3标注为公司用…

CSS使用网络字体(@font-face)详析

前言 以前在给网页文字设置一些好看的字体时&#xff0c;限于用户系统是否安装此字体&#xff0c;而只能使用三种方法解决&#xff0c;要么用通用字体&#xff0c;要么用图片替换文本&#xff0c;要么用Flash。而这几种方法却存在严重的缺陷。 现在好了&#xff0c;font-face终…

HTML5 requestAnimationFrame( ) 动画API

简介 当用JS做动画效果时&#xff0c;一般用setTimeout()或setInterval()来进行动画效果的制作&#xff0c;现在好了&#xff0c;出现了一个专门用于处理动画的API——requestAnimationFrame()&#xff0c;表意为“请求动画帧”。 用法 基本语法&#xff1a; requestAnimati…

Canvas三种动态画圆实现方法说明

前言 canvas是HTML5出来的绘图API容器&#xff0c;对于图形的处理非常强大&#xff0c;下面使用canvas配合JavaScript来做一下动态画圆效果。可以用它来做圆形进度条来使用。 这里我个人总结了3种实现方法&#xff0c;大家可以参考一下。 方法一&#xff1a;arc()实现画圆 效…

微软Visual Studio 14 CTP 2 发布

对于在微软阵营下进行工作的团队来说&#xff0c;拥有最新版本的Visual Studio是提高效率最佳的选择&#xff0c;没有之一。 在本文中&#xff0c;我们就上个月发布的Visual Studio "14" CTP1和昨天发布的Visual Studio "14" CTP2进行详细发布说明梳理&…

CSS3 FlexBox布局入门简析

前言 你们还在仅仅使用块、行内、表格、定位等传统布局方式进行网页的布局吗&#xff1f; 告诉你们一个新的布局模式&#xff0c;CSS3中新引入的FlexBox布局&#xff0c;布局方式十分灵活&#xff0c;含有优秀和惊奇的新特性&#xff0c;而且在主流浏览器上的兼容也不错&…