Chuckie 发表于 2016-4-20 16:52

android入门学习01

本帖最后由 Chuckie 于 2016-4-23 19:07 编辑

题外话:上上周面过一个安全岗位,说是通过了,但是到了现在都没消息,等期中考过后我再去联系吧。
最近在学习android的相关技术,想到以后可能会用到,在网上找到了本看雪论坛出的一本书《android软件安全与逆向分析》,然后就跟着动手做了起来,算是正在入门吧。里面的内容可能和实际操作有些出入,不过大体途径都是一样的。废话了这么多,进入正题:Crack01
首先,在这里就不详细讲解android虚拟机和smali语法之类的了,原因有两个,第一个是论坛里有专门的相关介绍,再一个就是我自己也是刚刚进入学习,一知半解不误人子弟。相关知识google之就好。

0x00目的:
这次实验的目的是写一个简单的crackme,然后尝试逆向爆破。
要用到的工具有:
      1.anroid studio 或者 eclips 主要用来写crackme
      2.apktool,这个工具爱盘里有,也可以去github或者googlecode搜索,爱盘里的版本老一点而已。
      3.signapk.jar 这个是android的源码里带有的,我在我机器上没找到,因为我没下过源码,于是,我到github上搜索一翻,后来找到了,现在再翻,翻不到了。。结尾处我会放出云盘链接的。
      4*.按道理相关工具还有dex2jar jd-gui 这两个工具呢用处也很大,这次实验不用,可以先装上备用。
      ps:以上工具都是跨平台的。直接用java -jar 执行jar包就好了      

0x01开工:
      实验机器是arch linux ,使用的是android stuidio 2.0,apktool 是2.1.0直接搜索下载之
      http://ibotpeaches.github.io/Apktool/
      注意:apktool网站上说要求使用 java7,不过这次实验用的java8,没有出现问题,可以正常使用
      
      环境搭好以后,就可以开始写crackme了。首先打开android studio,基本上一路next新建一个空的工程。既然是crackme,那么就只需要两个EditText 和一个 Button就好了,于是代码呼之欲出,我们的layout就可以写出来了,在 activity_main.xml 中添加以下代码:


      

      我们把hint的字符串添加到字符串资源,在string.xml中先加入以下资源:

   然后布局文件就可以改为:



      UI已经弄好了,现在就差功能实现了,沿用开头提到的那本书里的例子。它先用MD5对用户名进行hash,然后将结果转化为十六进制的字符串,之后取这个字符串的偶数位的位数拼接在一起,形成SN码。过程显得很残暴。。不过代码还是很清晰的,对于我这种java新手,只需要了解到MD5是用 MessageDigest 这个类来实现的就OK了,具体细节可以参考代码,或者搜索之。具体的验证算法如下图:






      核心部分已经弄好了,现在只需要完善一下oncreate方法,使得button具有检验功能即可。我们让用户输入用户名,SN码,如果验证通过,那么toast一下,并且将title改为已注册,反之,未通过验证,也toast一下,然后title改为为注册。理清功能后,总结了一下,还需要四个字符串资源,分别时两个toast和两个title,于是现在的string.xml看起来应该是这样的:





      现在,给button写代码吧,代码呼之欲出:



      注意,要在类开始之前将两个Edittest和一个Button声明一下:



      到这里crackme已经写好了,在虚拟机或者真机里面调试一下,输入用户名:test,SN:test123456:
                        


      
      没问题,乱输入的数据显然不能通过验证,现在可以打包了。选择androi studio的build==》generage signed apk 然后自己创建个key就打包啦。
      注意:千万不能直接用debug里面生成的apk,否则反编译后的string.xml里面找不到我们需要的字符串资源,导致实验方法失效

0x02反编译:
      进入我们的工程目录下的app文件夹,里面已经有一个打包好的APK了,打开终端,使用apktool反编译,命令格式如下:java -jar /path/to/apktool.jar d ***.apk
      由于jar包安装的目录我经常记不住,于是写了一个脚本,并且添加到环境变量里,下次就可以不用输入一长串到apktool的路径了参考一下:java -jar /home/chuckie/OtherSoftware/Java/android/android-reverse/apktool_2.1.0.jar $1 $2
      其中一长串就是我的apktool jar包的位置, $1 $2 为命令参数,使用方法就和apktool一样,windows下 写一个bat也是类似的方法,具体语法不太清楚,google一下DOS的格式就可以很简单的写出来,不嫌麻烦的话用python之类的写个脚本也是可以的。
      好了,继续,我们使用apktool实现反编译之后会生成一个和apk同名的文件夹,我们之后所有的操作就在这个文件夹里进行了。如图:

   



0x03crack:
      进入上面反编译生成的文件夹,进入res/values 找到string.xml,大概是这样的:
   

      然后找到未注册的 name这个属性“unregistered”,然后在 res/values 同一个目录下,找到public.xml,有点长,搜索一下unregistered定位,之后又会找到一个id属性,记下这个id属性:
   
      现在切换一下目录,到smali/com/chuxdesign/crackme01/挨着查找文件里包含上面找到的ID
的文件,至于怎么查找,我使用编辑器打开然后ctrl+f一个个找(注:可以根据文件名来确定查找优先级,比如像color.smali之类的,可以考虑放在后面,看名字似乎和验证SN码无关),要是有什么更快的方法,请告诉我。。。找了两个文件之后,发现这个id 0x7f06001b是在MainActivity$1.smali里面,定位到它附近:
   
      然后开始结合自己写的java代码开始看这个smali格式的码,发现也还是不那么晦涩,也可以很清晰的验证,这个虚拟机是基于寄存器的,而不是基于栈的,类似汇编的,我们找到他的跳转语句:
   
      然后查一下,这个nez的反义代码,爆破之改成eqz,然后保存退出。


这个时候,crack就算完成了,怎么检验呢? 同样使用我们的apktool,回到这个反编译包的根目录,命令格式是:java -jar /path/to/apktool.jar b ./

我们就可以得到一个dist文件夹,进入dist,我们就找到了一个新的apk,但是现在的apk还不能安装,我们需要进行签名。这时候就使用signapk.jar这个工具了,直接
java -jar /path/to/signapk.jar /path/to/signapk-key.testkey.x509.pem /path/to/signapk-key.testkey.pk8 *.apk

当然我还是写了个脚本,避免每次输入很多的路径:
java -jar /home/chuckie/OtherSoftware/Java/android/android-reverse/signapk/sign-master/dist/sign.jar /home/chuckie/OtherSoftware/Java/android/android-reverse/signapk/sign-master/dist/signapk-key.testkey.x509.pem /home/chuckie/OtherSoftware/Java/android/android-reverse/signapk/sign-master/dist/signapk-key.testkey.pk8 $1
执行命令之后,控制台不会有输出,直接会生成一个同名_s.apk的包在 /dist 下


再然后,就可以给模拟器或者真机安装了。使用adb即可(真机不要忘了开启开发者模式)。
首先把adb的路径放入环境变量,或者不放也可以:
命令:/path/to/adb devices      查看当前的设备
然后 /path/to/adb connect *.*.*.* 链接设备(*代表地址)
然后 /path/to/adb install *_s.apk 安装这个包(注意要在设备里先卸载这个同名的应用,因为前面的签名和后面的签名不一样,前面用的个人的,后面用的signapk 自带的test签名)

之后运行输入同样的测试数据就是这样:


现在放链接:
android studio:http://developer.android.com/sdk/index.html
apktool:http://ibotpeaches.github.io/Apktool
signapk:http://pan.baidu.com/s/1hso9svq提取:9s4s
demo.apk+cracked.apk+cracked_s.apk:http://pan.baidu.com/s/1skEzjg5 提取:j659
有什么疑问可以发邮件:chuxdesign@hotmail.com

不苦小和尚 发表于 2016-5-4 07:32

btnCheck.setOnClickListener((view) {
             String user = username.getText().toString();
             String passwd = password.getText().toString();
             System.out.println(user + " : " + passwd);
            try {
                if (!checkSN(user.trim(), passwd.trim())) {
                  Toast.makeText(MainActivity.this, R.string.unsucessed, Toast.LENGTH_LONG).show();
                } else {
                  Toast.makeText(MainActivity.this, R.string.sucessed, Toast.LENGTH_LONG).show();
                  btnCheck.setEnabled(false);
                  setTitle(R.string.registered);
                }

            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
      });


这段老是报错啊,楼主指导一下

Chuckie 发表于 2016-4-20 22:51

wangqiustc 发表于 2016-4-20 18:57
开发安卓需要什么基础吗?

先要会点java,然后找本android的书读一读,跟着写写代码,一两个demo之后继续看书,我自己是这个路径。。。。然而感觉无论是java这个语言,还是android这个方向,都是博大精深的

馍上开花 发表于 2016-4-20 16:58

安卓.............入门....................... 入门学习???{:1_906:}

12290602 发表于 2016-4-20 17:09

LCG丶Ran 发表于 2016-4-20 17:11

wangqiustc 发表于 2016-4-20 18:57

开发安卓需要什么基础吗?

Chuckie 发表于 2016-4-20 22:52

LCG丶Ran 发表于 2016-4-20 17:11
啥时候了还谷歌。。。

是啊。。没有了google bing也凑活啊,没有google的android就是安卓了。。

qtfreet00 发表于 2016-4-22 10:48

把帖子格式整理下吧,希望长期更新

Chuckie 发表于 2016-4-22 11:59

世事繁华皆成空 发表于 2016-4-22 10:48
把帖子格式整理下吧,希望长期更新

行,也是第一次弄这个不大会用。会后续更的,继续学习中

Hmily 发表于 2016-4-22 19:57

@Chuckie 图片上传后点击下就到正文中了,不用复制上传好的图片地址,这样都无法显示高清图片了。
页: [1] 2 3
查看完整版本: android入门学习01