命令行获取PID并杀死进程的bat脚本怎么写

命令行获取PID并杀死进程的bat脚本怎么写,第1张

@echo off

:1

tasklist | find "notepadexe" >>c:\notepadluowei

if exist c:\notepadluowei taskkill /f /im notepadexe

ping 1271 -n 20 >nul 2>nul

goto 1

每隔20秒自动检测进程列表,自动关闭notepadexe。参考上面的

将以下的保存成 listvbe,执行“cscript /nologo listvbe”即可

for each ps in getobject _

("winmgmts:\\\root\cimv2:win32_process")instances_

wscriptecho pshandle&vbtab&psname&vbtab&psexecutablepath&vbtab&pscommandline

next

线程注入,说到底还是创建线程,只不过创建的线程在别的进程中运行而已,那么,我们需要下手的地方跟监控普通线程创建需要下手的地方应当是一样的——NtCreateThread(不过这不是一个太好的选择,因为NtCreateThread的定位稍显麻烦。这儿只是一个为了说明如何监控而做一个例子而已,所以尽可能选择简单的方法来挂钩,修改ssdt可以挂这个函数,所以就选择了它。^-^更好的选择见后文)。

我认为我有必要先列出NtCreateThread的原型:

NTSTATUS

NtCreateThread(

__out PHANDLE ThreadHandle,

__in ACCESS_MASK DesiredAccess,

__in_opt POBJECT_ATTRIBUTES ObjectAttributes,

__in HANDLE ProcessHandle,

__out PCLIENT_ID ClientId,

__in PCONTEXT ThreadContext,

__in PINITIAL_TEB InitialTeb,

__in BOOLEAN CreateSuspended

)

__out的那些就都不解释了,主要解释需要用到的。

access_mask是访问权限,不解释;ObjectAttr是对象属性,_opt的,不解释;ProcessHandle就是将要被创建线程的进程(新线程在这个进程中运行)的句柄了;剩下几个也跟本文无关,也不解释,需要了解详细信息可以查MSDN。

需要关注的参数我想我已经说的很明确了——ProcessHandle。我们可以使用ObReferenceObjectByHandle来获取这个Handle所指向的进程的EPROCESS的地址(PEPROCESS)。

剩下的就是判断这个线程是正常创建还是远程创建的问题了,这个判断将会变得很容易,因为我们可以用获得到PEPROCESS和IoGetCurrentProcess的结果相比较——NtCreateThread总是应当在创建者的进程上下文中被执行。

不过当我们编译运行之后就会发现,还有一个问题是我们不得不关注的——运行程序的时候父进程会“帮助”子进程创建子进程的主要线程(因为这个时候子进程还没有线程,所以不可能自己创建),所以这就引出了另外一个问题——如何判断这个远程线程创建是注入还是正常的程序运行呢?

简单分析下我们不难发现,二者的区别在于将被创建线程的进程是否还存在其他线程——因为我们的代码是在NtCreateThread之前执行的,所以如果是正常运行的程序的话,这个时候它不应当有任何的线程,而线程注入则不同,线程注入的话目标进程应当已经有了至少一个线程(一个主线程和若干个附属线程(或者没有附属线程))。

那么如何判断目标进程是否已经存在线程呢?在EPROCESS结构中:

+0x190 ThreadListHead : _LIST_ENTRY

我想这个ThreadListHead这是很容易理解的。。。。

实现方法(因为只是为了演示,所以所有的地址、偏移等都是硬编码):

ThreadListHead = 0x190;

//==========================================

BOOLEAN

ProcessNoThread( PEPROCESS Process)

{

PLIST_ENTRY Entry;

PLIST_ENTRY ThreadListEntry;

PLIST_ENTRY ListHead;

ThreadListEntry = (PLIST_ENTRY)((ULONG)Process + ThreadListHead);

Entry = ThreadListEntry->Flink;

return (Entry==ThreadListEntry);

}

//==========================================

NTSTATUS new_NtCreateThread(

OUT PHANDLE ThreadHandle,

IN ACCESS_MASK DesiredAccess,

IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,

IN HANDLE ProcessHandle,

OUT PCLIENT_ID ClientId,

IN PCONTEXT ThreadContext,

IN PVOID InitialTeb,

IN BOOLEAN CreateSuspended )

{

NTSTATUS st;

PVOID pepCurrentProcess=0;

st=ObReferenceObjectByHandle(ProcessHandle,(ACCESS_MASK)PROCESS_ALL_ACCESS,NULL,KernelMode,&pepCurrentProcess,NULL);

if (NT_SUCCESS(st))

{

if (IoGetCurrentProcess()!=pepCurrentProcess)

{

if (!ProcessNoThread((PEPROCESS)pepCurrentProcess)) DbgPrint("PROCESS 0x%X have created a thread into PROCESS 0x%X, NtCreateThread return value = 0x%x",IoGetCurrentProcess(),pepCurrentProcess,st);

}

ObDereferenceObject((PVOID)pepCurrentProcess);

}

st=old_NtCreateThread(ThreadHandle,DesiredAccess,ObjectAttributes,ProcessHandle,ClientId,ThreadContext,InitialTeb,CreateSuspended);

return st;

}

//==========================================

我想这段代码也不至于太难理解。。

是时候说说其他的一些问题了:

1、其实hook PspCreateThread要比hook NtCreateThread相对容易一些(两个函数同样都没有被导出,而PspCreateThread可以很容易的在PsCreateSystemThread中被定位,但NtCreateThread的定位就需要分析PE文件了(改SSDT另当别论,不过改SSDT的强度太差))。

2、遍历进程的线程是使用硬编码的,这使得通用性变得很差,而通过遍历PspCidTable枚举系统中的线程则成为一种不错的方法(从PspCreateThread中的代码来看,是由PspCreateThread在PspCidTable中ExCreateHandle的,但是我没有做测试)

就这样把,我自负的认为我的语言表达能力还算是不错的。

---EOF---

在网络程序的调试过程中,经常发生一些出乎意料的事情,比如创建一个TCP服务失败,这时候往往需要查看系统的网络情况,最常用的网络抓包当然非WireShark模式。但往往很多时候只需要查看某个端口的使用情况,它到底被那个进程(对应PID)占用了,或者你还需要把它Kill掉。如果你在Windows *** 作系统,你可以使用netstat命令来查询PID,然后可以打开任务管理器,查看这个PID对应的进程名;如果PID没有显示,菜单》查看》选择列》选中PID即可;得知进程后,我们可以将进程杀掉。下面我简单描述一下我所了解的在Windows和Linux系统下处理方式。 (假如我们需要确定谁占用了我们的9010端口)

1、Windows平台

在windows控制台窗口下执行:

netstat -nao | findstr "9010"

TCP 127001:9010 0000:0 LISTENING 3017

你看到是PID为3017的进程占用了9010端口,如果进一步你想知道它的进程名称,你可以使用如下命令:

tasklist | findstr "3017"

如果你想杀死这个进程,你当然可以用前面描述的那种方法,在任务管理器里把它KILL了,但如果你喜欢高效一点,那么用taskkill命令就可以了。

taskkill /pid 3017

那么这个进程就灰灰湮灭了:)2、Linux如果你是个Linux爱好者,那个这个命令你应该很熟了,

netstat -pan | grep 9010

如果你稍微仔细一点,你会发现,用的都是netsta命令,事实上,netstat是一个比较通用的网络统计命令,几乎适用于所有现在流行的 *** 作系统,无论是Linux,Window,还是其他Unix,或者Unix-like *** 作系统,而且用法基本一致。

下面是一个对Windows系统中netstat命令行参数的详细解释。格式:netstat [-a] [-e] [-n] [-o] [-p Protocol] [-b] [-r] [-s] [-v] [Interval]参数说明:-a 显示所有连接和监听端口。

-n 以数字形式显示地址和端口号。

-o 显示与每个连接相关的所属进程 ID。

-p 在Windows系统中,该选项用于指定默认情况的子集。proto 显示 proto 指定的协议的连接;proto 可以是下列协议之一: TCP、UDP、TCPv6 或 UDPv6。

如果与 -s 选项一起使用以显示按协议统计信息,proto 可以是下列协议之一:

IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 或 UDPv6。

-b 显示包含于创建每个连接或监听端口的可执行组件。在某些情况下已知可执行组件拥有多个独立组件,并且在这些情况下; 包含于创建连接或监听端口的组件序列被显示。这种情况下,可执行组件名在底部的 [] 中,顶部是其调用的组件,等等,直到 TCP/IP 部分。注意此选项

可能需要很长时间,如果没有足够权限可能失败。

-e 显示以太网统计信息。此选项可以与 -s选项组合使用。

-s 显示按协议统计信息。默认地,显示 IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 和 UDPv6 的统计信息。

-r 显示路由表。

-v 与 -b 选项一起使用时将显示包含于为所有可执行组件创建连接或监听端口的组件。

interval 重新显示选定统计信息,每次显示之间暂停时间间隔(以秒计)。按 CTRL+C 停止重新显示统计信息。如果省略,netstat 显示当前

配置信息(只显示一次)。

这里说的命令行应该是参数的意思。

在DOS下运行程序的时候是程序名+运行参数

比如netstat -an

这里的netstat是程序名称,后面得-an就是参数,也就是命令行参数。

同样,你使用createprocess函数创建一个进程的时候,如果这个程序有参数,就需要你传递进去。

简单说,命令行就是参数。

用法:开个cmdexe窗口,输入:

ntsd -c q -p PID

把最后那个PID,改成你要终止的进程的ID。如果你不知道进程的ID,任务管理器->进程选项卡->查看->选择列->勾上"PID(进程标识符)",然后就能看见了。

答2:xp下还有两个好东东tasklist和tskill。tasklist能列出所有的进程,和相应的信息。tskill能查杀进程,语法很简单:tskill 程序名!!

比如杀死进程 QQ

taskkill /f /fi "IMAGENAME eq QQexe"

1、用taskill命令

①taskkill /im

进程名称

示例:用taskkill /im

VStartexe命令关闭音速启动,VStartexe就是音速启动的进程名称,下面看 *** 作,执行了三次,成功关闭了音速启动,再看下面的方法

②taskkill /pid[进程码]

-t(结束该进程)

-f(强制结束该进程以及所有子进程)

注:有两种方法查进程的PID码:

①在命令行下用 tasklist 命令查出进程的PID号码,就是这些

②在任务管理器中的查看选项中选择选择列中勾先PID那一项

示例:举个关闭迅雷的例子,先找出迅雷的PID码2552 taskkill /pid 2552 -f,就是这个指令,下面来运行一下看看

2、用 wmic process where

name="进程名称" call terminate

这个不需要知道进程的PID号

示例: wmic process where

name="iexploreexe" call terminate 关闭IE浏览器,我们来运行一下这条指令看看看到了吧浏览器已经关闭了,再看下面的

3、ntsd -c q -p

[pid进程码]

示例:还是举个关闭迅雷的吧,同样先找出迅雷的PID码2724

ntsd

-c q -p 2724 是这条指令,下面我们来执行一下看看看到了吧,迅雷已经关闭了

这样关进程有什么作用呢

一方面遇到不能用任务管理器结束的进程可以试试上面的方法,而且用wmic

process where name="进程名称" call terminate和taskkill /im

进程名称这两条可以同时关闭多个进程名相同的进程,举个关2个QQ的例子吧,已经打开了两个QQ程序,wmic process where name="QQexe"

call terminate,我们来执行一下看看,看到了吧,两个QQ都关闭了

以上就是关于命令行获取PID并杀死进程的bat脚本怎么写全部的内容,包括:命令行获取PID并杀死进程的bat脚本怎么写、有无命令行工具可以查看进程的绝对路径、HOOK NtCreateThread 怎么获得 创建进程的命令行参数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9318137.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存