原生安卓开发app的框架frida常用关键代码定位
点击上方“Python爬虫与数据挖掘”,进行关注
回复“书籍”即可获赠Python从入门到进阶共10本电子书
今
日
鸡
汤
多情却似总无情,唯觉樽前笑不成。
大家好,我是码农星期八!本教程只用于学习探讨,不允许任何人使用技术进行违法操作,阅读教程即表示同意!
前言
有时候可能会对APP进行字符串加密等操作,这样的话你的变量名等一些都被混淆了,看代码就可能无从下手
不管没关系,像系统级别的东西,Toast
了等函数,是不能混淆的,所以可以根据蛛丝马迹,终究找到破解的点
frida常用命令
frida-U 连接USB设备-F 附加到最前面的app-l 注入的js-o 输出到文件-f 重新启动--no-pause 立马执行,中间不停顿
打印堆栈
打印堆栈的本质就是抛异常,他的结果是从下往上看的!
代码
function printStacks() {console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));
}
执行结果
常用hook函数代码
hook HashMap的put方法
hashMap,,那就很常用了,懂的都懂,但是一定要做好筛选,要不然app容易崩溃!
var hashMap = Java.use("java.util.HashMap");
hashMap.put.implementation = function (a, b) {//a=="username"和a.equals("username")一般都可以//如果不行换一下即可if (a=="username") {console.log("hashMap.put: ", a, b);printStacks();}return this.put(a, b);
}
hook ArrayList的add方法
Array似乎也很常用
var arrayList = Java.use("java.util.ArrayList");
arrayList.add.overload('java.lang.Object').implementation = function (a) {if (a == "username=18903916120") {console.log("arrayList.add: ", a);printStacks(); }//console.log("arrayList.add: ", a);return this.add(a);
}
arrayList.add.overload('int', 'java.lang.Object').implementation = function (a, b) {console.log("arrayList.add: ", a, b);return this.add(a, b);
}
hook TextUtils的isEmpty方法
这个方法通常是安卓判断输入框是否为空必经的方法!
var textUtils = Java.use("android.text.TextUtils");
textUtils.isEmpty.implementation = function (a) {if (a == "TURJNk1EQTZNREE2TURBNk1EQTZNREE9") {console.log("textUtils.isEmpty: ", a);printStacks();}//console.log("textUtils.isEmpty: ", a);return this.isEmpty(a);
}
hook String的trim方法
这个方法似乎也挺多,去掉开头和结尾的空格,防止脏数据
var str = Java.use("java.lang.String");
str.trim.implementation = function () {console.log("str.trim: ", this);printStacks();return this.trim();
}
hook log的w方法
var log = Java.use("android.util.Log");log.w.overload('java.lang.String', 'java.lang.String').implementation = function (tag, message) {console.log("log.w: ", tag, message);printStacks();return this.w(tag, message);}
hook EditText的getText方法
这个应该就多了,但是这个一般在加密的上层,可以考虑使用。
var editText = Java.use("android.widget.EditText");
editText.getText.overload().implementation = function () {var result = this.getText();result = Java.cast(result, Java.use("java.lang.CharSequence"));console.log("editText.getText: ", result.toString());printStacks();return result;
}
hook Collections的sort方法
排序方法,频率还凑合
var collections = Java.use("java.util.Collections");
collections.sort.overload('java.util.List').implementation = function (a) {var result = Java.cast(a, Java.use("java.util.ArrayList"));console.log("collections.sort List: ", result.toString());printStacks();return this.sort(a);
}
collections.sort.overload('java.util.List', 'java.util.Comparator').implementation = function (a, b) {var result = Java.cast(a, Java.use("java.util.ArrayList"));console.log("collections.sort List Comparator: ", result.toString());printStacks();return this.sort(a, b);
}
// .overload('java.lang.String', 'double')
// .overload('java.lang.String', 'int')
// .overload('java.lang.String', 'long')
// .overload('java.lang.String', 'boolean')
hook jSONObject的put方法
一般在转成json时用的听过的,可以考虑
var jSONObject = Java.use("org.json.JSONObject");
jSONObject.put.overload('java.lang.String', 'java.lang.Object').implementation = function (a, b) {//var result = Java.cast(a, Java.use("java.util.ArrayList"));console.log("jSONObject.put: ", a, b);printStacks();return this.put(a, b);
}
jSONObject.getString.implementation = function (a) {//var result = Java.cast(a, Java.use("java.util.ArrayList"));console.log("jSONObject.getString: ", a);var result = this.getString(a);console.log("jSONObject.getString result: ", result);printStacks();return result;
}
hook Toast的show方法
这个就很多了,基本上每个app都有,但是hook这个位置又偏加密下层,因为肯定是处理完才弹窗
但是可以考虑不输入账号密码直接提交,这样位置大概在加密的上层,可以顺着往下走
var toast = Java.use("android.widget.Toast");
toast.show.implementation = function () {console.log("toast.show: ");printStacks();return this.show();
}
hook Base64的encodeToString方法
base64就很多了吧,除了消息摘要算法其他最后的形式都是base64格式,很有必要。
var base64 = Java.use("android.util.Base64");
base64.encodeToString.overload('[B', 'int').implementation = function (a, b) {console.log("base64.encodeToString: ", JSON.stringify(a));var result = this.encodeToString(a, b);console.log("base64.encodeToString result: ", result)printStacks();return result;
}
hook String的getBytes方法
var str = Java.use("java.lang.String");
str.getBytes.overload().implementation = function () {var result = this.getBytes();var newStr = str.$new(result);console.log("str.getBytes result: ", newStr);printStacks();return result;
}
str.getBytes.overload('java.lang.String').implementation = function (a) {var result = this.getBytes(a);var newStr = str.$new(result, a);console.log("str.getBytes result: ", newStr);printStacks();return result;
}
findViewById找控件方法
这种方式hook代码,需要frida帮助我们启动app。
所以本次启动的命令为
frida -U -f com.dodonew.online -l g_关键代码快速定位.js -o 1.txt --no-pause
因为可能一开始就绑定了很多控件,所以一开始就要开始hook。
如何找控件id
控件id可以通过<SDK目录>\tools\bin
下的uiautomatorviewer.bat
来进行查看
查看登录按钮id
所以这个登录按钮的id就是btn_login
代码
// 找id
var btn_login_id = Java.use("com.dodonew.online.R$id").btn_login.value;
console.log("btn_login_id:", btn_login_id);var view = Java.use("android.view.View");
view.setOnClickListener.implementation = function (a) {if(this.getId() == btn_login_id){console.log("view.id: " + this.getId());console.log("view.setOnClickListener is called");printStacks();}return this.setOnClickListener(a);
}
简单用法
在嘟嘟牛这个app中,最后使用的是DES算法,并且base64结果展示加密的内容。
所以就hook一下base64试试
代码
Java.perform(function () {//打印堆栈function printStacks() {console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));}//base64var base64 = Java.use("android.util.Base64");base64.encodeToString.overload('[B', 'int').implementation = function (a, b) {console.log("base64.encodeToString: ", JSON.stringify(a));var result = this.encodeToString(a, b);console.log("base64.encodeToString result: ", result)printStacks();return result;}
})
hook结果
所以如果说,你如果看结果像是base或者md5或者hex等,直接就使用这些常用的hook代码试一下,并且抛出堆栈。
就可以很好分析代码了。
总结
虽然写的是关键代码定位,其实只不过是常用的代码罢了,上面这些使用在逆向app时总结的hook代码。
当然,实际肯定不止这么少,根据需求来,经验越多,轮子就越多。
人生没有白走的路,加油!
如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。
越努力,越幸运。我是码农星期八,如果觉得还不错,记得动手点赞一下哈。感谢你的观看。
小伙伴们,快快用实践一下吧!如果在学习过程中,有遇到任何问题,欢迎加我好友,我拉你进Python学习交流群共同探讨学习。
------------------- End -------------------
往期精彩文章推荐:
requests库请求获取不到数据怎么办?不妨试试看这种妙法
Python网络爬虫之js逆向之远程调用(rpc)免去抠代码补环境简介
盘点一款自研的Python虚拟环境管理器——带GUI界面的那种
盘点一道Python网络爬虫中使用正则表达式匹配字符的题目
欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持
想加入Python学习群请在后台回复【入群】
万水千山总是情,点个【在看】行不行
/今日留言主题/
随便说一两句吧~~
原生安卓开发app的框架frida常用关键代码定位相关推荐
- 手把手教你使用更多的原生安卓开发app的框架frida API
点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 蜡烛有心还惜别,替人垂泪到天明. ...
- uniapp 原生安卓开发插件(module),以及android环境本地调试(一)
uniapp 原生安卓开发插件(module),以及android环境本地调试 1.开发前景 由于uniapp 框架的局限先,有很多功能不能如原生android开发使用顺畅,因此,需要使用插件进行辅助 ...
- ui uview 安卓开发_uni-app UI框架之uview-ui使用教程
image uviewUI 多平台快速开发的UI框架 uni-app2018年初发布以来,一直蓬勃发展,一派欣欣向荣,社区也是人声鼎沸,众望所归. 因此,uView应运而生,uView的目标是成为un ...
- 安卓开发app版本更新
安卓开发实战之app之版本更新升级(DownloadManager和http下载)完整实现 转载 wx610a246613cb02021-08-05 17:02:56博主文章分类:14 其他随笔©著作 ...
- 一个快速开发APP的框架:AndroidQuick
公众号[国民程序员]回馈粉丝福利: 现金红包和送书活动火热进行中,点击参与! 我的新书<Android App开发入门与实战>已于2020年8月由人民邮电出版社出版,欢迎购买. 书籍详情请 ...
- 简单Android app开发_什么方法开发APP最简单?试试0代码开发平台
开发APP有哪些方式? 说到开发APP,那肯定是找外包公司最方便,只用花钱就能坐等APP完成.但是,现在需要开发APP的公司范围越来越广,传统外包公司高昂的费用显然已经不能普罗大众,那么,有没有简单便 ...
- uni-app混合原生安卓开发
uni-app和原生App混合开发问题 首先务必确认uni-app和原生代码,谁是主谁是从的问题. 1.如果你的应用是uni-app开发的,需要扩展一些原生能力,那么首先去插件市场看看有没有现成的插件 ...
- 嵌入式Android底层开发(一)——安卓开发的整体框架与简述
一.Android简介 Android是一种基于Linux内核(不包含GUN组件)的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发 ...
- 安卓开发视频处理框架!2021年这些高频面试知识点最后再发一次,全网疯传
前言 准备面试其实已经准备了挺久了,当时打算面试准备了差不多以后,跟公司谈谈涨薪的事情,谈不拢的话,就年后直接找其他的公司.谁想到婚假还没休完,老板就在公司宣布了撤出上海的决定,愿意去深圳的就去,不愿 ...
最新文章
- ReactNative ViewPageAndroid组件详解
- 防静电塑料包装袋周围的静电场
- mysql如果存在则删除数据库_怎么判断sql数据库是否存在,存在删除
- 脸书员工都在VR上工作了,你还等什么?
- 不断前行的SD-WAN如何使现代企业受益—Vecloud微云
- python的表达式3or5_Python 简明教程 --- 5,Python 表达式与运算符
- springcloud alibaba + seata 1.3.0 集成文档
- import _winreg:用python操作修改windows注册表
- asp.net2.0中通过CS代码来动态的指定aspx页面中head中的信息
- 如何在用户登录时SAP时自动执行Tcode或者其他一些东西
- Substring Removal
- 知乎容器化构建系统设计和实践
- python基础编码规范_Python语言的基本语法和编码规范.doc
- 你必须要知道的架构知识~第二章 代码是否面向对象,要看你的继承怎么用
- 自定义控件之绘图篇(一):概述及基本几何图形绘制
- 字符串与整数、浮点数、无符号整数之间的转换常用函数
- webpack入门总结1
- linux脚本while死循环,shell编程之while死循环
- 第一章 FreeSWITCH 的架构
- 神经网络算法有哪几种,神经网络有哪几种算法
热门文章
- 大数据中的用户画像——让机器懂用户
- 进||||||||||||_|
- php六脉神剑,练到极致的六脉神剑究竟有多强?强到离谱,金庸都只能让它失传!...
- python区块_python区块及区块链的开发详解
- html input标签清除历史输入记录下拉框
- 怎样选择一家靠谱的IT培训机构?
- 从你进公司的那一刻开始你要咋做
- Maxthon傲视群雄正式版试用手记(转)
- 本周大新闻|FCC曝光Pico 4 VR一体机,雷朋母公司建立智能眼镜实验室
- Nature Aging | 激活FOXM1基因人类寿命或翻倍