-
-
[旧帖] [邀请码已发][原创]菜鸟学习寒江独钓的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;
}
目前只是通过判断进程名来区分进程,今后如果学会其他的方法在更新。
一、得到进程名字的位置:这个方法在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;
}
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
看原图
赞赏
雪币:
留言: