首页
社区
课程
招聘
[原创]第一题解题思路
发表于: 2015-1-26 09:44 2162

[原创]第一题解题思路

2015-1-26 09:44
2162
一看这一题是下载一个apk文件,感觉是一个反汇编的题目,于是迅速查反汇编的文章。
反汇编文章:
http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%8E%A8%E8%8D%90/9396.shtml
开始反汇编,但是得先看看这个apk运行起来的样子,于是开启了一个AVD,顺便也差了一下相关文章。
ADB调试 的文章:
http://www.360doc.com/content/10/0427/18/155970_25158806.shtml
首先是进入ADT的目录
C:\Program Files\MyEclipse\MyEclipse 10\android-sdk\platform-tools
运行adb shell,发现我的AVD有问题,进入主菜单的时候一直报launcher error,决定使用adb来启动apk
http://bbs.pediy.com/showthread.php?p=1218556
am start pkg/.MainActivity
ls /data/app
运行了半天,看了半天运行不了,找到了他的类
am start -n com.example.simpleencryption/.MainActivity
启动了程序,真难启动。发现还是要密码,怎么办,继续看反编译的代码。
代码里面有setContentView,跟踪 --2130903064
但是发现这里面没有xml文件啊,那xml文件在哪儿呢、
我记得哪里好像看到过xml文件,找了半天,才发现,apk文件修改扩展名为rar的时候,打开看过,里面有xml文件
找到,开始看xml文件里面的内容,好,里面是乱码,记得看到apk反编译的文章里面写到了关于几个工具,有的工具是为了反编译布局文件,有的 反编译工具是反编译代码的,继续找工具。
apktool,找到,下载,google下不到,baidu想办法。
恩,还好,6.1M大小,等一会儿应该就可以下完,等着吧,反正没事儿,继续看看代码里面的内容。
str3应该是我们输入的密码,str4是将str2和str1传入通过函数bytesToAliSmsCode计算得到的结果,这个应该就是密码,继续跟踪。
哦,这个方法很简单,就是把str2按照str1的位置做了一个换序存放,这时候apktool下载好了,继续看xml文件。
下载了一个一键apk的工具,貌似不会用,于是,继续查文档。
使用方法很简单 apktool d <file.apk> <dir>
尝试一下,下了半天都是什么国产的软件,让人汗颜,难用,改的乱七八糟,还不懂原版的是什么意思,无法理解,这就是国内的学习环境,好极了。
下载了一个文件,再下载了一个framework-res.apk 文件,安装好了才可以使用,然后使用命令,把文件反编译了,看到了activity_main文件的内容,还真的是这个内容,然后看文件的描述,str2和str1从哪儿来的(这里的反汇编工具反汇编的有问题,名称被混淆了。)。
检查得到str1是用户的输入,str2使用方法getTableFromPic获得,但是这个方法无法查看,嗯,的确有些复杂,继续反编译。
由于str2的函数 getTableFromPic 函数反编译的时候显示// ERROR //,所以想别的办法。
解压apk文件的时候,发现里面有两个logo文件,尝试把后面的logo文件移到里面去,看看这样是不是一个设定导致的。
尝试保存apk文件,然后将apk文件加载到虚机里面,运行起来。
搜索了一下,使用adb命令卸载的方法:
adb unstall com.example.simpleencryption
Success
再安装APK
adb install AliCrackme_1.apk
启动, adb shell am start com
失败,回头看安装回显,发现没有安装成功,返回INSTALL_PARSE_FAILED_NO_CERTIFICATES
看到网上有完美解决的方法,打击一看,我擦,100行,太复杂。
明白了,apk文件不能直接这样修改,那么遵循他,apk文件只能通过源码编译,这样才能打包,然后自动生成签名文件,验证起来就没问题,现在这个样子不行,于是想办法破解上面看到的两个函数。
看来我的水平还是有限,第一个问题都无法解决,感觉到汗颜,搞了那么久。
发现apktool文件下载的不是官方的,生气。重新下载。
重新编译,http://blog.csdn.net/sam_zhang1984/article/details/8839175
遇到一些问题,查资料,开始反编译,报错:
Exception in thread "main" brut.androlib.err.UndefinedResObject: resource spec:
0x010300e1
无法编译,尝试下载frame.apk文件,加载系统默认资源
=============================================
反编译了半天,发现这个方法还是无法找出来,于是通过看看后面的函数写法,看看破绽,或许可以直接拿到我们需要的密码呢?试试。
我重新反编译了一下文件,使用apktool工具,使用网上教程删除了framework的文件,然后编译通过了,没有错误,哈哈,继续看代码和资源文件。
发现现状如下,可以看到源代码文件全部反编译为smali文件,xml文件都正常,资源文件都可以正常阅读,这个非常好。
想想smali文件如何转换为java文件吧,于是开始查资料。
wow 官网有smali转换为java的工具,直接下载看看,好极了,才6.5M大小。http://www.hensence.com/en/smali2java/#Download
使用这个工具的时候甚至发现了里面集成了apktool工具,打开项目的时候,要求选择apk文件,太好了,直接来帮助反编译apk文件,真好用。
然后看看里面写的代码如何如何。
看到showDialog函数出现了问题,不过我需要的两个函数,十号的,继续看函数内容。
函数getTableFromPic函数的内容,读取Logo.png文件,的第0x15d81位置,取后面的768长度存放在byte数组里面返回回来。
函数getPwdFromPic函数的内容,读取Logo.png文件,的第0x16481位置,取后面的18长度存放在byte数组里面返回回来。
不过看到里面的函数里面有一个lenght,瞬间感觉这个程序员太掉价了吧。
看到两个函数,ali的函数和返回来的函数,反写的函数都帮助我们写好了,太好了。
放到exclipse里面破解,主函数贴出来:
//        String password = "[B@7bdecdec";
    String table = getTableFromPic();
    String pw = getPwdFromPic();
    System.out.println("PWD is:" + pw);
    String enPassword = "";
    try {
//        enPassword = bytesToAliSmsCode(table, password.getBytes("utf-8"));
//        System.out.println("My PWD is:" +enPassword);
        byte[] b = aliCodeToBytes(table, pw);
        System.out.println(new String(b,"utf-8"));
    } catch(UnsupportedEncodingException e) {
        e.printStackTrace();
    }
   
嘿嘿,581026
好吧,比赛已经结束了,玩玩。
【总结】
使用工具:
1、Smali2Java.1.0.0.558.zip
URL:http://www.hensence.com/cn/smali2java/
工具特点,直接从apk文件反编译,相关程序能够自动反编译,效果比较好,缺点是部分函数会出现无法解读的现象。

2、Java Decompiler:
URL:
工具特点,要求从class里面的jar文件反编译,需要手动解压出来classes.dex文件,通过dex2jar工具将这个文件携程jar,然后就可以通过这个工具查看文件,特点是这个工具部分函数正常,部分函数不正常,可以与第一个工具互补,挺好。

3、这两个工具都是无法看到资源文件的,比较麻烦,只能查看代码文件。
查看资源文件的工具是apktool,google官方给出的软件。
使用apktool d AliCrackme_1.jar apk
即可将文件处理成资源文件,缺点是代码文件均解析为smali,可阅读性不高,但是官方出的产品,解析出来的东西是没有问题的。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//