(21)[进程与线程] 进程链表和线程链表

寻找_EPROCESS

  • 方法1:
    • dd PsActiveProcessHead 获取一个_EPROCESS
    • 通过链表找到notepad.exe的_EPROCESS
    • 然后用这个_EPROCESS打开
  • 方法2:
    • !process 0 0 找到 notepad.exe那一栏 在这里插入图片描述
    • dt _EPROCESS 89c09208 地址就是PROCESS后面的那个

清除DebugPort

在这里插入图片描述
在这里插入图片描述
使用F8单步,直接跳转到了这里,并打印了一句话
在这里插入图片描述
调试失败了

当调试器附加的时候才会设置DebugPort,然而如果DebugPort被置空了之后,调试器就没办法进行调试了。当然还有其他办法…


断开进程链表

在这里插入图片描述
我们这里简单断一下,就不写代码了
寻找_EPROCESS,上面写过了,便不再赘述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
为什么进程还能继续执行呢?
因为CPU的调度单位是线程,进程藏起来了,但是线程仍然可以正常调度
而且点开任务管理器左边的应用程序,就露馅了,还是没有藏好


断开线程链表

在这里插入图片描述


#include <ntddk.h>

//要断链的进程名
#define IMAGE_FILE_NAME "notepad.exe"

VOID DriverUnload(PDRIVER_OBJECT driver)
{
    DbgPrint("卸载驱动\n");
}

NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{
    PEPROCESS pEprocess, pCurProcess;
    PCHAR ImageFileName;
    // 获取 _EPROCESS
    __asm
    {
        push eax
        mov eax, fs: [0x124] ; //eax = _KPCR._KPRCB.CurrentThread (_ETHREAD)
        mov eax, [eax + 0x220]; //eax = _ETHREAD.ThreadsProcess
        mov pEprocess, eax;
        pop eax
    }
    pCurProcess = pEprocess;
    // 遍历 ActiveProcessLinks
    do
    {
        ImageFileName = (PCHAR)(((DWORD32)pCurProcess)+ 0x174);
        //找到目标进程
        if (strcmp(ImageFileName, IMAGE_FILE_NAME) == 0)
        {
            PLIST_ENTRY list_50, list_190, next_1B0, next_22C;
			//_asm int 3; //调试使用
            list_50 = (PLIST_ENTRY)(((DWORD32)pCurProcess) + 0x50);
            list_190 = (PLIST_ENTRY)(((DWORD32)pCurProcess) + 0x190);
            next_1B0 = list_50, next_22C = list_190;
            //开始断链
            do {
                PLIST_ENTRY t_1B0 = next_1B0->Blink;
                PLIST_ENTRY t_22C = next_22C->Blink;
                //_ETHREAD将链表都指向自己
                next_1B0->Flink = (PLIST_ENTRY)(((DWORD32)next_1B0) + 0x0);
                next_1B0->Blink = (PLIST_ENTRY)(((DWORD32)next_1B0) + 0x4);

                next_22C->Flink = (PLIST_ENTRY)(((DWORD32)next_22C) + 0x0);
                next_22C->Blink = (PLIST_ENTRY)(((DWORD32)next_22C) + 0x4);  

                next_1B0 = t_1B0;
                next_22C = t_22C;

            } while (next_1B0 != list_50);

        }
        //DbgPrint("%s\n", ImageFileName);
        pCurProcess = (PEPROCESS)(*(PULONG)((ULONG)pCurProcess + 0x88) - 0x88);
    } while (pEprocess != pCurProcess);

    driver->DriverUnload = DriverUnload;
    return STATUS_SUCCESS;
}

在这里插入图片描述
在这里插入图片描述
可恶,没有蓝屏,没有进程崩溃!!!我差点以为自己失败了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值