用浏览器浏览图片

本文介绍了一个基于Windows的简单文件服务器实现案例,该服务器能够监听指定端口接收客户端请求,并从指定目录中发送文件给客户端。文章涵盖了初始化监听套接字、枚举文件夹中的文件、创建线程处理客户端连接等关键步骤。
#include <windowsx.h>
#include <Winsock2.h>
#include<ShlObj.h>
#include<assert.h>
#include<io.h>
#include<ctime>
usingnamespace std;
#include "resource.h"
#pragmacomment(lib,"ws2_32")
 
#define WM_SOCKET WM_USER +1024
 
 
char g_szAllFileName[256][64];
char g_szDirPath[256];
int g_nFileCount=0;
int g_nNext=0;
 
LRESULT DlgProc(HWND hwnd,UINT uMessage,
            WPARAM wParam,LPARAM lParam);
DWORD WINAPI ThreadProc(LPVOID lParam);
SOCKET InitListenSock(UINT nPort);
int InitDirFileName(char *szDirPath);
int EnumAllFile(char *szDirPath);
 
int WINAPI WinMain(IN HINSTANCE hInstance, IN HINSTANCE hPrevInstance,
               IN LPSTR lpCmdLine, IN int nShowCmd )
{
   ::DialogBox(hInstance,LPCTSTR(IDD_MYDLG),
      NULL,DLGPROC(DlgProc));
   return TRUE;
}
LRESULT DlgProc(HWND hwnd,UINT uMessage,
            WPARAM wParam,LPARAM lParam)
{
   static SOCKET listenSock;
   static WSADATA wsaData;
   static HANDLE pThread[64];
   static UINT nThreadCount=0;
   staticint len=sizeof(SOCKADDR_IN);
   static UINT uPort=5555;
    staticchar szDirPath[MAX_PATH];
   staticchar szGetBuf[1024];
   staticchar szIP[32];
   staticchar szPort[6];
   staticint nBufLen=0;
   static BROWSEINFO bi;
   static LPITEMIDLIST pidl;
 
   SOCKADDR_IN newSockaddr;  
   SOCKET newAccept;
   switch(uMessage) {
   case WM_INITDIALOG:
     
      srand((unsignedint)time(NULL));
      SetWindowText(GetDlgItem(hwnd,IDC_EDT_PORT),"5555");
     
      SetWindowText(GetDlgItem(hwnd,IDC_EDT_FILEDIR),
         "F://NET");   
      SetWindowText(GetDlgItem(hwnd,IDC_EDT_IP),"http://127.0.0.1:5555");
      WSAStartup(MAKEWORD(2,2),&wsaData);        
      return TRUE;
     
   case WM_CLOSE: 
      closesocket(listenSock);
      WSACleanup();
      EndDialog(hwnd,wParam);
      PostQuitMessage(0);
      return TRUE;
   case WM_COMMAND:
      switch(LOWORD(wParam))
      {
      case IDC_BT_CHOOSE:        
         ZeroMemory(&bi,sizeof(bi));
         bi.hwndOwner=NULL;
         bi.lpszTitle="选择文件夹";
         bi.ulFlags=BIF_RETURNONLYFSDIRS;
         pidl = SHBrowseForFolder(&bi);      
         ZeroMemory(szDirPath,MAX_PATH);
         SHGetPathFromIDList(pidl, szDirPath);
         SetWindowText(GetDlgItem(hwnd,IDC_EDT_FILEDIR),
            szDirPath);
         return TRUE;
      case IDOK:           
 
         GetWindowText(GetDlgItem(hwnd,IDC_EDT_FILEDIR),szDirPath,256);
         GetWindowText(GetDlgItem(hwnd,IDC_EDT_PORT),szPort,6);
         strcpy(szIP,"http://127.0.0.1:");
         strcat(szIP,szPort);
         SetWindowText(GetDlgItem(hwnd,IDC_EDT_IP),szIP);
           
         if((g_nFileCount =InitDirFileName(szDirPath))==0)
            exit(0);
          
         uPort=atoi(szPort);
         listenSock=InitListenSock(uPort);
         if(WSAAsyncSelect(listenSock,hwnd,WM_SOCKET,FD_ACCEPT|FD_CLOSE)
            ==SOCKET_ERROR )
         {
            MessageBox(NULL,"SAAsyncSelect",NULL,MB_OK);
            exit(0);
         }
         if(listen(listenSock,5)==SOCKET_ERROR)
         {
            MessageBox(NULL,"listen",NULL,MB_OK);
            exit(0);
         }
        
         ::EnableWindow(::GetDlgItem(hwnd,IDOK),false);
     
         return TRUE;
      case IDCANCEL:
         EndDialog(hwnd,0);
         return TRUE;
      }
      break;
   case WM_SOCKET:
      if(WSAGETSELECTERROR(lParam))
      {
         closesocket((SOCKET)wParam);
         return TRUE;
      }
      switch(WSAGETSELECTEVENT(lParam)) {          
            case FD_ACCEPT:              
            if((newAccept=accept(listenSock,(sockaddr*)&newSockaddr,&len))==
                INVALID_SOCKET)
            {              
                exit(0);
            }
            WSAAsyncSelect(newAccept,hwnd,WM_SOCKET,FD_CLOSE|FD_READ|FD_WRITE);
            return TRUE;
         case FD_READ:           
            nBufLen= recv((SOCKET)wParam,szGetBuf,1024,0);
            szGetBuf[nBufLen]='/0';          
               return TRUE;
         case FD_WRITE:
            if((pThread[nThreadCount] = CreateThread(NULL,0,
                ThreadProc,(LPVOID)wParam, 0, NULL))!=NULL)
                ++nThreadCount;
            if (nThreadCount==64)
            {
                nThreadCount=0;
            }
            return TRUE;
         case FD_CLOSE:
            MessageBox(NULL,"CLOSE",NULL,MB_OK);
            closesocket((SOCKET)wParam);           
            return TRUE;
      }
      return TRUE;
   }
   return FALSE;
}
SOCKET InitListenSock(UINT uPort)
{
   SOCKET listenSock;
   int iRet=0;
   if((listenSock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET)
   {
      MessageBox(NULL,"socket","错误",MB_OK);
      exit(1);
   }
 
   SOCKADDR_IN listenAddr;
   listenAddr.sin_family=AF_INET;
   listenAddr.sin_port=htons(uPort);
   listenAddr.sin_addr.s_addr=htonl(INADDR_ANY); 
  
   iRet=bind(listenSock,(sockaddr*)&listenAddr,sizeof(listenAddr));
   if (iRet==SOCKET_ERROR) 
   {
      MessageBox(NULL,"bind","错误",MB_OK);
      exit(1);
   }
   return listenSock;
}
 
int InitDirFileName(char *szDirPath)
{  
   char *pStr=g_szDirPath;
   while (*szDirPath!='/0')
   {
      if(*szDirPath=='//')
      {
         *pStr='//';
         ++pStr;
         *pStr='//';
      }
      else
         *pStr=*szDirPath;
      ++szDirPath;
      ++pStr;
   }
   *pStr='//';
   ++pStr;
   *pStr='//';
   ++pStr;
   *pStr='/0';
 
   return EnumAllFile(g_szDirPath);
}
int EnumAllFile(char *szDirPath)
{
 
   int nCount=0;
   WIN32_FIND_DATA fd;
   ZeroMemory(&fd,sizeof(WIN32_FIND_DATA));
   BOOL bFind=TRUE;
   char szTempDirPath[256];
   strcpy(szTempDirPath,szDirPath);
   strcat(szTempDirPath,"*");
   HANDLE hFind=FindFirstFile(szTempDirPath,&fd);
   assert(hFind);
 
   while( bFind &&nCount<256)
   {
      if( FindNextFile(hFind, &fd) )
      {
         if( (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            && strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..") )
            continue;
         elseif( strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..") )
         {
            strcpy(g_szAllFileName[nCount],fd.cFileName);       
            ++nCount;
         }
      }
      else        
         bFind=FALSE;   
   } 
   return nCount;
}
DWORD WINAPI ThreadProc(LPVOID lParam)
{
   int iRet=0;
   char szFileName[256];
   strcpy(szFileName,g_szDirPath);
   if (g_nNext==g_nFileCount)
   {
      g_nNext=0;
   }
   strcat(szFileName,g_szAllFileName[g_nNext]);
   ++g_nNext;
 
   int file =open(szFileName,0x100|002);
 
   int len;
   char *buf=NULL;
 
   len=filelength(file);
   buf=(char*)malloc(len);
   if (buf==NULL)
   {
      free(buf); 
      exit(0);
   }
   read(file,buf,len);
 
 
   SOCKET newAccept=(SOCKET)lParam;
 
   if((iRet=send(newAccept,buf,len,0))==SOCKET_ERROR)
   {
      free(buf); 
      exit(0);
   }
 
   shutdown(newAccept,SD_RECEIVE);
   closesocket(newAccept);
   free(buf); 
 
   return TRUE;
}
 
内容概要:本文详细记录了对一个Android ARM64静态ELF文件中字符串加密机制的逆向分析过程。该ELF文件的所有字符串均被加密,无法通过常规strings命令或IDA直接识别。作者通过分析发现,加密字符串存储在.rodata段,其解密所需信息(包括密文地址、长度和16位密钥)保存在.data.rel.ro段的40字节描述符中。核心解密函数sub_10F408采用自反的双pass流密码算法,结合固定密钥KEY_TERM(由.data段24字节数据计算得出),实现字节级非线性、位置与长度相关的加密。文章还复现了完整的Python解密脚本,并揭示了该保护机制的本质为代码混淆而非强加密,最终成功批量解密全部956条字符串,暴露程序真实行为,如shell命令模板、设备标识篡改、网络重置等操作。此外,文中还提及未启用的自定义壳框架及其反dump设计。; 适合人群:具备逆向工程基础的安全研究人员、二进制分析人员及对ELF保护技术感兴趣的开发者。; 使用场景及目标:①学习ELF二进制中字符串加密的典型实现方式与逆向突破口;②掌握从结构识别、函数追踪到算法还原的完整逆向流程;③理解“绑定二进制”的完整性校验设计及其局限性;④实践编写IDAPython脚本自动化提取与解密敏感数据。; 阅读建议:此资源以实战案例驱动,不仅展示技术细节,更强调逆向思维与验证方法,建议读者结合IDA调试环境,逐步跟随文中步骤进行动态分析与算法验证,深入理解每一步的推理依据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值