点击上方“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常用关键代码定位相关推荐

  1. 手把手教你使用更多的原生安卓开发app的框架frida API

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 蜡烛有心还惜别,替人垂泪到天明. ...

  2. uniapp 原生安卓开发插件(module),以及android环境本地调试(一)

    uniapp 原生安卓开发插件(module),以及android环境本地调试 1.开发前景 由于uniapp 框架的局限先,有很多功能不能如原生android开发使用顺畅,因此,需要使用插件进行辅助 ...

  3. ui uview 安卓开发_uni-app UI框架之uview-ui使用教程

    image uviewUI 多平台快速开发的UI框架 uni-app2018年初发布以来,一直蓬勃发展,一派欣欣向荣,社区也是人声鼎沸,众望所归. 因此,uView应运而生,uView的目标是成为un ...

  4. 安卓开发app版本更新

    安卓开发实战之app之版本更新升级(DownloadManager和http下载)完整实现 转载 wx610a246613cb02021-08-05 17:02:56博主文章分类:14 其他随笔©著作 ...

  5. 一个快速开发APP的框架:AndroidQuick

    公众号[国民程序员]回馈粉丝福利: 现金红包和送书活动火热进行中,点击参与! 我的新书<Android App开发入门与实战>已于2020年8月由人民邮电出版社出版,欢迎购买. 书籍详情请 ...

  6. 简单Android app开发_什么方法开发APP最简单?试试0代码开发平台

    开发APP有哪些方式? 说到开发APP,那肯定是找外包公司最方便,只用花钱就能坐等APP完成.但是,现在需要开发APP的公司范围越来越广,传统外包公司高昂的费用显然已经不能普罗大众,那么,有没有简单便 ...

  7. uni-app混合原生安卓开发

    uni-app和原生App混合开发问题 首先务必确认uni-app和原生代码,谁是主谁是从的问题. 1.如果你的应用是uni-app开发的,需要扩展一些原生能力,那么首先去插件市场看看有没有现成的插件 ...

  8. 嵌入式Android底层开发(一)——安卓开发的整体框架与简述

    一.Android简介 Android是一种基于Linux内核(不包含GUN组件)的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发 ...

  9. 安卓开发视频处理框架!2021年这些高频面试知识点最后再发一次,全网疯传

    前言 准备面试其实已经准备了挺久了,当时打算面试准备了差不多以后,跟公司谈谈涨薪的事情,谈不拢的话,就年后直接找其他的公司.谁想到婚假还没休完,老板就在公司宣布了撤出上海的决定,愿意去深圳的就去,不愿 ...

最新文章

  1. ReactNative ViewPageAndroid组件详解
  2. 防静电塑料包装袋周围的静电场
  3. mysql如果存在则删除数据库_怎么判断sql数据库是否存在,存在删除
  4. 脸书员工都在VR上工作了,你还等什么?
  5. 不断前行的SD-WAN如何使现代企业受益—Vecloud微云
  6. python的表达式3or5_Python 简明教程 --- 5,Python 表达式与运算符
  7. springcloud alibaba + seata 1.3.0 集成文档
  8. import _winreg:用python操作修改windows注册表
  9. asp.net2.0中通过CS代码来动态的指定aspx页面中head中的信息
  10. 如何在用户登录时SAP时自动执行Tcode或者其他一些东西
  11. Substring Removal
  12. 知乎容器化构建系统设计和实践
  13. python基础编码规范_Python语言的基本语法和编码规范.doc
  14. 你必须要知道的架构知识~第二章 代码是否面向对象,要看你的继承怎么用
  15. 自定义控件之绘图篇(一):概述及基本几何图形绘制
  16. 字符串与整数、浮点数、无符号整数之间的转换常用函数
  17. webpack入门总结1
  18. linux脚本while死循环,shell编程之while死循环
  19. 第一章 FreeSWITCH 的架构
  20. 神经网络算法有哪几种,神经网络有哪几种算法

热门文章

  1. 大数据中的用户画像——让机器懂用户
  2. 进||||||||||||_|
  3. php六脉神剑,练到极致的六脉神剑究竟有多强?强到离谱,金庸都只能让它失传!...
  4. python区块_python区块及区块链的开发详解
  5. html input标签清除历史输入记录下拉框
  6. 怎样选择一家靠谱的IT培训机构?
  7. 从你进公司的那一刻开始你要咋做
  8. Maxthon傲视群雄正式版试用手记(转)
  9. 本周大新闻|FCC曝光Pico 4 VR一体机,雷朋母公司建立智能眼镜实验室
  10. Nature Aging | 激活FOXM1基因人类寿命或翻倍