Android 逆向Android 逆向通用工具开发 ( 网络模块开发 | SOCKET 网络套接字初始化 | 读取远程端 “Android 模拟器“ 信息 | 向远程端写出数据 )

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 逆向Android 逆向通用工具开发 ( 网络模块开发 | SOCKET 网络套接字初始化 | 读取远程端 “Android 模拟器“ 信息 | 向远程端写出数据 )相关的知识,希望对你有一定的参考价值。

前言

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





一、SOCKET 网络套接字初始化



CNetwork::CNetwork() 构造函数中 , 初始化套接字 , 初始化时设置 无效套接字 INVALID_SOCKET ;

CNetwork::CNetwork()
{
	// 初始化套接字 , 初始化时设置 无效套接字 INVALID_SOCKET
	m_server = INVALID_SOCKET;
}

在初次连接时 , 判断当前套接字是否是无效的 ,

  • 如果当前套接字是无效的 , 则初始化网络 , 建立网络连接 ;
  • 如果当前套接字不是无效的 , 则关闭当前套接字 , 然后设置为无效套接字 ;
bool CNetwork::WaitClientOnline()
{
	/* 等待客户端联网时 , 判断当前套接字是否是无效的 ,
	   如果当前套接字是无效的 , 则初始化网络 , 建立网络连接
	   如果当前套接字不是无效的 , 则关闭当前套接字 , 然后设置为无效套接字
	*/
	if (m_server != INVALID_SOCKET) {
		
		closesocket(m_server);
		m_server = INVALID_SOCKET;
	}
	int ret = 0;
	sockaddr_in server;
	BOOL bsocket;
	m_server = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
	bsocket = TRUE;
	server.sin_family = AF_INET;
	/* 连接本机 IP 地址 , 如果是与真机连接 , 这里设置手机在局域网的 IP 地址 */
	server.sin_addr.s_addr = inet_addr("127.0.0.1");
	/* 自定义端口 , 手机端 与 PC 端约定一致即可 , 1024 ~ 65535 范围 , 1024 以下是系统使用的端口 */
	server.sin_port = htons(9527);
	/* 正式连接的方法 */
	ret = connect(m_server, (const struct sockaddr*)&server, sizeof(server));
	if (ret < 0) {
		printf("错误信息:%s\\n", (LPCSTR)GetErrorString());
		return false;
	}
	return true;
}




二、SOCKET 网络套接 读取远程端 ( android 模拟器 ) 信息



从 Android 模拟器端获取数据 , 先准备发送的命令 , 将命令拼接成 json 字符串 ;

	Json::Value cmd;
	cmd["cmd"] = CMD_READ_DATA;
	std::string s = cmd.toStyledString();

通过 SOCKET 网络通信 , 将数据传递到 Android 模拟器端 ;

	/* 通过网络通信 , 将数据传递到远程端 */
	int ret = send(m_server, s.c_str(), s.size(), 0);

之后 , 调用 recv 方法 , 开始阻塞 , 等待远程端返回数据 , 如果接收数据出错 , 返回值小于 0 , 打印出错信息 ;

	/* 阻塞 , 等待接收远程反馈信息 */
	char buffer[4096]="";
	ret = recv(m_server, buffer, sizeof buffer, 0);
	/* 如果接收失败 , 打印错误信息 */
	if (ret < 0) {
		printf("错误信息:%s\\n", (LPCSTR)GetErrorString());
		return false;
	}

接收到数据后 , 解析该数据 ;

	/* 解析接收到的远程数据信息 */
	Json::Reader reader;
	if (reader.parse(buffer, root)) {
		printf("解析数据成功!\\n");
		return true;
	}

完整代码 :

/* 读取远程端 ( Android 模拟器 ) 信息 */
bool CNetwork::ReadData(Json::Value& root)
{
	if (m_server == INVALID_SOCKET) {
		printf("客户端没有连接\\n");
		return false;
	}
	Json::Value cmd;
	cmd["cmd"] = CMD_READ_DATA;
	std::string s = cmd.toStyledString();

	/* 通过网络通信 , 将数据传递到远程端 */
	int ret = send(m_server, s.c_str(), s.size(), 0);
	/* 发送完成后 , 进行错误判断 */
	if (ret < 0) {
		printf("错误信息:%s\\n", (LPCSTR)GetErrorString());
		return false;
	}
	/* 阻塞 , 等待接收远程反馈信息 */
	char buffer[4096]="";
	ret = recv(m_server, buffer, sizeof buffer, 0);
	/* 如果接收失败 , 打印错误信息 */
	if (ret < 0) {
		printf("错误信息:%s\\n", (LPCSTR)GetErrorString());
		return false;
	}
	/* 解析接收到的远程数据信息 */
	Json::Reader reader;
	if (reader.parse(buffer, root)) {
		printf("解析数据成功!\\n");
		return true;
	}
	printf("解析数据失败:%s\\n", buffer);
	return false;
}




三、SOCKET 网络套接 向远程端 ( Android 模拟器 ) 写出数据



写出数据比较简单 , 直接将要写出的数据拼接成 json 指令 , 然后直接发送到 Android 模拟器端即可 ;

完整代码实现 :

/* 向远程端 ( Android 模拟器 ) 写出数据 */
bool CNetwork::WriteGold(double gold)
{
	if (m_server == INVALID_SOCKET) {
		printf("客户端没有连接\\n");
		return false;
	}
	/* 拼接要发送的数据信息 */
	Json::Value root;
	root["cmd"] = CMD_WRITE_GOLD;
	root["data"] = gold;
	/* 将 json 数据转为字符串 */
	std::string s = root.toStyledString();

	/* 将转换的字符串发送到 Android 模拟器端 */
	int ret = send(m_server, s.c_str(), s.size(), 0);

	/* 如果发送出错 , 则打印报错信息 */
	if (ret < 0) {
		printf("错误信息:%s\\n", (LPCSTR)GetErrorString());
		return false;
	}
	return true;
}

以上是关于Android 逆向Android 逆向通用工具开发 ( 网络模块开发 | SOCKET 网络套接字初始化 | 读取远程端 “Android 模拟器“ 信息 | 向远程端写出数据 )的主要内容,如果未能解决你的问题,请参考以下文章

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 分析 )