首页
社区
课程
招聘
[求助]hook accept拒绝连接
发表于: 2012-3-5 09:46 5832

[求助]hook accept拒绝连接

2012-3-5 09:46
5832
需要限制程序A的网络连接(比如一天一个IP只能connect几次),无法修改程序A,于是采用了注入hook其accept,如下:
SOCKET WSAAPI myaccept(
	   SOCKET s,
	   struct sockaddr FAR * addr,
	   int FAR * addrlen
    )
{
 	static int count=0;
 	lpfnaccept real_accept=(lpfnaccept)HookItem.pOldFunEntry;
 	SOCKET sClient=((lpfnaccept)addr)(s,addr,addrlen);
 	SYSTEMTIME systm;
 	::GetLocalTime(&systm);
 	SOCKADDR_IN peer_addr;
 	int peer_addrlen=sizeof peer_addr;
 	::getpeername(sClient,(LPSOCKADDR)&peer_addr,&peer_addrlen);
 	log(systm,peer_addr);

	if (count>3)
	{
		count=0;
		::closesocket(sClient);
		return INVALID_SOCKET;
	}
	else
	{
		++count;
 		return sClient;
 	}
}

结果发现如果原本返回sClient则没有问题,如果拒绝访问return INVALID_SOCKET;一次后则后续的所有connect都会失败,并且不会写入log,也就是说没有再调用我的myaccept?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
2
这种问题详细跟进去看看试试,或者返回值是不是该用其他的,看看accept下层有什么逻辑。
2012-3-7 10:41
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
一直对C中的static不太理解
static int count=0,在函数内部的static变量也是可以全局存取的吗?
2012-3-7 11:01
0
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
程序A其实就是SQLServer2000的服务程序sqlservr.exe
2012-3-7 16:32
0
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间都不释放),也可以认为是其内存地址不变,直到整个程序运行结束(相反,而auto自动变量,即动态局部变量,属于动态存储类别,占动态存储空间,函数调用结束后即释放)。静态变量虽在程序的整个执行过程中始终存在,但是在它作用域之外不能使用(不能直接引用,但是可以间接引用)
如:
int *p=NULL;
void test(bool b=true)
{
    static int c=0;
    if(b)
    p=&c;
    else
    printf("%d\n",c);
}
int main(int argc, char* argv[])
{
        test();
        *p=123;
        test(false);
        getchar();
        return 0;
}
2012-3-7 16:44
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
多谢楼主指导。
2012-3-9 12:04
0
游客
登录 | 注册 方可回帖
返回
//