⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eflow.cpp

📁 从国外网站上下载的关于 逆向工程和协议分析练习 的一个分析文档 对你的加密与解密很有帮助
💻 CPP
字号:
/**
 * 协议交互  
 */

#include "stdafx.h"
#include <string>
#include "crypt.h"
#include "md5.h"
#include <stdlib.h>
#include <time.h>
#include "packet.h"
#include "options.h"
#include "network.h"
#include <windows.h>
#include "debug.h"


static HANDLE m_stop_event = NULL;


int eflow_init(void)
{
	srand(time(NULL));

	options_init();
	
	if ( network_init() < 0 )
	{
		fprintf(stderr,"network_init failed\n");
		return -1;
	}

	m_stop_event = CreateEvent( 0, FALSE, FALSE, 0 );
	return 0;
}


int eflow_exit(void)
{
	network_exit();
	options_exit();
	if (m_stop_event)
	{
		CloseHandle(m_stop_event);
		m_stop_event = NULL;
	}
	return 0;
}


int eflow_loop(void)
{
	int i,len;
	unsigned char buf[512];
	
	//DebugBreak();
	
login:	
	/**
	 * login 请求回应报文的时间一定要足够长。不然,假如发出 5
	 * 个请求后收到了一个回应报文,那么立刻使用里面的 session id
	 * 并 break。但是,server 可能会继续前面 5 个报文中后收到
	 * 的报文,并向我们发送新 session id。这导致 sid 不一致。
	 */
	g_options.recv_timeout = 30;

	while (1)
	{
		len = packet_login(buf,sizeof(buf));
		
		if ( network_send(buf,len) == len )
		{
			len = network_recv(buf,sizeof(buf));
			
			if (len > 0x18)
			{
				decrypt(buf,len);
				
				if (buf[0] == 2 && buf[0x12] == 3 && buf[0x13] == 3 && buf[0x14] == 1 && buf[0x15] == 8)
				{
					g_options.sesslen = buf[0x16];
					if ( g_options.session )
						free(g_options.session);
					g_options.session = (char *)malloc(g_options.sesslen+1);
					memcpy(g_options.session,buf+0x17,g_options.sesslen);
					g_options.session[g_options.sesslen] = '\0';

					debug("Session ID = [%s]\n",g_options.session);
		
					break;
				}
			}
		}

		/// sleep 一段时间,并给 SCM 或 用户一个终止 loop 的机会。
		if ( WaitForSingleObject(m_stop_event, g_options.login_wait ) == WAIT_OBJECT_0 )
		{
			return 0;
		}
	}

	i = 0;
	g_options.recv_timeout = 5;

	while (1)
	{
		/// sleep 一段时间,并给 SCM 或 用户一个终止 loop 的机会。
		/// 只所以放在循环开始位置是避免 login 成功后立刻就发送 ping 包。
		if ( WaitForSingleObject(m_stop_event, g_options.ping_wait ) == WAIT_OBJECT_0 )
		{
			return 0;
		}		

		len = packet_ping(buf,sizeof(buf));
		
		if ( network_send(buf,len) == len )
		{
			len = network_recv(buf,sizeof(buf));
			
			if (len > 0x18)
			{
				decrypt(buf,len);
				
				if (buf[0] == 4 && buf[0x12] == 3 && buf[0x13] == 3 && buf[0x14] == 1)
				{
					debug("pong\n");
					i = 0;
				}
			}
		}

		i++;
		if ( i > 10 )
		{
			/// 如果 10*(recv_timeout + ping_wait/1000) 秒后没收到 pong 包,重新 login
			debug("relogin!\n");
			goto login;
		}
	}

	return 0;
}


/**
 * 被 SCM 或 Ctrl_Handler 调用来指示 eflow_loop 应该终止循环  
 */
int eflow_stop(void)
{
	SetEvent(m_stop_event);
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -