偶然从看雪看到了一篇入门frida的题目,正好苦于没练手的东西,直接上手一波

1.第一题jadx打开,也没有壳和混淆,整体非常清晰,判断的逻辑也很简单

发现其实就是两个输入框,一个用户名一个密码,先拼接起来然后传入VVVVV.VVVV()方法中去校验,跟进去看一手

其实代码逻辑还是挺清晰的,手逆也不难,但是这里主要还是用hook来做,这里破解是非常容易的,直接hook VVVV()方法的返回值直接返回为true

,这样不管输入什么都只会通过,但是这边的话,我们还是选择要得到flag,所以选择在frida中进行爆破,求解,因为在方法中也可以调用原方法,而且

字符串的位数只有5位,爆破还是挺容易的,不过要注意的地方就是js的字符串和java的不太一样,所以我们需要通过hook java.lang.String类,然后

去实现java的字符串对象,进而调用原方法

  1. function main()
  2. {
  3. Java.perform(function(){
  4. var string_class=Java.use("java.lang.String");
  5. Java.use("com.kanxue.pediy1.VVVVV").VVVV.implementation=function(t,y)
  6. {
  7. for(var i=0;i<=9;i++)
  8. {
  9. for(var j=0;j<=9;j++)
  10. {
  11. for(var k=0;k<=9;k++)
  12. {
  13. for(var w=0;w<=9;w++){
  14. for(var x=0;x<=9;x++)
  15. {
  16. var res=string_class.$new(i.toString()+j.toString()+k.toString()+w.toString()+x.toString());
  17. if(this.VVVV(t,res))
  18. {
  19. console.log("right answer:",res);
  20. return true;
  21. }else
  22. {
  23. console.log("wrong answer:",res);
  24. }
  25. }
  26. }
  27. }
  28. }
  29. }
  30.  
  31. }
  32. })
  33. }
  34. setImmediate(main);

frida -U --no-pause -f 包名 -l 注入的js。启动就等着结果出来就好了

第二题走起:

第二题有点热修复的意思,就是调用文件夹中dex中类的方法,

其实就是自定义了个classloader,只要hook就完事了,然后和第一题校验逻辑是一样的,爆破就好了

  1. function main()
  2. {
  3. Java.perform(function(){
  4. console.log("YenKoc");
  5. Java.enumerateClassLoaders({
  6. onMatch:function(loader){
  7. try{
  8. if(loader.findClass("com.kanxue.pediy1.VVVVV"))
  9. //if(loader.toString().indexOf('dalvik.system.DexClassLoader')>-1)
  10. {
  11. console.log("find right classloader");
  12. console.log(loader);
  13. Java.classFactory.loader=loader;
  14. hookVVVV();
  15. return;
  16. }
  17. }catch(error)
  18. {
  19. console.log("find error"+error);
  20. }
  21. },
  22. onComplete:function(){
  23. console.log("end1");
  24. }
  25. })
  26.  
  27. })
  28. }
  29. function hookVVVV(){
  30. Java.perform(function(){
  31. console.log('loader',Java.classFactory.loader);
  32.  
  33. for (var i = 0; i <= 9; i++) {
  34.  
  35. for (var j = 0; j <= 9; j++) {
  36. for (var k = 0; k <= 9; k++) {
  37. for (var t = 0; t <= 9; t++) {
  38. for (var y = 0; y <= 9; y++) {
  39. var newInput = Java.use('java.lang.String').$new(i.toString()
  40. + j.toString()
  41. + k.toString()
  42. + t.toString()
  43. + y.toString())
  44. //console.log(newInput)
  45. console.log("tmp:",newInput);
  46. var result = Java.use('com.kanxue.pediy1.VVVVV').VVVV(newInput)
  47. if(result == true){
  48. console.log('flag is ',newInput)
  49. return;
  50. }
  51. }
  52. }
  53. }
  54. }
  55. }
  56.  
  57. })
  58. }
  59. setImmediate(main);
  60. //setTimeout(main,2000);

有几点坑的地方,第一个就是这个apk是测试用的apk,所以直接adb install是装不了的,我百度了下,修改androidmainfest.xml文件

把android:testOnly = "true"这个东西删了,二次重打包下,结果还是不行,我丢,然后我又重新adb install -t apk名字,可以安装了

这是安装测试apk的命令,然后就是这题frida -U --no-pause 包名 -l hook注入的js名字,不要在包名加-f了,加-f是spawn,开始就自启动

这样会导致找不到classloader的,所以我们要attach上去,之后才能找到。

第三题:

和第二题相比就是加了检测frida的方法,init()是native方法,我们用ida打开发现是动态注册,先去找一手jni_onload因为动态注册肯定

先调用这个方法的,

动态注册的话,其实本质就是换了个名字,之前静态注册的话,特征太明显了,java_包名_类名_native方法,所以出现了

动态注册,利用jninativeMethod这个结构体来存储native方法和本地函数的关联

  1. //JNINativeMethod结构体
  2. typedef struct {
  3. const char* name; //Java中native方法的名字
  4. const char* signature; //Java中native方法的描述符
  5. void* fnPtr; //对应JNI函数的指针
  6. } JNINativeMethod;
  7.  
  8. /**
  9. * @param clazz java类名,通过 FindClass 获取
  10. * @param methods JNINativeMethod 结构体指针
  11. * @param nMethods 方法个数
  12. */
  13. jint RegisterNatives(jclass clazz, const JNINativeMethod* methods, jint nMethods)
  14.  
  15. //JNI_OnLoad
  16. JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved);

这个就说的很清晰了。就不多bb了,

说明真正的native方法对应的本地函数是init,我们跟进去一下

发现就是新建了一个线程,检测frida是否占用了端口

这里处理方式

1.第一种是重打包,直接不调用init()这个方法了,这个androidkiller的话,很简单的,就不多bb了

2.直接hook native 方法

  1. function hook_pthread_create(){
  2. var pt_create_func = Module.findExportByName(null,'pthread_create');
  3. var detect_frida_loop_addr = null;
  4. console.log('pt_create_func:',pt_create_func);
  5.  
  6. Interceptor.attach(pt_create_func,{
  7. onEnter:function(){
  8. if(detect_frida_loop_addr == null)
  9. {
  10. var base_addr = Module.getBaseAddress('libnative-lib.so');
  11. if(base_addr != null){
  12. detect_frida_loop_addr = base_addr.add(0xe9c)
  13. console.log('this.context.x2: ', detect_frida_loop_addr , this.context.x2);
  14. if(this.context.x2.compare(detect_frida_loop_addr) == 0) {
  15. hook_anti_frida_replace(this.context.x2);
  16. }
  17. }
  18.  
  19. }
  20.  
  21. },
  22. onLeave : function(retval){
  23. // console.log('retval',retval);
  24. }
  25. })
  26. }
  27. function hook_anti_frida_replace(addr){
  28. console.log('replace anti_addr :',addr);
  29. Interceptor.replace(addr,new NativeCallback(function(a1){
  30. console.log('replace success');
  31. return;
  32. },'pointer',[]));
  33.  
  34. }

这里hook native的手法,我还不太熟悉,直接搬肉丝表哥的代码的233,晚上研究一手

3.还有就是修改硬编码so,直接就是patch,爆破那种思路,各位大佬也是有手就行

从三道题目入门frida的更多相关文章

  1. 漫谈C指针:参数传递的三道题目

    漫谈C指针:参数传递的三道题目 2009-07-02 开讲之前,我先请你做三道题目.(嘿嘿,得先把你的头脑搞昏才行……唉呀,谁扔我鸡蛋?) 考题一,程序代码如下: [c] view plaincopy ...

  2. CodeForce——Deltix Round, Autumn 2021 (open for everyone, rated, Div. 1 + Div. 2)前三道题目题解

    目录 A: B: C: 题目链接 A Divide and Multiply standard input/output 1 s, 256 MB 正在上传-重新上传取消 x13036 B Willia ...

  3. 《算法C语言实现》————三道题目

    1.对于N = 10,100和1000,记录你的运行环境中分别运行一下程序所花费的时间.(用python) import datetime global a a = 0 def time_1(s): ...

  4. 27号华为笔试(三道ac两道)

    三道题目case:100,100,0: 三个题目: 前两个都全部ac了,第三题没时间: 记录一下大概的思路: 第一题 主要通过Java中的字符串处理函数:然后控制字符串输入格式: 卡bug的点: 1: ...

  5. 一步步学习javascript基础篇(6):函数表达式之【闭包】

    回顾前面介绍过的三种定义函数方式 1. function sum (num1, num2) { return num1 + num2; }  //函数声明语法定义 2. var sum = funct ...

  6. leetcode6

    好吧,今天晚上赶项目确实是做不了三道题目了,最近项目在网络编程方面有些进步,学到了东西,有时间再积累下来,很深的体会就是,和别人一起写代码,虽然蛋疼但是比自己一个人写要好点,不过发现自己对链表和排序什 ...

  7. April Fools Day Contest 2014

    April Fools Day Contest 2014 A.C.H三道题目 ============================================================= ...

  8. HDU 1828 Picture(线段树扫描线求周长)

    Picture Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  9. 【转】lonekight@xmu·ACM/ICPC 回忆录

    转自:http://hi.baidu.com/ordeder/item/2a342a7fe7cb9e336dc37c89 2009年09月06日 星期日 21:55 初识ACM最早听说ACM/ICPC ...

随机推荐

  1. 关于Ajax 的 cache 属性 (Day_34)

    最近做项目,在某些页面显示,ajax刷新总是拿不到新内容,时常需要清除缓存,才能到达想要的效果. 经过再次查看文档,最后加了一行属性:cache:false 即可解决问题 我们先看下文档的说明: 可以 ...

  2. Raft: 一点阅读笔记

    前言 如果想要对Raft算法的了解更深入一点的话,仅仅做6.824的Lab和读<In Search of an Understandable Consensus Algorithm>这篇论 ...

  3. 分布式调度任务-ElasticJob

    一:问题的引出与复现 在一个风和日丽的工作日,公司运营发现系统的任务数据没有推送执行,整个流程因此停住了.我立马远程登陆服务器,查看日志,好家伙,系统在疯狂的打印相同的一段日志:c.d.d.j.i.e ...

  4. 3D点云完美匹配

    3D点云完美匹配 The Perfect Match: 3D Point Cloud Matching with Smoothed Densities 地址链接: http://openaccess. ...

  5. MinkowskiBroadcast广播

    MinkowskiBroadcast广播 MinkowskiBroadcastAddition广播加法 class MinkowskiEngine.MinkowskiBroadcastAddition ...

  6. [NOIP1998 提高组] 拼数

    题目描述 设有 n 个正整数​ a1-an,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数. 输入格式 第一行有一个整数,表示数字个数 n. 第二行有 n 个整数,表示给出的 n 个整数 a_ ...

  7. Java 面试题关于包装类

    这几个问题的知识点涉及的内容非常的刁钻,值得自己好好的理解. 问以下程序的输出结果是: 问题一: Object object=true ? new Integer(1):new Double(2.0) ...

  8. 简单理解数据库连接池(JDBC)

    为什么要使用连接池? 在我们写代码的时候,写了很多类,假如这些类都和数据库打交道.这样的话每个类都要去获取数据库连接,操作完了之后就把连接释放了. 要知道,获取数据库连接的操作其实是向操作系统底层去获 ...

  9. Python小白的数学建模课-07 选址问题

    选址问题是要选择设施位置使目标达到最优,是数模竞赛中的常见题型. 小白不一定要掌握所有的选址问题,但要能判断是哪一类问题,用哪个模型. 进一步学习 PuLP工具包中处理复杂问题的字典格式快捷建模方法. ...

  10. CSS ::marker 让文字序号更有意思

    本文将介绍 CSS 中一个比较有意思的伪元素 ::marker,利用它,我们可以让我们的文字序号变得更加的有意思! 什么是 ::marker CSS 伪元素 ::marker 是从 CSS Pseud ...