今天在twitter上发现一个学习frida用的example,下载下来做了做,当作学习frida的第一次了。
前言
整个example主要分为8个challenge,程序初始界面如图
大概的guideline在程序的界面已经给出,不再赘述,程序未加壳未混淆,直接拿出来逆就可以了,jeb打开后,发现程序大概逻辑就是满足条件后对应行变色,已完成的变绿色,未完成的变红色。具体逆向不再写,本篇文章主要用于入门frida。
Challenge 1
第一个challenge比较简单,主要更改Challenge01类中的静态变量值为1即可。
1 | var challenge_01 = Java.use("uk.rossmarks.fridalab.challenge_01"); |
Challenge 2
第二个challenge,要求运行MainActivity中的函数chall02();我的想法是在MainActivity类中任意overload一个执行的函数,然后在其中调用chall02()函数,这里选择了Challenge 3中的函数,具体代码如下:
1 | var MainActivity = Java.use("uk.rossmarks.fridalab.MainActivity"); |
Challenge 3
challenge 3要求让函数返回true,方法如challenge2,overload函数chall03,更改其返回值为true,代码如下:
1 | var MainActivity = Java.use("uk.rossmarks.fridalab.MainActivity"); |
Challenge 4
challenge4则要求改变函数参数为“frida”,同样很简单,在overload一个执行的函数中调用chall04函数,并传递参数“frida”,具体代码如下:
1 | var MainActivity = Java.use("uk.rossmarks.fridalab.MainActivity"); |
Challenge 5
cahllenge 5 进一步要求chall05函数的参数总是为“frida”,则需重写chall05函数,并在其中调用函数chall05,代码如下:
1 | MainActivity.chall05.overload("java.lang.String").implementation = function(){ |
Challenge 6
Challenge 6 要求延时hook,通过setTimeOut函数来实现,而后在challenge_06类的成员函数startTime()执行后overload函数addChall06,并在其中调用MainActivity类中的chall06函数进行confirm。具体代码如下
1 | setTimeout(function(){ |
Challenge 7
challenge 7 说也奇怪,由于成员变量chall07是一个静态的变量,因此在调用MainAcitivity类中函数chall07时其实可以指定参数,并且保证正确,并没有如作者所说的爆破,不知道是不是我想错了。我的代码如下
1 | MainActivity.chall05.overload("java.lang.String").implementation = function(){ |
Challenge 8
最后一个challenge涉及UI控件的属性值的更改,具体代码如下:
1 | MainActivity.chall05.overload("java.lang.String").implementation = function(){ |
后续
感谢@rossmarks提供的frida学习的example,最终界面如下: