手游智能反外挂Android端接入文档(JAVA)
接入步骤
导入NHP SDK
-
将sdk中的动态库libNetHTProtect.so和nethtprotect.jar对应添加到游戏的包中,可根据游戏CPU架构选择对应的libNetHTProtect.so文件(由于我们的jar会自动加载动态库,不需要在android.mk中进行预编译处理)
-
修改Android工程的AndroidManifest.xml文件中的权限声明,所有权限均为可选,非必须,可添加如下权限:
权限声明
<!--网络通信-->
<uses-permission android:name="android.permission.INTERNET"/>
<!--获取设备信息-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--获取MAC地址-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!--获取网络状态-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
SDK接口调用
初始化
初始化反外挂,开启反外挂服务,在游戏启动后调用
导入接口类:
import com.netease.htprotect.HTProtect;
函数原型:
public static void init(Context context,string gameKey);
参数说明:
参数 | 说明 |
---|---|
context | 当前环境的上下文 |
gameKey | 易盾HTP分配gameKey,与手游加固的appKey对应 |
gameKey请联系易盾获取。
用户登录
反外挂sdk接入中传入角色ID等信息后,数据处理时会将角色ID等信息与反外挂数据、设备信息关联,能实时获取恶意玩家使用外挂情况,游戏可通过相应数据最恶意玩家精准打击。
函数原型:
public static void setRoleInfo(Context context,string roleId, string roleName, string roleAccount, string roleServer, string gameJson);
参数说明:
参数 | 说明 | 赋值 |
---|---|---|
context | 当前环境的上下文 | |
roleId | 玩家的角色ID | 可填空 |
roleName | 玩家的角色名称 | 可填空 |
roleAccount | 玩家的角色账号 | 可填空 |
roleServer | 玩家的角色服务器 | 可填空 |
gameJson | 游戏需要上传的信息,对应一个json字符串,包含key | 可填空 |
gameJson字段说明:
KEY名称 | KEY类型 | KEY值 | 是否必须 | 官网标识 | 说明 |
---|---|---|---|---|---|
游戏版本号 | 字符串 | GameVersion | 可选 | 游戏版本 | |
资源版本号 | 字符串 | AssetVersion | 可选 | 资源文件版本 | |
数据转发域名 | 字符串 | TransHost | 可选 | 易盾网络不通时,反外挂数据转发域名地址 | |
数据转发IP | 字符串 | TransIP | 可选 | 易盾网络不通时,反外挂数据转发IP | |
数据转发端口 | int | TransPort | 可选 | 易盾网络不通时,反外挂数据转发端口 |
数据转发域名/IP/端口:
设置之后,当数据发送到易盾后端失败后,会继续向游戏服务端发送数据,由游戏方服务端转发到易盾后端.域名和IP可以选择设置一个或者都设置,端口默认使用80。此字段设置前需要和易盾技术人员确定。尽量默认接入的时候带上,之后有需要再搭建服务端转发,数据转发只会在发送到易盾服务端失败的情况下会走转发流程。
示例:
HTPotect.setRoleInfo("123456","易小盾","yd@163.com", "游戏测试服","{
"GameVersion":"1.0.1",
"AssetVersion":"1.0.1",
"TransHost":"test.163.com",
"TransIP":"8.8.8.8",
"TransPort":80
}");
通用查询
反外挂SDK提供root、模拟器、反外挂版本等信息查询服务,以及其他定制功能。
函数原型:
public static string htpIoctl(Context context,int request, string data);
参数说明:
参数 | 说明 |
---|---|
context | 当前环境的上下文 |
request | 对应向反作弊模块请求的命令 |
data | 对应设置信息的附加数据,可为空 |
request值:
public enum RequestCmdID
{
Cmd_GetEmulatorName = 1,
Cmd_IsRootDevice = 2,
Cmd_DeviceID = 3,
Cmd_GetHTPVersion = 7,
Cmd_GetEncHTPVersion = 9
};
返回值:
错误返回 unsupported request (不支持的命令),正确返回对应命令的结果
模拟器检测:
向反外挂模块查询模拟器信息。无附加数据,返回值模拟器名称
示例:
string name = HTProtect.htpIoctl(context,RequestCmdID.Cmd_GetEmulatorName, "");
返回值:
对应查询的模拟器信息。若为模拟器则返回模拟器名称,示例emulator:Nox
,若为未知模拟器,则返回emulator:Unknown
。若为真机,则返回emulator:None
root检测:
向反外挂模块查询设备是否root。
示例:
string name = HTProtect.htpIoctl(context,RequestCmdID.Cmd_IsRootDevice, "");
返回值:
若为root设备,返回值为root:1
,若不是root设备,返回值为root:0
。
反外挂版本号获取:
向反外挂模块查询当前使用的智能反外挂版本号,掌握每个玩家的反外挂版本号。
示例:
string version = HTProtect.htpIoctl(context,RequestCmdID.Cmd_GetHTPVersion, "");
返回值:
版本号一定不为空,返回值举例:"4.15.114"。
若要获取加密后的版本号,可以传入参数“Cmd_GetEncHTPVersion”
示例:
string version = HTProtect.htpIoctl(context,RequestCmdID.Cmd_GetEncHTPVersion, "");
返回值:
版本号一定不为空,返回值举例:"iF13uXaKVteXVA==||58807f98da0d945b5d60ba4e8f22a428"。
返回值需要使用易盾提供的服务端解密sdk进行解密。
存档加解密
存档数据存在被篡改的风险,易盾智能反外挂SDK提供的加解密接口,提高本地数据的安全性,支持 string 和 byte[] 数组。
函数原型:
加密对象为String:
string EncodeLocal(Context context,string inputData);
string DecodeLocal(Context context,string inputData);
加密对象为byte[]:
string EncodeLocalByte (Context context,byte[]inputData);
byte[] DecodeLocalByte (Context context,string inputData);
返回值:
返回的数据即为原始数据的密文,开发者需要自行对加密后的数据进行本地存储
模拟点击行为检测
批量的模拟点击极大的影响到游戏的正常,特别是工作室的参与,不仅影响到游戏的平台,还影响到游戏方的收入。易盾智能反外挂SDK提供相关的行为检测方案,使用模拟点击行为检测接口时,需要在游戏登录后,并且调用用户登录接口,设置role_id等信息后调用。
接口接入须知:
非强烈需要挖掘模拟点击类外挂的游戏,不需要接入
函数原型:
public static void ImpIoctl()
示例:
HTProtect.ImpIoctl();
心跳系统
随着安全对抗的日益激烈,网易易盾不断提升反外挂服务的自身安全强度,保障反外挂服务的安全,但也可能存在易盾反外挂服务被中止或者被剥离的风险。为避免反外挂服务被恶意破坏,易盾提供“心跳系统”,定时向游戏方反馈心跳信息,告知游戏方当前反外挂运行状态,既方便游戏方实时掌握反外挂运行状态,也能保障易盾反外挂服务的正常运行。
接口接入须知:
- registInfoReceiver接口需要在init之后方可调用
- SDK会启动线程来调用onReceive函数**,**请注意多线程问题
函数原型:
public static void registInfoReceiver(InfoReceiver receiver);
参数说明:
参数 | 类型 | 说明 |
---|---|---|
receiver | InfoReceiver | 回调函数,接收心跳信息 |
InfoReceiver的接口定义:
public interface InfoReceiver{
void onReceive(int Type, string Info);
}
onReceive 参数说明:
参数 | 类型 | 说明 |
---|---|---|
Type | int | 接收数据的类型 |
Info | string | 接收的具体数据 |
目前支持的type类型有:
值 | 定义 | 说明 |
---|---|---|
1 | NetHeartBeat.INFO_TYPE_HEARTBEAT | 心跳数据,可直接在客户端解析 |
2 | NetHeartBeat.INFO_TYPE_ENC_HEARTBEAT | 加密后的心跳数据,必须发往服务端进行解密 |
示例:
- 实现接口
private class MyInfoReceiver implements NetHeartBeat.InfoReceiver {
public void onReceive(int type, String info) {
if (type == NetHeartBeat.INFO_TYPE_HEARTBEAT) {
Log.e(TAG,"info is:" + info);
//(获取到info进行相关操作)
}
if (type == NetHeartBeat.INFO_TYPE_ENC_HEARTBEAT) {
Log.e(TAG,"info is:" + info);
//(获取到的info,为加密状态,需发往服务端进行解密)
}
}
}
注:两种type类型均可接收,也可只接收其中一种,建议只获取加密后的心跳数据,然后发往服务端进行解析。
- 注册接口
MyInfoReceiver mInfoReceiver = new MyInfoReceiver();
HTProtect.registInfoReceiver(mInfoReceiver);
心跳系统是每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,说明网络异常
数据校验
游戏协议如被破解,若为单机游戏,可直接影响到存档文件的安全性;若为帧同步游戏,则可通过破解协议修改战斗数据;其他类型游戏亦可被做成脱机协议,用于攻击或脱机外挂。为保障游戏协议安全,易盾提供”数据校验“方案,采用自研通讯协议校验算法。
接口接入须知:
客户端接入数据校验接口后,服务端对对应的数据进行校验,服务端数据校验相关文档请联系易盾获取。
函数原型:
public static String getDataSign(Context context,String inputData,int algIndex);
参数说明:
参数 | 类型 | 说明 |
---|---|---|
context | Context | 当前环境的上下文 |
inputData | String | 待校验的数据 |
algIndex | int | 表示算法标识,需要联系易盾人员 |
返回值:
返回的数据即为校验结果,开发者需要将原始数据与校验结果发送到游戏服务端,由游戏服务端校验。