【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
跟着鬼哥学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
跟着鬼哥学so修改,三,作业篇
作业:
通过前面两篇文章的学习,请自行分析此应用,将当前用户类型修改为Gold Vip 用户。
有两种以上的方式可以修改的,有兴趣的同学请进行分析,写一下分析记录,可另起文章发布其过程与思路。
明天或者后天,再发布一下分析过程,以及原代码,大家再对比学习一下即可。
--------------------------------------------------------
下载地址:
http://pan.baidu.com/s/1jG22HMY
跟着鬼哥学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);
}
其他分析方法还有几个,不过很少人来去做,就简单介绍这几个方法了。。
不知道怎么合并到原帖子中,版主大人看着弄吧。。
跟着鬼哥学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
其实此游戏还有很多方式去破解的,这里只是介绍一两种而已,大家可以自行补充~
版主请再看看怎么合并到那个帖子里面吧······
动态验证修改,支持! 收藏了不错的 不错,大手 技术文章~
来长知识了 学PHP的表示完全看不懂 感谢分享 楼主辛苦了 威武。支持一下。正需要。希望继续更新后面的。强烈支持! 谢谢分享,支持一下 教程很详细。值得学习 前排来学习~ 出售瓜子矿泉水~ 前排围观 围观一下!
前排围观 我去!卖瓜子了!跟着龟哥的脚步走!!! 鬼哥,上次那个crackme给发下啊。
另外我把帖子合并一起了,这个图怎么这么小,好不清晰,是上传论坛后的问题吗?我去后台看看能不能设置。
自带小板凳来学姿势:loveliness: Hmily 发表于 2014-12-19 10:04
鬼哥,上次那个crackme给发下啊。
另外我把帖子合并一起了,这个图怎么这么小,好不清晰,是上传论坛后的 ...
待会儿我不忙的时候,再重写把word的文档整理一下发过来吧。
crackme好早了,就别发了。。。