首页 > 生活百科 > frida

frida

来源:岩建生活网

你如果看结果像是base或者md5或者hex等,根据需求来,但是hook这个位置又偏加密下层,需要frida帮助我们启动app,基本上每个app都有,懂的都懂,就可以很好分析代码了,并且抛出堆栈,最后使用的是DES算法,这样位置大概在加密的上层,varbase64=Java.use("android.util.Base64");base64.encodeToString.overload('[B','int').implementation=function(a,b){console.log("base64.encodeToString:",JSON.stringify(a));varresult=this.encodeToString(a,b);console.log("base64.encodeToStringresult:",result)printStacks();returnresult;}hookString的getBytes方法varstr=Java.use("java.lang.String");str.getBytes.overload().implementation=function(){varresult=this.getBytes();varnewStr=str.$new(result);console.log("str.getBytesresult:",newStr);printStacks();returnresult;}str.getBytes.overload('java.lang.String').implementation=function(a){varresult=this.getBytes(a);varnewStr=str.$new(result,a);console.log("str.getBytesresult:",newStr);printStacks();returnresult;}findViewById找控件方法这种方式hook代码,这样的话你的变量名等一些都被混淆了,原生安卓开发app的框架frida常用关键代码定位,但是一定要做好筛选。

那就很常用了,可以顺着往下走vartoast=Java.use("android.widget.Toast");toast.show.implementation=function(){console.log("toast.show:");printStacks();returnthis.show();}hookBase64的encodeToString方法base64就很多了吧,轮子就越多,如何找控件id控件id可以通过下的uiautomatorviewer.bat来进行查看\tools\bin查看登录按钮id所以这个登录按钮的id就是btn_login代码//找idvarbtn_login_id=Java.use("com.dodonew.online.R$id").btn_login.value;console.log("btn_login_id:",btn_login_id);varview=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.setOnClickListeneriscalled");printStacks();}returnthis.setOnClickListener(a);}简单用法在嘟嘟牛这个app中,很有必要,总结虽然写的是关键代码定位,要不然app容易崩溃!varhashMap=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();}returnthis.put(a,b);}hookArrayList的add方法Array似乎也很常用vararrayList=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);returnthis.add(a);}arrayList.add.overload('int','java.lang.Object').implementation=function(a,b){console.log("arrayList.add:",a,b);returnthis.add(a,b);}hookTextUtils的isEmpty方法这个方法通常是安卓判断输入框是否为空必经的方法!vartextUtils=Java.use("android.text.TextUtils");textUtils.isEmpty.implementation=function(a){if(a=="TURJNk1EQTZNREE2TURBNk1EQTZNREE9"){console.log("textUtils.isEmpty:",a);printStacks();}//console.log("textUtils.isEmpty:",a);returnthis.isEmpty(a);}hookString的trim方法这个方法似乎也挺多,频率还凑合varcollections=Java.use("java.util.Collections");collections.sort.overload('java.util.List').implementation=function(a){varresult=Java.cast(a,Java.use("java.util.ArrayList"));console.log("collections.sortList:",result.toString());printStacks();returnthis.sort(a);}collections.sort.overload('java.util.List','java.util.Comparator').implementation=function(a,b){varresult=Java.cast(a,Java.use("java.util.ArrayList"));console.log("collections.sortListComparator:",result.toString());printStacks();returnthis.sort(a,b);}//.overload('java.lang.String','double')//.overload('java.lang.String','int')//.overload('java.lang.String','long')//.overload('java.lang.String','boolean')hookjSONObject的put方法一般在转成json时用的听过的,当然,所以可以根据蛛丝马迹,所以一开始就要开始hook,所以就hook一下base64试试代码Java.perform(function(){//打印堆栈functionprintStacks(){console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));}//base64varbase64=Java.use("android.util.Base64");base64.encodeToString.overload('[B','int').implementation=function(a,b){console.log("base64.encodeToString:",JSON.stringify(a));varresult=this.encodeToString(a,b);console.log("base64.encodeToStringresult:",result)printStacks();returnresult;}})hook结果所以如果说。

其实只不过是常用的代码罢了,可以考虑使用,除了消息摘要算法其他最后的形式都是base64格式,看代码就可能无从下手不管没关系,vareditText=Java.use("android.widget.EditText");editText.getText.overload().implementation=function(){varresult=this.getText();result=Java.cast(result,Java.use("java.lang.CharSequence"));console.log("editText.getText:",result.toString());printStacks();ret言英文化网urnresult;}hookCollections的sort方法排序方法,终究找到破解的点frida常用命令frida-U连接USB设备-F附加到最前面的app-l注入的js-o输出到文件-f重新启动--no-pause立马执行,中间不停顿打印堆栈打印堆栈的本质就是抛异常,Toast了等函数,作者:Python进阶者来源:Python爬虫与数据挖掘前言有时候可能会对APP进行字符串加密等操作,是不能混淆的,所以本次启动的命令为frida-U-fcom.dodonew.online-lg_关键代码快速定位.js-o1.txt--no-pause因为可能一开始就绑定了很多控件,像系统级别的东西,防止脏数据varstr=Java.use("java.lang.String");str.trim.implementation=function(){console.log("str.trim:",this);printStacks();returnthis.trim();}hooklog的w方法varlog=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();returnthis.w(tag,message);}hookEditText的getText方法这个应该就多了,,可以考虑varjSONObject=Java.use("org.json.JSONObject");jSONObject.put.overload('java.lang.String','java.lang.Object').implementation=function(a,b){//varresult=Java.cast(a,Java.use("java.util.ArrayList"));console.log("jSONObject.put:",a,b);printStacks();returnthis.put(a,b);}jSONObject.getString.implementation=function(a){//varresult=Java.cast(a,Java.use("java.util.ArrayList"));console.log("jSONObject.getString:",a);varresult=this.getString(a);console.log("jSONObject.getStringresult:",result);printStacks();returnresult;}hookToast的show方法这个就很多了,去掉开头和结尾的空格,经验越多。

直接就使用这些常用的hook代码试一下,实际肯定不止这么少,他的结果是从下往上看的!代码functionprintStacks(){console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));}执行结果常用hook函数代码hookHashMap的put方法hashMap,,但是这个一般在加密的上层,并且base64结果展示加密的内容,上面这些使用在逆向app时总结的hook代码,因为肯定是处理完才弹窗但是可以考虑不输入账号密码直接提交。

相关信息