首页
社区
课程
招聘
Android第一题
2015-10-20 16:44 2466

Android第一题

2015-10-20 16:44
2466
首先dex2jar+jd-gui载入看看
onClick()中启动另外一个线程来改变文本:当传递的消息为0时触发除0异常,进而显示通过的文本;
这里jd-gui对run()中的循环结构分析是不正确的,需要对照smali来分析;jd-gui没有解析check()函数,直接上调试;
随便输入字符串,发现抛异常了,看到是要将输入的字符串转换为数字;OK,输入111,没有抛出异常,说明函数正常执行了而且返回了False;在check()函数中搜索return,只有一处:
locret:
return     

此处有4个来源,全部下断,其中两处很明显,且来自于同一个判断:
const/4                         v4, 1
goto/16                         locret
loc_124D4:
const/4                         v4, 0
goto/16                         locret

运行一次,正好断在了返回false的地方;回到刚才的判断处,观察此处用v4, v8, v6计算出的值与v10进行了比较,v4, v6都是常量,变量只有v8, v10,换几个不同的输入多观察两次,可以发现v8的值也是固定的,同时可以印证v10与输入相关且目标值为520676;
接下来寻找从输入到v10的计算过程,简单向上观察一下可以发现v10的计算过程很靠前,直接把dex拖进IDA,来到刚才的判断处,空格,向上查找最近的判断分支,略过大多数顺序流程,来到这里:
CODE:0000FAA0                 and-int/lit8                    v4, v4, 0xF
CODE:0000FAA4                 if-ltz                          v4, loc_124DA
CODE:0000FAA8                 const/16                        v4, 0x15

loc_124DA对应的smali标号为:cond4,下断,发现此处v10已经是计算过的值,继续向上查找,不远处来到loc_704C:
const/16                        v5, 0x3E9
move/from16                     v0, v17
if-ge                           v0, v5, loc_EE70

这里有一个循环,而且上面的loc_7036有一个对v10的赋值操作:
move-wide/from16                v10:v11, v18:v19

看上去很有可能就是这里对输入进行了计算,验证一下,在赋值处和循环起始处下断(观察v10的计算过程);果然,在赋值处观察到v10为输入值,而循环一共执行到v17为0x3E9=1001,在循环处每次断下来后,可以发现v17和v10的变化都是有规律的:
v17=1,5,9,13...1001
v10=v10+v17
结果已经很明了了,要的输入就是520676-sum(1,5,9...1001)=394925,输入之,发现还是不对,而此时v10的值为519675,与520676正好相差1001,OK,输入394925+1001=395926,没有问题,如愿通过

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回