找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 6200|回复: 1

[半原创]稳定的禁止进程创建 - TaForbidCreateProcess

[复制链接]

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2010-7-9 13:05:02 | 显示全部楼层 |阅读模式
本帖最后由 HoviDelphic 于 2010-7-9 17:29 编辑

Hook RtlImageNtHeader,不能与KV2010共存。
在Windows XP和Windows 7下测试成功。
======
放假了,给朋友们的一些提醒:
1.不要沉迷于网络,牢记网络只是工具而不是目的,网络上的人和事都是虚幻甚至是虚假的。
2.要准备中考的同学就别玩电脑了,比如SYF大牛,否则你会后悔的。
3.用电脑一个小时,要休息15分钟,保护眼睛。
======
NTKERNELAPI PIMAGE_NT_HEADERS RtlImageNtHeader(PVOID ModuleAddress);
NTKERNELAPI PEPROCESS PsGetThreadProcess(PETHREAD Thread);
NTKERNELAPI PUCHAR PsGetProcessImageFileName(PEPROCESS Process);
typedef PIMAGE_NT_HEADERS (NTAPI *MYRTLIMAGENTHEADER)(PVOID ModuleAddres);
MYRTLIMAGENTHEADER MyRtlImageNtHeader = NULL;

BYTE OldCode[5] = {0};
BYTE HookCode[5] = {0xe9, 0, 0, 0, 0};
BYTE JmpCode[5] = {0xe9, 0, 0, 0, 0};
BYTE ProxyFun[10] = {0, 0, 0, 0, 0, 0xe9, 0, 0, 0, 0};
ULONG ToHookFuncAddr = 0;
KIRQL oldIrql,oldirql;
long lng = 0;
KSPIN_LOCK spinlock;
   
PIMAGE_NT_HEADERS RtlImageNtHeaderCallBack(PVOID Base)
{
    PEPROCESS A,B;
    InterlockedIncrement(&lng);
    MyRtlImageNtHeader=(MYRTLIMAGENTHEADER)((PVOID)ProxyFun);
    A=PsGetThreadProcess(PsGetCurrentThread());
    B=PsGetCurrentProcess();
    if (A==B)
    {
        InterlockedDecrement(&lng);
        return MyRtlImageNtHeader(Base);
    }
    else
    {
        InterlockedDecrement(&lng);
        return NULL;
    }
}

BOOL StartHook_RINH()
{
    PMDL pMdl = NULL;
    PUCHAR Addr = NULL;
    PUCHAR MapAddr = NULL;
    ToHookFuncAddr = (ULONG)RtlImageNtHeader;
    memcpy(OldCode, (PBYTE)RtlImageNtHeader, 5);
    *((PULONG)(HookCode + 1)) = (ULONG)RtlImageNtHeaderCallBack - ToHookFuncAddr -5;
    *((PULONG)(JmpCode + 1)) = (ToHookFuncAddr + 5) - (ULONG)(ProxyFun + 5) - 5;
    memcpy(ProxyFun, OldCode, 5);
    memcpy((PVOID)(ProxyFun + 5), JmpCode, 5);
    pMdl = IoAllocateMdl((PBYTE)RtlImageNtHeader, 5, FALSE, FALSE, NULL);
    if (pMdl)
    {
        __try
        {MmProbeAndLockPages(pMdl, KernelMode, IoWriteAccess);}
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
            IoFreeMdl(pMdl);
            return FALSE;
        }
        MapAddr = (PUCHAR)MmGetSystemAddressForMdlSafe(pMdl, NormalPagePriority);
        if (!MapAddr)
        {
            IoFreeMdl(pMdl);
            return FALSE;
        }
        KeInitializeSpinLock(&spinlock);
        KeAcquireSpinLock(&spinlock,&oldirql);
        oldIrql = KeRaiseIrqlToDpcLevel();
        *(PUSHORT)MapAddr = 0xfeeb;
        memcpy(MapAddr + 2, (PCHAR)HookCode + 2, 3);
        memcpy(MapAddr, HookCode, 5);
        KeLowerIrql(oldIrql);
        KeReleaseSpinLock(&spinlock, oldirql);
        MmUnlockPages(pMdl);
        IoFreeMdl(pMdl);
    }
    return TRUE;
}

void StopHook_RINH()
{
    PMDL pMdl = NULL;
    PUCHAR MapAddr = NULL;
    pMdl = IoAllocateMdl((PBYTE)RtlImageNtHeader, 5, FALSE, FALSE, NULL);
    if (pMdl)
    {
        __try
        {
            MmProbeAndLockPages(pMdl, KernelMode, IoWriteAccess);
        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
            IoFreeMdl(pMdl);
        }
        MapAddr = (PUCHAR)MmGetSystemAddressForMdlSafe(pMdl, NormalPagePriority);
        if (!MapAddr) IoFreeMdl(pMdl);
        KeInitializeSpinLock(&spinlock);
        KeAcquireSpinLock(&spinlock,&oldirql);
        oldIrql = KeRaiseIrqlToDpcLevel();
        *(PUSHORT)MapAddr = 0xfeeb;
        memcpy(MapAddr + 2, (PCHAR)OldCode + 2, 3);
        memcpy(MapAddr, OldCode, 5);
        KeLowerIrql(oldIrql);
        KeReleaseSpinLock(&spinlock, oldirql);
        MmUnlockPages(pMdl);
        IoFreeMdl(pMdl);
    }
}

评分

参与人数 2水晶币 +5 +21 收起 理由
阿杰 + 5 + 20 精品文章
xiaoly99 + 1 又发了......

查看全部评分

本网站最菜的人 该用户已被删除
发表于 2010-7-10 19:49:45 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表