注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

且行且记录

点滴记录,行的更远!

 
 
 

日志

 
 

sendto/recvfrom测试  

2015-06-02 12:37:06|  分类: 一些练习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
注入qq,用它做测试对象。代码如下:

// 编译 cl /LD udphook.cpp ws2_32.lib
#include <windows.h>
#include <stdio.h>

#define NAKED   __declspec( naked )

BOOL ISHOOK=FALSE;
HINSTANCE hDll;

BYTE Code[]={0x8b, 0xff, 0x55, 0x8b, 0xec};
LPBYTE next5_sendto;
LPBYTE addr_sendto;
LPBYTE next5_recvfrom;
LPBYTE addr_recvfrom;

void Output(char *fmt, ...)
{
   char Buff[1024];

   va_list arg_ptr;
   va_start(arg_ptr, fmt); 
   vsprintf(Buff, fmt, arg_ptr);
   va_end(arg_ptr);
   OutputDebugString(Buff);
}

NAKED int WINAPI old_sendto(
SOCKET s,                        
const char FAR * buf,            
int len,                         
int flags,                       
const struct sockaddr FAR * to,  
int tolen                        
)
__asm{
mov edi, edi
push ebp
mov ebp, esp
jmp next5_sendto
}
}

int WINAPI new_sendto(
SOCKET s,                        
const char FAR * buf,            
int len,                         
int flags,                       
const struct sockaddr FAR * to,  
int tolen                        
)
{
int i,j,max;
char buffer[512];
struct sockaddr_in *sain=(struct sockaddr_in *)to;
sprintf(buffer, "[sendto_ip_port] %s:%d [end]", inet_ntoa( sain->sin_addr ), ntohs(sain->sin_port));
OutputDebugString(buffer);

max = (len>32)?32:len;
j=sprintf(buffer, "%s", "[sendto_data] ");
for (i=0; i<max; i++)
{
sprintf(buffer+j+3*i, "%02X ", *((PBYTE)buf+i));
}
strcat(buffer, "[end]");
OutputDebugString(buffer);

old_sendto(s, buf, len, flags, to, tolen);
return 0;
}

NAKED int WINAPI old_recvfrom (
  SOCKET s,                   
  char FAR* buf,              
  int len,                    
  int flags,                  
  struct sockaddr FAR* from,  
  int FAR* fromlen            
)
{
__asm{
mov edi, edi
push ebp
mov ebp, esp
jmp next5_recvfrom
}
}

int WINAPI new_recvfrom (
  SOCKET s,                   
  char FAR* buf,              
  int len,                    
  int flags,                  
  struct sockaddr FAR* from,  
  int FAR* fromlen            
)
{
int i,j,n,max;
char buffer[512];

n=old_recvfrom(s, buf, len, flags, from, fromlen);
if (n>0)
{
struct sockaddr_in *sain=(struct sockaddr_in *)from;
sprintf(buffer, "[recvfrom_ip_port] %s:%d [end]", inet_ntoa( sain->sin_addr ), ntohs(sain->sin_port));
OutputDebugString(buffer);

max = (n>32)?32:n;
j=sprintf(buffer, "%s", "[recvfrom_data] ");
for (i=0; i<max; i++)
{
sprintf(buffer+j+3*i, "%02X ", *((PBYTE)buf+i));
}
strcat(buffer, "[end]");
OutputDebugString(buffer);
}

return 0;
}

int hook(void)
{
HINSTANCE h;
DWORD flOldProtect;

h=LoadLibrary("ws2_32.dll");
if (h==NULL)
{
Output("LoadLibrary Failed!\n");
return 0;
}

addr_sendto=(PBYTE)GetProcAddress(h,"sendto");
if (addr_sendto==NULL) return 0;
Output("ws2_32!sendto=0x%08X\n",addr_sendto);
if ( memcmp(addr_sendto, Code, 5)!=0 ) return 0;

VirtualProtect((LPVOID)addr_sendto,5,PAGE_EXECUTE_READWRITE,&flOldProtect);
*addr_sendto = 0xe9; //jmp
*(PDWORD)(addr_sendto+1) = (DWORD)new_sendto - (DWORD)addr_sendto - 5; //delta
VirtualProtect((LPVOID)addr_sendto,5,flOldProtect,&flOldProtect);

next5_sendto = addr_sendto+5;

addr_recvfrom=(PBYTE)GetProcAddress(h,"recvfrom");
if (addr_recvfrom==NULL) return 0;
Output("ws2_32!recvfrom=0x%08X\n",addr_recvfrom);

if ( memcmp(addr_recvfrom, Code, 5)!=0 ) return 0;

VirtualProtect((LPVOID)addr_recvfrom,5,PAGE_EXECUTE_READWRITE,&flOldProtect);
*addr_recvfrom = 0xe9; //jmp
*(PDWORD)(addr_recvfrom+1) = (DWORD)new_recvfrom - (DWORD)addr_recvfrom - 5; //delta
VirtualProtect((LPVOID)addr_recvfrom,5,flOldProtect,&flOldProtect);

next5_recvfrom = addr_recvfrom+5;

ISHOOK=TRUE;
//FreeLibrary(h);

return 0;
}

void unhook(void)
{
DWORD flOldProtect;

VirtualProtect((LPVOID)addr_sendto,5,PAGE_EXECUTE_READWRITE,&flOldProtect);
memcpy(addr_sendto, Code, 5);
VirtualProtect((LPVOID)addr_sendto,5,flOldProtect,&flOldProtect);

VirtualProtect((LPVOID)addr_recvfrom,5,PAGE_EXECUTE_READWRITE,&flOldProtect);
memcpy(addr_recvfrom, Code, 5);
VirtualProtect((LPVOID)addr_recvfrom,5,flOldProtect,&flOldProtect);

ISHOOK=FALSE;
}

DWORD WINAPI ClientThread(LPVOID lpParam)
{
OutputDebugString("[*] Sleep 30s ...\n");
Sleep(30000); // 测试用

OutputDebugString("[*] FreeLibraryAndExitThread\n");
FreeLibraryAndExitThread(hDll,0);
return 0;
}

BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, PVOID fImpLoad)
{
HANDLE hThread;
DWORD dwThreadId;

hDll=hinstDll;

   if (fdwReason == DLL_PROCESS_ATTACH)
{
if (!ISHOOK)
{
hook();

hThread = CreateThread(NULL, 0, ClientThread, NULL, 0, &dwThreadId);
if (hThread == NULL)
{
return TRUE;
}
CloseHandle(hThread);
}


   }

   if (fdwReason == DLL_PROCESS_DETACH)
{
if (ISHOOK)
{
unhook();
}
}

   return(TRUE);
}
  评论这张
 
阅读(100)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017