🌟 ❤️
作者:yueji0j1anke
首发于公号:剑客古月的安全屋
字数:1562
阅读时间: 5min
声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。合法渗透,本文章内容纯属虚构,如遇巧合,纯属意外
目录
-
前言
-
OCR
-
adb
-
Frida
-
总结
0x01 前言
最近小x搜题挺火,网上各种方法漫天飞,于是笔者进行了搜集复现,觉得蛮有意思,于是写下了这篇文章
0x02 方法1: OCR自动识别
严格意义上来说,这不算黑客形式的做题方式,不过最近也在搞图像识别的一些模型,就顺带用用封装好的模型库,扩展一下知识面(咳咳)
OCR是将光学图像转换为机器可读文本的过程,在这个过程中需要截取图片、预处理、文字区域定位、字符分割、特征识别和提取
在脚本中,比较难实现的部分为数据预处理部分,以及如何去获取到相关图像。
在相关设想中,预计采用截图配合OCR识别图像,并输入相关大小处理函数进行绘画
这里先测试对应的识别区域,测试如下
import cv2
import numpy as np
import pyautogui
# 获取屏幕截图
image = pyautogui.screenshot()
image = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR)
# 提取需要识别的区域,调整 Y 轴范围
roi = image[350:470, 700:1200] # 更新 ROI 的 Y 轴范围,从 850 到 970
# 在原图上绘制 ROI,矩形的 Y 坐标也需要更新
cv2.rectangle(image, (700, 350), (1200, 470), (0, 255, 0), 2) # 绘制绿色矩形
# 显示原图和 ROI
cv2.imshow("Original Image", image)
cv2.imshow("Region of Interest", roi)
cv2.waitKey(0) # 等待按键
cv2.destroyAllWindows() # 关闭所有窗口
关键图像预处理
roi_gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
roi_contrast = cv2.convertScaleAbs(roi_gray, alpha=2.0, beta=0) # 增强对比度
roi_blur = cv2.GaussianBlur(roi_contrast, (5, 5), 0)
_, roi_thresh = cv2.threshold(roi_blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
但这个方法太慢了,玩了20多把就被对面k爆了,怎么能是黑客所为呢
0x03 方法2: adb配合自动识别
这个方法是顺带探索一下adb模拟安卓手势实现,引出后面的Frida。此方法理论上提速不了太多
大概逻辑是 在安卓截图传过来web端通过裁剪识别图片,比较大小,最后用adb直接滑屏
这个代码量就少了许多
核心代码如下
for i, crop_area in enumerate(crop_areas, start=1):
cropped_image = process_image(screenshot_path, crop_area)
cropped_image_path = f"screenshot{i}.png"
cropped_image.save(cropped_image_path)
cropped_images.append(cropped_image_path)
0x04 方法3: Frida
身为深耕网络安全的从事者们怎么会轻易放弃更容易的方式呢!
让我们来尝试安卓逆向吧!
先尝试找到路由,这里用的webview去找到对应网页
但相关路径在逆向文件中找不到关键词,于是抓包看路由
打开我们的模拟器,转出dex文件反编译
搜索关键路由,追踪对应堆栈
用模拟器配合jadx逆向了一下,找了半天找到了加密函数
为native层的c方法,那我们直接找其java层引用
Frida直接hook加密函数拦截,修改参数即可,比如将试题统一修改为一份答案,随后进行提交即可
那现在的关键就是需要找到解密后的参数
我最初的想法是找到参数后修改加密进行提交即可,但有个老哥直接修改了时间参数进行提交,实现了0s提交,这里我将改良过后的代码放于此处
script = '''
function Hookr2B(){
var r2 = Java.use("com.fenbi.android.leo.utils.r2");
Java.perform(function(){
r2.b.overload("[B").implementation = function (data) {
console.log("_____begin_____");
var String= Java.use("java.lang.String");
var data_ori = data;
data = Bytes2HexString(data);
send(data);
var new_data;
var new_data_2;
var instance;
recv(function (received_json_object) {
new_data = received_json_object.my_data
instance = String.$new(new_data);
new_data_2 = instance.getBytes()
}).wait();
var result = this["b"](new_data_2);
console.log('参数劫持完成,即将Return')
return result;
};
});
}
function Bytes2HexString(arrBytes) {
var str = "";
for (var i = 0; i < arrBytes.length; i++) {
var tmp;
var num = arrBytes[i];
if (num < 0) {
tmp = (255 + num + 1).toString(16);
} else {
tmp = num.toString(16);
}
if (tmp.length == 1) {
tmp = "0" + tmp;
}
str += tmp;
}
return str;
}
setImmediate(Hookr2B);
这里就不放视频了,截止到目前为止该方法已失效,在笔者落笔该文章前,抓包修改也已彻底失效。
0x05 总结
从OCR到最后的Frida,大概忙里偷闲用了三天总结吧。不得不说小x逆出来的dex文件是真的多。
代码地址放于此处
https://github.com/jiankeguyue/Quikely-Xiaoyuan
原文始发于微信公众号(剑客古月的安全屋):app攻防-如何x挂小y搜题
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论