Android远程管理工具Socket.io服务端代码:参数d与数据流向疑问
基于Socket.io的Android远程管理服务端请求响应流程解析
整体流程概述
这套代码是管理员与受控Android设备之间的消息中转服务端:
- 管理员发起指令请求,服务端转发给指定受控设备
- 受控设备执行指令后,将结果回传给服务端,服务端再转发给管理员
request函数详解(管理员→服务端→受控端)
const request =(d)=>{// request from attacker to victim let { to, action, data } = JSON.parse(d); log("Requesting action: "+ action); io.to(victimList[to]).emit(action, data); }
- 参数
d:是管理员通过Socket连接发送给服务端的JSON格式字符串,本质是管理员的指令请求包,包含了指令的所有必要信息。 - JSON.parse(d)的作用:把字符串格式的请求包解析成JavaScript对象,从中解构出三个核心字段:
to:受控设备在服务端victimList列表中的标识,服务端通过这个值找到对应的受控设备Socket连接action:要让受控设备执行的操作类型(比如getDeviceInfo获取设备信息、takeScreenshot截图等)data:执行该操作需要的附加参数(比如操作文件时的路径、执行命令时的指令内容等)
- 最后服务端通过
io.to(victimList[to]).emit(action, data),把指令(action)和参数(data)转发给目标受控设备。
response/responseBinary函数详解(受控端→服务端→管理员)
这两个函数是受控设备执行完指令后,向管理员返回结果的中转逻辑:
普通响应函数response
const response =(action, data)=>{// response from victim to attacker if(adminSocketId){ log("response action: "+ action); io.to(adminSocketId).emit(action, data); } }
二进制响应函数responseBinary
const responseBinary =(action, data, callback)=>{// response from victim to attacker if(adminSocketId){ log("response action: "+ action); callback("success") io.to(adminSocketId).emit(action, data); } }
action:和请求时的action一一对应,用于让管理员识别这是哪个指令的响应结果(比如请求是takeScreenshot,响应的action也为takeScreenshot,方便管理员匹配处理)data:受控设备执行指令后的返回结果:response中的data是常规文本/JSON数据(比如设备信息的JSON串、命令执行的文本输出)responseBinary中的data是二进制数据(比如截图的二进制流、文件的二进制内容)
callback(仅responseBinary):受控设备发送二进制数据后,服务端通过这个回调告知受控设备“响应已接收,将转发给管理员”,避免受控端重复发送。
内容的提问来源于stack exchange,提问作者Ruben
相关产品推荐
相关产品推荐

