手游智能反外挂Android端接入文档(C/C++)

接入步骤

引入jar

  1. 复制nethtprotect.jar到游戏工程的libs下
  2. 在游戏项目的build.gradle中添加对nethtprotect.jar的依赖。

引入so

在 android 工程加载游戏 so 的地方,添加对libNetHTProtect.so 的引用。

public class Game {
    static {
        System.loadLibrary("NetHTProtect");
        System.loadLibrary("game");
    }
} 

注意:libNetHTProtect.so的加载顺序,需要在游戏自己的 so 之前。

链接so

在 jni/android.mk 中添加如下代码,用于链接libNetHTProtect.so

include $(CLEAR_VARS)
LOCAL_MODULE := libNetHTProtect
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libNetHTProtect.so
include $(PREBUILT_SHARED_LIBRARY)

在 jni/Android.mk 中,游戏所在 so 节,添加如下代码,用于指示对 libNetHTProtect 的引用

LOCAL_SHARED_LIBRARIES += libNetHTProtect

权限声明

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

注意:如果权限声明已经添加,不用重复添加

SDK接口调用

初始化

初始化反外挂,开启反外挂服务,在游戏启动后调用

函数原型:

void htp_init(const char* game_key);

参数说明:

参数说明
game_key易盾HTP分配gameKey,与手游加固的appKey对应

game_key 请联系易盾获取。

用户登录

反外挂sdk接入中传入角色ID等信息后,数据处理时会将角色ID等信息与反外挂数据、设备信息关联,能实时获取恶意玩家使用外挂情况,游戏可通过相应数据最恶意玩家精准打击。

函数原型:

void htp_set_role_info(const char* role_id, const char* role_name, const char* role_account, const char* role_server, const char* game_json);

参数说明:

参数说明赋值
role_id玩家的角色ID可填空
role_name玩家的角色名称可填空
role_account玩家的角色账号可填空
role_server玩家的角色服务器可填空
game_json游戏需要上传的信息,对应一个json字符串,包含key可填空

game_json字段说明:

KEY名称KEY类型KEY值是否必须官网标识说明
游戏版本号字符串GameVersion可选游戏版本
资源版本号字符串AssetVersion可选资源文件版本
数据转发域名字符串TransHost可选易盾网络不通时,反外挂数据转发域名地址
数据转发IP字符串TransIP可选易盾网络不通时,反外挂数据转发IP
数据转发端口intTransPort可选易盾网络不通时,反外挂数据转发端口

数据转发域名/IP/端口:
设置之后,当数据发送到易盾后端失败后,会继续向游戏服务端发送数据,由游戏方服务端转发到易盾后端.域名和IP可以选择设置一个或者都设置,端口默认使用80.此字段设置前需要和易盾技术人员确定.尽量默认接入的时候带上,之后有需要再搭建服务端转发,数据转发只会在发送到易盾服务端失败的情况下会走转发流程。

通用查询

反外挂SDK提供root、模拟器、反外挂版本等信息查询服务,以及其他定制功能。

函数原型:

int htp_ioctl(int request, const char* data, /*[out]*/char* buf, size_t size, /*[out]*/size_t *used_buf_size);

参数说明:

参数说明
request对应向反作弊模块请求的命令
data对应设置信息的附加数据,可为空
buf返回数据buffer
size返回数据buffer大小
used_buf_size实际使用的buffuer大小

request值:

enum RequestCmdID {
    Cmd_GetEmulatorName = 1,
    Cmd_IsRootDevice = 2,
    Cmd_DeviceID = 3,
    Cmd_GetHTPVersion = 7,
    Cmd_GetEncHTPVersion = 9
};

返回值:

错误返回 unsupported request (不支持的命令),正确返回对应命令的结果

存档加解密

存档数据存在被篡改的风险,易盾智能反外挂SDK提供的加解密接口,提高本地数据的安全性

函数原型:

加密对象为String:

int htp_enc_local(const char* buf, size_t size, /*[out]*/char* enc_buf, size_t enc_buf_size, /*[out]*/size_t *used_buf_size);
int htp_dec_local(const char* buf, size_t size, /*[out]*/char* dec_buf, size_t dec_buf_size, /*[out]*/size_t *used_buf_size);

返回值:

返回的数据即为原始数据的密文,开发者需要自行对加密后的数据进行本地存储

心跳系统

随着安全对抗的日益激烈,网易易盾不断提升反外挂服务的自身安全强度,保障反外挂服务的安全,但也可能存在易盾反外挂服务被中止或者被剥离的风险。为避免反外挂服务被恶意破坏,易盾提供“心跳系统”,定时向游戏方反馈心跳信息,告知游戏方当前反外挂运行状态,既方便游戏方实时掌握反外挂运行状态,也能保障易盾反外挂服务的正常运行。

接口接入须知:

  • 接口需要在init之后方可调用
  • SDK会启动线程来调用onReceive函数,请注意多线程问题

函数原型:

void htp_register_info_receiver(IInfoReceiver* receiver);

参数说明:

参数类型说明
receiverIInfoReceiver回调函数,接收心跳信息

接口定义:

#ifdef __cplusplus
class IInfoReceiver
{
public:
    virtual ~IInfoReceiver(){}
    virtual void onReceive(int InfoType, const char* info) = 0;
};
#endif

onReceive 参数说明:

参数类型说明
Typeint接收数据的类型
Infoconst char*接收的具体数据

目前支持的type类型有:

定义说明
1INFO_TYPE_HEARTBEAT心跳数据,可直接在客户端解析
2INFO_TYPE_ENC_HEARTBEAT加密后的心跳数据,必须发往服务端进行解密

注:两种type类型均可接收,也可只接收其中一种,建议只获取加密后的心跳数据,然后发往服务端进行解析。

心跳系统是每10s内会返回一次数据(“Info”),返回的数据为一个字符串,“Info”包含三种信息,分别是序列号、时间戳、网络状态,使用“key:value”格式并使用“||”分割,含义如下表所示:

名称标示说明异常情况是否每次必有
序列号seq从初始值“1”开始递增序列号不存在,或者乱序
时间戳t当前时间戳,以秒为单位时间戳非当前时间
网络标识net数据发送是否成功
(1 为成功,0 为失败)
网络异常,数据发送失败,则网络标识为0

Info的返回值示例:

  • 易盾网络通信正常时:
seq:1||t:1589781840||net:1
  • 易盾网络通信异常时:
seq:1||t:1589781840||net:0

处理建议:

  • seq、t和net是否出现,该三个标识为心跳系统一定会返回的值,若无,说明反外挂异常
  • seq的值是否符合"从1开始依次递增"的规则,若不符合,说明返回值被篡改
  • net为0是否长期出现,若5分钟内net的取值都为0,说明网络异常

数据校验

游戏协议如被破解,若为单机游戏,可直接影响到存档文件的安全性;若为帧同步游戏,则可通过破解协议修改战斗数据;其他类型游戏亦可被做成脱机协议,用于攻击或脱机外挂。为保障游戏协议安全,易盾提供”数据校验“方案,采用自研通讯协议校验算法。

接口接入须知:

客户端接入数据校验接口后,服务端对对应的数据进行校验,服务端数据校验相关文档请联系易盾获取。

函数原型:

int htp_get_data_sign(int alg_type, const char* data, /*[out]*/char* buf, size_t size, size_t* used_buf_size);

参数说明:

参数说明
data待校验的数据
alg_type表示算法标识,需要联系易盾人员
buf返回的数据即为校验结果,开发者需要将原始数据与校验结果发送到游戏服务端,由游戏服务端校验
size返回数据大小
used_buf_size实际使用数据的大小