【转】利用NtProtectVirtualMemory结束进程

标 题 : 【原创】利用NtProtectVirtualMemory结束进程
作 者 : KiDebug
时 间 : 2011 - 07 - 13, 09 : 37 : 08
链 接 : http ://bbs.pediy.com/showthread.php?t=137067

原理很简单,用PROCESS_VM_OPERATION打开目标进程(没必要PROCESS_ALL_ACCESS),把目标进程的ntdll.dll设为不能访问
/*
* 【作者:KiDebug】
* 【空间:http://hi.baidu.com/KiDebug/】
*  VC 6.0编译出错请百度:“vc 6.0 unicode”
*/
#include <stdio.h>
#include <Windows.h>
#include <Psapi.h>
#include <Tlhelp32.h>

#pragma comment(lib,"Psapi.lib")

typedef NTSTATUS(__stdcall *RtlAdjustPrivilege_)(
ULONG Privilege,
BOOLEAN Enable,
BOOLEAN CurrentThread,
PBOOLEAN Enabled
);
RtlAdjustPrivilege_ RtlAdjustPrivilege = NULL;

typedef NTSTATUS(__stdcall *NtProtectVirtualMemory_)(
    __in HANDLE ProcessHandle,
    __inout PVOID *BaseAddress,
    __inout PSIZE_T RegionSize,
    __in ULONG NewProtectWin32,
    __out PULONG OldProtect
    );
NtProtectVirtualMemory_ NtProtectVirtualMemory = NULL;

ULONG GetPID(WCHAR* proc)
{
    BOOL                working = 0;
    PROCESSENTRY32      lppe = { 0 };
    ULONG               targetPid = 0;
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if (hSnapshot)
    {
        lppe.dwSize = sizeof(lppe);
        working = Process32First(hSnapshot, &lppe);
        while (working)
        {
            if (_wcsicmp(lppe.szExeFile, proc) == 0)
            {
                targetPid = lppe.th32ProcessID;
                break;
            }
            working = Process32Next(hSnapshot, &lppe);
        }
    }

    CloseHandle(hSnapshot);
    return targetPid;
}

void main()
{
    HMODULE     ntdll;
    MODULEINFO  ModuleInfo;
    ntdll = GetModuleHandle(L"ntdll.dll");
    if (!GetModuleInformation((HANDLE)-1, ntdll, &ModuleInfo, sizeof(MODULEINFO)))
    {
        return;
    }

    BOOLEAN         Enabled;
    RtlAdjustPrivilege = (RtlAdjustPrivilege_)GetProcAddress(ntdll, "RtlAdjustPrivilege");
    if (RtlAdjustPrivilege == NULL)
    {
        return;
    }

    RtlAdjustPrivilege(20, TRUE, FALSE, &Enabled);

    HANDLE hProc = OpenProcess(PROCESS_VM_OPERATION, FALSE, GetPID(L"services.exe"));
    if (hProc == NULL)
    {
        return;
    }

    NtProtectVirtualMemory = (NtProtectVirtualMemory_)GetProcAddress(ntdll, "NtProtectVirtualMemory");
    if (NtProtectVirtualMemory == NULL)
    {
        return;
    }

    ULONG   OldProtect;
    NtProtectVirtualMemory(hProc, &ModuleInfo.lpBaseOfDll, &ModuleInfo.SizeOfImage, PAGE_NOACCESS, &OldProtect);
}
时间: 2024-08-15 03:58:03

【转】利用NtProtectVirtualMemory结束进程的相关文章

Win7 利用批处理文件结束进程

@echo offtitle 结束进程正在进行... ::结束进程TeamViewer.exewmic process where name="TeamViewer.exe" call terminate ::结束进程002_酷我音乐set var001="KwMusic.exe"    wmic process where name=%var001% call terminate  ::结束进程003_暴风影音wmic process where name=&qu

Windows-007-命令行(CMD)查看、结束进程命令实例讲解

本节主要讲述 Windows 系统下,如何利用命令行(CMD)查看进程信息,如何结束进程.敬请亲们参阅,希望能对亲们有所帮助,如有不足之处,敬请大神指正,不胜感激! 需要用到的命令: netstat tasklist tskill 首先,启动命令行工具 先下班了,回去在写....^_^

使用ExitProcess()结束本进程,TerminateProcess()结束进程

进程只是提供了一段地址空间和内核对象,其运行时通过在其地址空间内的主线程来体现的.当主线程的进入点函数返回时,进程也就随之结束.这种进程的终止方式是进程的正常退出,进程中的所有线程资源都能够得到正确的清除.除了这种进程的正常退出方式外,有时还需要在程序中通过代码来强制结束本进程或其他进程的运行.ExitProcess()函数的原型为: void ExitProcess(UINT uExitCode); 其参数uExitCode为进程设置了退出代码.该函数具有强制性,在执行完毕后进程即被结束,因此

C#中各种结束进程的方法

  Process类的CloseMainWindow, Kill, Close: 1.Process.CloseMainWindow是GUI程序的最友好结束方式,从名字上就可以看出来它是通过关闭程序主窗体,相当于用户点击窗体的关闭按钮或者按Alt + F4.它的本质就是向主窗体发送WM_CLOSE消息(Process.MainWindowsHandle可以返回主窗体的句柄).这个可以在.NET Framework源代码中看出来 public bool CloseMainWindow() { In

Linux查看和结束进程命令详解

在ubuntu中,终止一个进程或终止一个正在运行的程序,一般是通过 kill .killall.pkill.xkill 等进行. ------------------------------------------------------------------- 先看两个例子: 例子一:结束某个程序,如Firefox 键入命令: pkill firefox 例子二: 结束某个进程,如find 先用ps命令来查看该进程对应的PID. 键入ps,显示如下: PID TTY TIME COMMAND

taskkill 命令批量结束进程

taskkill /f /im PjtPkgWeightDlg.exe  结束进程 start "" "d:\PjtPkgWeightDlg.exe"  启动程序 在命令行下输入  taskkill /?  就能看到这个命令的一些介绍了. 命令语法: TASKKILL [/S system [/U username [/P [password]]]]         { [/FI filter] [/PID processid | /IM imagename] }

webdriver结束进程

使用webdriver做UI自动化测试,driver.quit();方法貌似没能起作用,执行完成后,还是一堆页面和进程在. 所以就只能简单粗暴地杀进程了 public void stop(){    driver.quit();  String name = null;  try {   name = getValue("driverName");  } catch (IOException e) {   // TODO Auto-generated catch block   e.p

Linux # Kubuntu 假死,结束进程方法

分析思路: 要知道运行了哪些进程,结束的目标进程是哪些,如何得到运行中的进程,需要哪些操作. 借助搜索引擎,搜索关键字:kconsole 列出进程,查询相关信息,文后参考链接 执行过程: ps aux 列出运行进程 (记录结束的目标进程的 pid,比如 firefox pid 为 22481) 或者 grep firefox ,将显示 22481,即为 pid 接着 kill 22481 ,即可. 备注: 这些命令详细介绍可以看下面链接 参考: Win/Mac/Linux(gnome|kde)

windows查看端口占用、结束进程

在开发中难免会遇到windows的端口被占用,现在我们来查看端口的占用和结束占用端口的进程. win+r 输入cmd进入命令提示符: 比如我们要查看8080端口的占用情况,输入netstat -aon | findstr "8080",注:注意空格: C:\Users\Administrator>netstat -aon | findstr "8080" Proto   Local Address         Foreign Address