听鬼哥说故事 发表于 2014-12-19 09:38

【Android】跟着鬼哥学so修改

本帖最后由 听鬼哥说故事 于 2014-12-23 13:14 编辑

跟着鬼哥学so修改,一,准备篇


图/文 听鬼哥说故事


文章是系列教程,大家可以直接关注这一个帖子即可,有新文章版主也会合并过来的,在2,3,4,5等楼层,请及时刷新。



最近看了一些博客,论坛,国外文章,大牛的文章作品,文笔,技术,思路都非常好,默默的点个赞。。

咱水平不高,仅供玩乐而已,基础知识不多说了,环境配置自行学习即可,有兴趣的请继续读下去,菜鸟出品,水平有限。

截图看不清,可以直接下文档,文章最后有。



闲话少说,so的修改,重要性大家都知道,这里从头编写so文件,分析so文件,修改so文件,打算做一个系列的教程,当然,主要是看时间允许。


android的sdk配置以及ndk环境下载,请同学们自行google即可。


翻墙也不会,工具也不会用,搜索也懒得搞,请直接略过本文即可。


0x1:新建立一个安卓工程







0x2:编写调用so代码和方法定义

在MainActivity.java同目录下创建一个JniGg.java文件,用于调用so






0x3:生成文件头.h文件

在这个目录可以看到我们编写好并且已经编译的class文件,eclipse是自动编译的。




一切正常编译,那么现在我们回到工程根目录下:





然后在命令行切换到此目录:





现在我们使用下面的命令:javah -classpath bin/classes -d jni com.ggndktest1.JniGg




不报错,并且成功编译出.h文件,才算成功的。

上面需要注意的是那个bin/classes,因为我的电脑上编译完的classes目录是这个样子的,参照上文那个文件目录的截图图片,个别电脑上不需要/classes。然后在Eclipse,右击工程,进行刷新,可以看到如下截图:




0x4:编写c代码





在jni目录下新建file,gg-jni.c自己看看代码,也就知道啥意思了




然后就是Android.mk文件的编写了





0x5:生成so文件





切换到工程根目录,然后直接ndk-build即可。这里需要注意,ndk-build需要配置环境变量,自行搜索配置方法即可。


0x6:android调用代码





新建一个TextView,然后显示so里面的字符串。然后运行我们的测试代码:















相关附件和文档:
http://pan.baidu.com/s/1pJ2Y047





听鬼哥说故事 发表于 2014-12-19 09:47

跟着鬼哥学so修改,二,进行篇

本帖最后由 听鬼哥说故事 于 2014-12-19 10:29 编辑

图/文听鬼哥说故事

废话不多数了,继续看吧,基础差的,自行搜索文章教程,或者买书学习

继续上文的内容----------------------------------


0x1:测试文件的编写
经过上一篇文章的基础学习,现在我们开始进行是用的部分。
既然我们可以在so中定义String字符串了,那么我们当然也可以定义int类型的数据了,那么,我们在此定义一个getCoin方法,返回值为int类型。如下:
JNIEXPORT jint JNICALL Java_com_ggndktest1_JniGg_getCoin
(JNIEnv * env, jobject this)
{

int c=100;

return c;

}

同时编写java代码:

static public native int getCoin();

这两个方法的添加,可以继续在我们上一篇文章的基础上进行补充即可,当然,为了熟练创建ndk工程,也可以重新创建工程的。
然后我们在shell下切换到工程根目录:





这样成功生成so文件。
然后我们简单在xml定义下布局,简单的,直接在layout下



<TextView
      android:id="@+id/coin"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="" />



添加一个TextView,设置id为coin,然后就可以在主类进行引用。






这样我们运行一下程序,查看一下效果。




0x2:任务明确
我们现在需要做一个任务,就是修改上文程序中的金币数量。
我们直接在工程的bin目录下拿出来未签名的apk,分析时可以先不管签名,我们把lib/armeabi下的so文件拿出来,拖进IDA进行分析。

0x3:挂起IDA,进行分析

(假设,当前我们的状态是不知道程序源码)
通过上文运行的截图,我们可以分析到,有关键字“Current Coin ”,我们在对反编译后的程序分析搜索,发现只存在于so文件中,这样,我们就直接在IDA中搜索字符串去。
快捷键 Shift + F12




找到它的引用





这个没啥好解释的,加载字符串而已,没啥重要信息,发现不出来金币在哪里定义了,那么我们就看下引用。



发现在so文件中,并没有函数对此方法进行调用,那么我们就返回java中,看看java语句中是怎么对它进行的调用,其上下文都是什么东西。







经过查看printhello方法在JniGg.smali中是定义,在MainActivity是调用,我们详细看下代码:








贴上简单的说明,大家就可以看的清楚了。
我们在这里发现一个关键函数,getCoin方法,通过向上追寻,发现也是在so文件中的,那么现在我们再次回到IDA中:




在Options打开General,也就是第一个选项,设置如下:




然后我们可以看到:



这个是Thumb的指令,那么我们修改,也要使用Thumb。
一个字节来定义数值,我们只能用最大ff了,即255,那么在16进制编辑器打开,跳转到c04的位置,修改为FF 20,然后放回程序,签名,运行。





好了,说明我们的修改成功。

0x4:反思一下
既然我们是自己写的源码,那么我们就可以很好的来对比思考了,这个过程留给同学们自己来思考,请花上10分钟时间,对比一下代码里面编写的方法,与在so中反汇编的代码的联系,增强一下熟悉的感觉。
另:

上面的apk,还有其他破解方法,即我们找到java层的调用了,那么直接修改java层调用方法的返回值,效果也一样,可以修改为无限大的数值。











相关附件地址:


http://pan.baidu.com/s/1i3wzetf


听鬼哥说故事 发表于 2014-12-19 14:10

跟着鬼哥学so修改,三,作业篇

作业:
通过前面两篇文章的学习,请自行分析此应用,将当前用户类型修改为Gold Vip 用户。





有两种以上的方式可以修改的,有兴趣的同学请进行分析,写一下分析记录,可另起文章发布其过程与思路。


明天或者后天,再发布一下分析过程,以及原代码,大家再对比学习一下即可。


--------------------------------------------------------
下载地址:
http://pan.baidu.com/s/1jG22HMY



听鬼哥说故事 发表于 2014-12-22 09:51

跟着鬼哥学so修改,三,答案篇

在52发了,不过很少人回复,很少人去做第三题。
所以其他论坛转载的还是有几个人去对待这个题目而进行的分析,如下:

第三题链接:(3楼)
http://www.52pojie.cn/thread-313869-1-1.html

几篇分析好的文章:http://www.pd521.com/thread-114-1-1.html   xxoo
http://www.pd521.com/thread-113-1-1.html    myoldid(回复,1,2,3)


进行软件的分析,这个过程就不需要多说了,大家自己看就是了,下面是分析完毕后的思路进行。
细节方面不再叙述:


smali层关键点:





native层关键点:





0x1:
修改smali层,将传入参数v0设置为int数值 1。

0x2:
针对这个apk来说,搜索默认显示的Normal User





等长度修改字符串,多余的不用空格补齐:






0x3:
确定好传入的参数,主要是R2,所以将R2与几个数字进行比较,所以将这个比较干掉它,也就是修改指令 00 00去替换掉,然后程序必须要走下面Gold Vip的流程了。
这里也可以改BNE为BEQ,效果一样,不过推荐用上面那个方式。





0x4:
核心参数是传入的R2,根据下面的汇编代码也可以看到,R2=1是关键点。
所以,我们在push指令完毕后,将后面第一个CMP 和BEQ修改掉。
Mov R2,#1      ,Nop   .
因为直接修改的话,下面多个BEQ处理是无用的,所以直接Nop掉即可。
即 01 20 ,00 00

源码参考:
看完这个,再对比大家分析的so里面的显示效果,自然就明白了,可以简单总结下,so中遇到类似的情况,不是if else,就是switch。




JNIEXPORT jstring JNICALL Java_com_ggndktest1_JniGg_VipLevel
(JNIEnv * env, jobject this,jint a)
{
    int c=(int)a;

    const char* vip = "";

    switch(c) {

      case 1:
            vip= "Gold Vip";
            break;

      case 2:
            vip="Silvery Vip";
            break;

      case 3:
            vip="Copper Vip";
            break;

      default:
            vip="Normal User";
            break;


    }

    return (*env)->NewStringUTF(env, vip);


}




其他分析方法还有几个,不过很少人来去做,就简单介绍这几个方法了。。


不知道怎么合并到原帖子中,版主大人看着弄吧。。




听鬼哥说故事 发表于 2014-12-23 13:10

跟着鬼哥学so修改,四,实例第一篇

跟着鬼哥学so修改,四,实例第一篇



图/文听鬼哥说故事


---------------------------------------------分割线--------------------------------------------




这篇文章是前段时间的文章,最近这个系列的so分析刚好可以做为一个实例教程,所以就补充拿回来了。
前三篇没看的,请继续关注论坛,看完前面三篇。


http://www.52pojie.cn/thread-313869-1-1.html




趁热打铁,加深对so的分析过程,于是就有了这篇文章的补充························

另,此文章需要对android反编译逆向有一定基础,简单了解so的作用,有任何疑惑,可去群里和论坛或自行google搜索解决。



文章受www.pd521.com 站长邀请,也首发在其论坛。



请大家自己动手去练习!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!




---------------------------------------------分割线--------------------------------------------




在博客发了下,一堆图片,上传老麻烦了,这里留下文档。



排版看的不舒服的,直接看文档即可,相关附件地址:


链接:http://pan.baidu.com/s/1eQILJkI 密码:7kyr


或者直接看在此论坛的文章链接--------》


http://www.52pojie.cn/forum.php?mod=viewthread&tid=265667






其实此游戏还有很多方式去破解的,这里只是介绍一两种而已,大家可以自行补充~


版主请再看看怎么合并到那个帖子里面吧······


yuusha 发表于 2014-12-21 00:15

动态验证修改,支持!

抗么卑鄙讠 发表于 2014-12-19 18:41

收藏了不错的

小帥 发表于 2014-12-19 10:56

不错,大手

tsstss123 发表于 2014-12-21 12:07

技术文章~
来长知识了

bg7758 发表于 2014-12-21 10:01

学PHP的表示完全看不懂

214515047 发表于 2014-12-21 00:33

感谢分享 楼主辛苦了

暗之轮回 发表于 2014-12-20 23:58

威武。支持一下。正需要。希望继续更新后面的。强烈支持!

含蕊 发表于 2014-12-20 12:09

谢谢分享,支持一下

Night_Stalker 发表于 2014-12-20 10:58

教程很详细。值得学习

羅少 发表于 2014-12-19 09:52

前排来学习~   出售瓜子矿泉水~

蚯蚓翔龙 发表于 2014-12-19 09:57

前排围观

21882068 发表于 2014-12-19 10:01

围观一下!

Arlenhy 发表于 2014-12-19 10:02


前排围观

黑龍 发表于 2014-12-19 10:03

我去!卖瓜子了!跟着龟哥的脚步走!!!

Hmily 发表于 2014-12-19 10:04

鬼哥,上次那个crackme给发下啊。
另外我把帖子合并一起了,这个图怎么这么小,好不清晰,是上传论坛后的问题吗?我去后台看看能不能设置。

我有一只连营鹿 发表于 2014-12-19 10:10

自带小板凳来学姿势:loveliness:

听鬼哥说故事 发表于 2014-12-19 10:17

Hmily 发表于 2014-12-19 10:04
鬼哥,上次那个crackme给发下啊。
另外我把帖子合并一起了,这个图怎么这么小,好不清晰,是上传论坛后的 ...

待会儿我不忙的时候,再重写把word的文档整理一下发过来吧。
crackme好早了,就别发了。。。
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 【Android】跟着鬼哥学so修改