找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 2670|回复: 1

一些邪恶的AttachProcess

[复制链接]

280

主题

203

回帖

0

精华

版主

积分
1808
发表于 2010-12-14 16:10:02 | 显示全部楼层 |阅读模式
内部资料~现在公开~
void hkKeAttachProcess(PEPROCESS Process)
{
    void* oricall;
    DWORD calleraddr;
    ULONG pid;
    BOOL find;
    PLDR_DATA_TABLE_ENTRY pldr;
    __asm mov eax,[ebp+4];
    __asm mov calleraddr,eax;
    oricall = phkKeAttachProcess->oritocall;
    pid = *(PULONG)((ULONG)Process + pIdOffset);
    find = FALSE;
    //if (KeGetCurrentIrql()<DISPATCH_LEVEL)
    //{
    //    //////////////////////////////////////////////////////////////////////////
    //    //event 模式
    //    //////////////////////////////////////////////////////////////////////////
    //}
   
    if (!g_PsLoadedModuleList) goto pass;
    if(!PrtFindRule(PROTECT_PROCESS,(PWSTR)pid)||PsGetCurrentProcessId()==(HANDLE)pid)
        goto pass;
    pldr = (PLDR_DATA_TABLE_ENTRY)g_PsLoadedModuleList;
    while (pldr->InLoadOrderModuleList.Flink != g_PsLoadedModuleList)
        {
        if (MmIsAddressValid((PVOID)pldr->FullDllName.Buffer))
            {
            DbgPrint("Base:0x%08x,Name:%ws,Size:0x%08x", pldr->DllBase, pldr->FullDllName.Buffer, pldr->SizeOfImage);
                if (calleraddr>=(DWORD)pldr->DllBase&&calleraddr<=(DWORD)pldr->DllBase+(DWORD)pldr->SizeOfImage)
                {
                    //////////////////////////////////////////////////////////////////////////
                    //对于我们保护的进程
                    //检查模块名字是否是我们希望能够attach的
                    //列表
                    //不是我们希望attach的就将Process = IoGetCurrentProcess();
                    //////////////////////////////////////////////////////////////////////////
                    find = TRUE;
                    if (Find_attach_filter((HANDLE)pid,pldr->BaseDllName.Buffer,sizeof(WCHAR)*wcslen(pldr->BaseDllName.Buffer)))
                        {
                            Process = IoGetCurrentProcess();
                        }
                }
            }
            pldr = (PLDR_DATA_TABLE_ENTRY)pldr->InLoadOrderModuleList.Flink;
        }
    if (!find)
    {
        //////////////////////////////////////////////////////////////////////////
        //未知模块,直接Trap死人
        //////////////////////////////////////////////////////////////////////////
        Process = IoGetCurrentProcess();
    }
pass:   
    __asm
    {
            push Process
            call dword ptr oricall
    }
    return ;
}
void hkKeStackAttachProcess(PEPROCESS Process,PKAPC_STATE apc)
    {
    void* oricall;
    DWORD calleraddr;
    ULONG pid;
    BOOL find;
    PLDR_DATA_TABLE_ENTRY pldr;
    __asm mov eax,[ebp+4];
    __asm mov calleraddr,eax;
    oricall = phkKeStackAttachProcess->oritocall;
    pid = *(PULONG)((ULONG)Process + pIdOffset);
    find = FALSE;
    //if (KeGetCurrentIrql()<DISPATCH_LEVEL)
    //{
    //    //////////////////////////////////////////////////////////////////////////
    //    //event 模式
    //    //////////////////////////////////////////////////////////////////////////
    //}
    if (!g_PsLoadedModuleList) goto pass;
    if(!PrtFindRule(PROTECT_PROCESS,(PWSTR)pid)||PsGetCurrentProcessId()==(HANDLE)pid)
        goto pass;
    pldr = (PLDR_DATA_TABLE_ENTRY)g_PsLoadedModuleList;
    while (pldr->InLoadOrderModuleList.Flink != g_PsLoadedModuleList)
        {
        if (MmIsAddressValid((PVOID)pldr->FullDllName.Buffer))
            {
            DbgPrint("Base:0x%08x,Name:%ws,Size:0x%08x", pldr->DllBase, pldr->FullDllName.Buffer, pldr->SizeOfImage);
            if (calleraddr>=(DWORD)pldr->DllBase&&calleraddr<=(DWORD)pldr->DllBase+(DWORD)pldr->SizeOfImage)
                {
                //////////////////////////////////////////////////////////////////////////
                //对于我们保护的进程
                //检查模块名字是否是我们希望能够attach的
                //dxg.ntos.ndis.tdi.afd.tcp win32k,ddi驱动等都是应该允许的,这个是个列表
                //估计需要ring3维护传入
                //不是我们希望attach的就将Process = IoGetCurrentProcess();
                //////////////////////////////////////////////////////////////////////////
                find = TRUE;
                if (Find_attach_filter((HANDLE)pid,pldr->BaseDllName.Buffer,sizeof(WCHAR)*wcslen(pldr->BaseDllName.Buffer)))
                {
                    Process = IoGetCurrentProcess();
                }
                }
            }
        pldr = (PLDR_DATA_TABLE_ENTRY)pldr->InLoadOrderModuleList.Flink;
        }
    if (!find)
        {
        //////////////////////////////////////////////////////////////////////////
        //未知模块,直接Trap死人
        //////////////////////////////////////////////////////////////////////////
        Process = IoGetCurrentProcess();
        }
pass:   
    __asm
        {
            push apc
            push Process
            call dword ptr oricall
        }
    return ;
    }

857

主题

2632

回帖

2

精华

管理员

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

积分
36130
发表于 2010-12-15 23:45:31 | 显示全部楼层
对楼主表示无语。。。:funk:
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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