首页
社区
课程
招聘
[旧帖] [邀请码已发][原创]菜鸟学习寒江独钓的txt透明加密心得(二):区分进程 0.00雪花
发表于: 2010-4-9 10:55 1286

[旧帖] [邀请码已发][原创]菜鸟学习寒江独钓的txt透明加密心得(二):区分进程 0.00雪花

2010-4-9 10:55
1286
再发心得一的时候,大家建议我详细的说明一下文件透明加密的相关知识,所以我就一个模块一个模块的进行整理,等所有模块的相关知识整理完毕后我把源代码发上来。

目前只是通过判断进程名来区分进程,今后如果学会其他的方法在更新。
一、得到进程名字的位置:这个方法在filemon的源代码中也看到过,感觉不错。这里我贴上filemon中的代码,个人感觉可移植性比较强。rootkit一书中也有相关的代码和介绍。
方法:windows内部对每个进程维护了一个eprocess的结构,对于不同的系统,该结构不同,所以确定进程名的位置比较麻烦。但是方法总是有的,那就是驱动中DriverEntry(入口)函数总是在一个名为System的进程(实际上system不属于系统进程,也不叫进程,不过习惯上大家都这么称呼)中执行,这就为我们提供了方便,我们可以通过
PsGetCurrentProcess()函数获取eprocess的结构的首地址,然后在这个结构中查找“system”字符串,找到后我们记录下该字符串的地址,即进程名字的位置在当前的系统中已经找到。
注意:该函数必须在DriverEntry中进行调用才能保证得到正确的位置。
//////////////////////////////////////////////////////////////////////////
#define SYSNAME    "System"
//////////////////////////////////////////////////////////////////////////
ULONG
FilemonGetProcessNameOffset(
                                                        VOID
                                                        )
{
        PEPROCESS       curproc;
        int             i;

        curproc = PsGetCurrentProcess();

        //
        // Scan for 12KB, hoping the KPEB never grows that big!
        //我估计PAGE_SIZE=4096,有待调试的时候进行验证。
        for( i = 0; i < 3*PAGE_SIZE; i++ ) {

                if( !strncmp( SYSNAME, (PCHAR) curproc + i, strlen(SYSNAME) )) {

                        return i;
                }
        }

        //
        // Name not found - oh, well
        //
        return 0;
}
二、有了上面的进程名字的位置,下面获取进程的名称也就没什么困难了:
ULONG               ProcessNameOffset;
#define NT_PROCNAMELEN  16
#define PROCNAMELEN 32
//////////////////////////////////////////////////////////////////////////
//获取进程名 格式(进程名:pid)
PCHAR
FilemonGetProcess(
                                  PCHAR ProcessName
                                  )
{
        PEPROCESS       curproc;
        char            *nameptr;
        //ULONG           i;

        //
        // We only do this if we determined the process name offset
        //
        if( ProcessNameOffset ) {

                //
                // Get a pointer to the current process block
                //
                curproc = PsGetCurrentProcess();

                //
                // Dig into it to extract the name. Make sure to leave enough room
                // in the buffer for the appended process ID.
                //
                nameptr   = (PCHAR) curproc + ProcessNameOffset;

                strncpy( ProcessName, nameptr, NT_PROCNAMELEN-1 );
                ProcessName[NT_PROCNAMELEN-1] = 0;

#if defined(_IA64_)
                sprintf( ProcessName + strlen(ProcessName), ":%I64d", PsGetCurrentProcessId());
#else
                //把整数PID 打印成一个字符串保存在 ProcessName + strlen(ProcessName)中。
                sprintf( ProcessName + strlen(ProcessName), ":%d", PsGetCurrentProcessId());
#endif

        } else {

                strcpy( ProcessName, "???" );
        }
        return ProcessName;
}
三、判断进程是否是我们想要的进程:
// 判断当前进程是不是notepad.exe
BOOLEAN cfIsCurProcSec(void)
{
    WCHAR name_buf[32] = { 0 };
    UNICODE_STRING proc_name = { 0 };
    UNICODE_STRING note_pad = { 0 };
        UNICODE_STRING sys_pad = { 0 };
    ULONG length;
    RtlInitEmptyUnicodeString(&proc_name,name_buf,32*sizeof(WCHAR));
    length = cfCurProcName(&proc_name);
    RtlInitUnicodeString(¬e_pad,L"notepad.exe");
    if(RtlCompareUnicodeString(¬e_pad,&proc_name,TRUE) == 0)
        return TRUE;
    return FALSE;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//