Android 逆向Android 逆向通用工具开发 ( 网络模块开发 | 配置头文件 | 配置编译参数 | 网络初始化 WSAStartup 与清理 WSACleanup 操作 )

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 逆向Android 逆向通用工具开发 ( 网络模块开发 | 配置头文件 | 配置编译参数 | 网络初始化 WSAStartup 与清理 WSACleanup 操作 )相关的知识,希望对你有一定的参考价值。

前言

本篇博客重点分析 CNetwork 网络模块 ;





一、开发前的配置 ( 头文件 | 编译参数设置 )



Windows 中引入网络套接字头文件注意事项 : 必须先引入 WinSock2.h 头文件 , 然后 再引入 Windows.h 头文件 , 否则会报错 ;

#include <WinSock2.h> // WinSock2.h 头文件 必须在 Windows.h 头文件前面
#include <Windows.h> // Windows.h 头文件 必须在 WinSock2.h 头文件后面

使用代码 记录 编译参数选项 :

#pragma warning(disable:4996)
#pragma comment(lib,"Ws2_32.lib")

格式风格宏定义 :

#define FORMAT_STYLE (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS)




二、网络初始化 WSAStartup 与清理 WSACleanup 操作



CNetwork 中 , 定义了一个 WSAPrepare 私有类 ,

在 Windows 中调用网络功能 , 必须执行 WSAStartup 初始化函数 , 否则无法使用网络功能 ; 使用完毕后 , 一定要执行 WSACleanup 函数 , 否则之后的网络操作都会受到影响 ;

上述初始化网络 , 清理网络 操作 , 在使用前初始化 , 使用完毕后清理 ;

使用过程中 , 会创建多个 CNetwork 对象 , 只需要在第一个对象创建前初始化 , 最后一个对象析构后清理即可 ;

没有必要在每个对象中都 执行 网络的初始化 与 清理操作 ; 因此 WSAPrepare 变量被定义成私有静态变量 ;

CNetwork.cpp 中声明了 CNetwork::WSAPrepare CNetwork::wsaforwin; , 确保网络一定会被初始化 , 初始化和析构时 , 不影响网络功能的使用 ;


CNetwork.h 源码 :

#pragma once

#include <WinSock2.h> // WinSock2.h 头文件 必须在 Windows.h 头文件前面
#include <Windows.h> // Windows.h 头文件 必须在 WinSock2.h 头文件后面

#include <SDKDDKVer.h>
#include <afxwin.h>

#include <stdio.h>
#include "../Json/json.h"
enum {
	CMD_READ_DATA = 1,
	CMD_WRITE_GOLD,
	CMD_WRITE_EXP
};

#pragma warning(disable:4996)
#pragma comment(lib,"Ws2_32.lib")
#define FORMAT_STYLE (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS)
class CNetwork
{
public:
	CNetwork();
	~CNetwork();
	bool WaitClientOnline();//等待客户端上线
	bool ReadData(Json::Value& root);//读取数据
	bool WriteGold(double gold);//修改金币
	bool WriteExp(unsigned exp);//修改经验
public:
	static CString GetErrorString();
private:
	SOCKET m_server;
private:
	/* 该私有类的作用是用于整体的网络初始化

	   在 Windows 中调用网络功能 , 必须执行 WSAStartup 初始化函数 , 否则无法使用网络功能
	   使用完毕后 , 一定要执行 WSACleanup 函数 , 否则之后的网络操作都会受到影响

	   上述初始化网络 , 清理网络 操作 , 在使用前初始化 , 使用完毕后清理 ; 
	   使用过程中 , 会创建多个 CNetwork 对象 , 只需要在第一个对象创建前初始化 , 
	   最后一个对象析构后清理即可 ; 
	   没有必要在每个对象中都 执行 网络的初始化 与 清理操作 ; 
	   因此 WSAPrepare 变量被定义成私有静态变量
		
       在 CNetwork 中声明了 CNetwork::WSAPrepare CNetwork::wsaforwin;
	   确保网络一定会被初始化 , 初始化和析构时 , 不影响网络功能的使用
	*/
	class WSAPrepare {
	public:
		WSAPrepare() {
			WSADATA data;
			memset(&data, 0, sizeof(data));
			int ret = WSAStartup(MAKEWORD(2, 2), &data);
			if (ret < 0) {
				printf("网络初始化失败:%s\\n", (LPCSTR)CNetwork::GetErrorString());
				(void)getchar();
				abort();
			}
		}
		~WSAPrepare() {
			if (WSACleanup() < 0) {
				printf("网络关闭失败:%s\\n", (LPCSTR)CNetwork::GetErrorString());
			}
		}
	};
	/* 私有静态成员变量 , 所有的 CNetwork 对象都共享同一个变量 */
	static WSAPrepare wsaforwin;

};


以上是关于Android 逆向Android 逆向通用工具开发 ( 网络模块开发 | 配置头文件 | 配置编译参数 | 网络初始化 WSAStartup 与清理 WSACleanup 操作 )的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向Android 逆向通用工具开发 ( adb forward 网络端口重定向命令 | PC 端逆向程序主函数分析 )

Android 逆向Android 逆向通用工具开发 ( Windows 平台运行的控制台应用程序类型 | 编译 Windows 平台运行的 Android 逆向程序 )

Android 逆向Android 逆向通用工具开发 ( PC 端工程分析 | 网络初始化操作 | PC 端工程核心业务逻辑 )

Android 逆向Android 逆向通用工具开发 ( 静态库项目中的网络操作核心类 CNetwork 分析 )

Android 逆向Android 逆向通用工具开发 ( Android 端远程命令工具 | Android 端可执行程序的 main 函数操作 | TCP 协议服务器建立 | 接收客户端数据 )(代

Android 逆向Android 逆向通用工具开发 ( PC 端工具 hacktool 启动 main 函数分析 | hacktool 工程中的核心类 HackCommand 分析 )