-
-
[原创]第1题解题思路
-
发表于: 2015-1-26 12:24 2192
-
0x00
拿到apk后,本能地拷贝出classes.dex。然后用dex2jar将classes.dex反编译classes_dex2jar.jar。用jd-gui打开classes_dex2jar.jar,通过包名com.example.simpleencryption可以看出这是一个简单的加密程序。然后定位到Button对应的事件监听代码,可以看到代码片段如图1所示:
图1 Button的事件监听代码
从图1可以看出,字符串str1是用户输入的字符串,str2是程序生成的一个表,str3是程序生成的正确的密码,str4是用户输入的字符串经过加密后得到的密文。
其中getTableFromPic,getPwdFromPic, access$0这3个函数需要重点关注。
查看getTableFromPic和getPwdFromPic这两个函数,发现都是一堆乱码;这种情况在之前看到的爱加密教程中遇到过,可见程序插入了某些代码诱发了jd-gui的漏洞,造成无法正常查看反编译得到的源代码。于是,线索断了。。。
0x01
现在只能利用apktool反编译apk,然后查看smali代码来找线索了。
通过查看smali代码,可以得知getTableFromPic,getPwdFromPic这两个函数都是读取了assets文件夹中的logo.png图片,然后进行了一系列的操作。access$0函数则是调用了bytesToAliSmsCode函数,显示bytesToAliSmsCode就是加密函数,而aliCodeToBytes就是对应的加密函数了。于是一个想法诞生了,如果调用aliCodeToBytes这个函数,不就可以顺利解密了。可是修改smali代码确实有些麻烦啊,囧。。。
0x02
正在郁闷之时,突然想到代码中有log,程序log可是个宝啊!于是开始边跑程序边看logcat中的日志。输入了”alibaba”和”1688”等关键字(其实也是想碰碰运气,猜密码。。。╮(╯▽╰)╭)
输入alibaba后,可以看出logcat中的日志如图2所示:
图2 logcat中的日志
从图2可以看出,table是一个表,pw就是正确的密码,而enPassword就是我输入的”alibaba”加密后得到的密文。再回过头来看一下加密函数和解密函数,最后得出了加密算法的原理:先由getTableFromPic函数生成一张密码表table,然后以用户输入的字符串中字符的ASCII做为索引index,那么字符table[index]就是用户所输入字符对应的密文了。而解密算法的原理就是依次查找密文字符串strCmd的字符在密码表table中的下标,然后以该下标做为ASCII,即可将密文字符还原为明文字符。于是依次找到“义弓么丸广之”中的各个字符在密码表table中的下标,以该下标做为ASCII,即可还原得到明文”581026”了。
拿到apk后,本能地拷贝出classes.dex。然后用dex2jar将classes.dex反编译classes_dex2jar.jar。用jd-gui打开classes_dex2jar.jar,通过包名com.example.simpleencryption可以看出这是一个简单的加密程序。然后定位到Button对应的事件监听代码,可以看到代码片段如图1所示:
图1 Button的事件监听代码
从图1可以看出,字符串str1是用户输入的字符串,str2是程序生成的一个表,str3是程序生成的正确的密码,str4是用户输入的字符串经过加密后得到的密文。
其中getTableFromPic,getPwdFromPic, access$0这3个函数需要重点关注。
查看getTableFromPic和getPwdFromPic这两个函数,发现都是一堆乱码;这种情况在之前看到的爱加密教程中遇到过,可见程序插入了某些代码诱发了jd-gui的漏洞,造成无法正常查看反编译得到的源代码。于是,线索断了。。。
0x01
现在只能利用apktool反编译apk,然后查看smali代码来找线索了。
通过查看smali代码,可以得知getTableFromPic,getPwdFromPic这两个函数都是读取了assets文件夹中的logo.png图片,然后进行了一系列的操作。access$0函数则是调用了bytesToAliSmsCode函数,显示bytesToAliSmsCode就是加密函数,而aliCodeToBytes就是对应的加密函数了。于是一个想法诞生了,如果调用aliCodeToBytes这个函数,不就可以顺利解密了。可是修改smali代码确实有些麻烦啊,囧。。。
0x02
正在郁闷之时,突然想到代码中有log,程序log可是个宝啊!于是开始边跑程序边看logcat中的日志。输入了”alibaba”和”1688”等关键字(其实也是想碰碰运气,猜密码。。。╮(╯▽╰)╭)
输入alibaba后,可以看出logcat中的日志如图2所示:
图2 logcat中的日志
从图2可以看出,table是一个表,pw就是正确的密码,而enPassword就是我输入的”alibaba”加密后得到的密文。再回过头来看一下加密函数和解密函数,最后得出了加密算法的原理:先由getTableFromPic函数生成一张密码表table,然后以用户输入的字符串中字符的ASCII做为索引index,那么字符table[index]就是用户所输入字符对应的密文了。而解密算法的原理就是依次查找密文字符串strCmd的字符在密码表table中的下标,然后以该下标做为ASCII,即可将密文字符还原为明文字符。于是依次找到“义弓么丸广之”中的各个字符在密码表table中的下标,以该下标做为ASCII,即可还原得到明文”581026”了。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
他的文章
- [原创]第2题解题思路 3228
- [原创]第1题解题思路 2193
看原图
赞赏
雪币:
留言: