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

核心代码从网上找的,但原始函数调用一直有问,经过分析 整理并测试成功。

 

#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中直接加载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值