您的位置:首页 > 其它

DLL劫持三:inline hook JMP实例 (UDP recvfrom)

2013-08-30 17:34 211 查看
核心代码从网上找的,但原始函数调用一直有问,经过分析 整理并测试成功。

#include <stdio.h>
#include<windows.h>

#pragma comment( lib, "Ws2_32.lib" )

DWORD OldProtect2;
byte pData[10];    //保留原始函数的调用
FARPROC FunAddr;   //生成新的函数调用

typedef int ( WINAPI RecvFromFN)( SOCKET s, char *buf, int len, int flags, sockaddr *from, int *fromlen);
RecvFromFN* pfnOrigRecvFrom ;

void inhook(char* path,char* FunctionName,DWORD NewAddr)
{
if(FunAddr!=0)
return ;
HMODULE ModuleHandle= LoadLibraryA(path);
FunAddr = GetProcAddress(ModuleHandle,FunctionName);

VirtualProtect(FunAddr,5,PAGE_EXECUTE_READWRITE,&OldProtect);
ZeroMemory(pData,10);
RtlMoveMemory(pData,FunAddr,5);
long b;
b=NewAddr-((long)FunAddr+5);
byte a[5];
a[0]=0xE9;
RtlMoveMemory(&a[1],&b,4);
WriteProcessMemory(GetCurrentProcess(),FunAddr,a,5,NULL);
pData[5]=0xE9;
pData[6]=0;
pData[7]=0;
pData[8]=0;
pData[9]=0;
b=(long)FunAddr+5-(long)(pData+10);
WriteProcessMemory(GetCurrentProcess(),pData+6,&b,4,NULL);
FreeLibrary(ModuleHandle);

//下面这两行用于调用原始函数
pfnOrigRecvFrom = (RecvFromFN*) (DWORD) (pData);
VirtualProtect(pfnOrigRecvFrom,10,PAGE_EXECUTE_READWRITE,&OldProtect2);

}
void unhook(void)
{
if(FunAddr==0)
return ;
WriteProcessMemory(GetCurrentProcess(),FunAddr,pData,5,NULL);
VirtualProtect(FunAddr,5,OldProtect,NULL);
FunAddr=0;
ZeroMemory(pData,10);
VirtualProtect(pfnOrigRecvFrom,10,OldProtect2,NULL);  //恢复原始函数指针
}

int WINAPI Mine_RecvFrom(SOCKET s, char *buf, int len, int flags, sockaddr *from, int *fromlen)
{
int tmpRet = pfnOrigRecvFrom(s,buf,len,flags,from,fromlen);
sockaddr_in * pSin = (sockaddr_in *) from;

//显示接收数据长度,来源IP和端口
fprintf(stdout,"Recv Data Size:%d From:%s:%d.\n",tmpRet, inet_ntoa(pSin->sin_addr),ntohs(pSin->sin_port));

return tmpRet;
}


以上代码在进程内调用有效,也支持进程内DLL方式,实际调用时使用代码

inhook("Ws2_32.dll","recvfrom",(DWORD) Mine_RecvFrom);

就可以了,DLL的话在DllMain中直接加载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: