吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 149385|回复: 212
收起左侧

[Android 原创] 【Android】跟着鬼哥学so修改

    [复制链接]
听鬼哥说故事 发表于 2014-12-19 09:38
本帖最后由 听鬼哥说故事 于 2014-12-23 13:14 编辑

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


图/文 听鬼哥说故事



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



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

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


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



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


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


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


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




1.png


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

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


2.png



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

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

3.png


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

4.png



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

5.png



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

6.png


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

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



7.png

0x4:编写c代码


8.png


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


9.png

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


10.png


0x5:生成so文件


11.png


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


0x6:android调用代码


12.png


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


13.png












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





点评

师傅威武。。一统江湖。  发表于 2014-12-19 11:35

免费评分

参与人数 35吾爱币 +2 热心值 +35 收起 理由
black90 + 1 + 1 我很赞同!
寒蝉鸣泣之时 + 1 + 1 谢谢@Thanks!
iceplumblossom + 1 用心讨论,共获提升!
Amanda小黑 + 1 我很赞同!
木天狼星 + 1 谢谢@Thanks!
wangxd + 1 我很赞同!
iamyrc + 1 鬼哥的教程通俗易懂~
暗夜∮孤星 + 1 热心回复!
zhuanshu721520 + 1 我很赞同!
k18556 + 1 已答复!
kidd_lee + 1 谢谢@Thanks!
caleb110 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
970883246 + 1 不是视频真的看不懂
linghucun + 1 热心回复!
POI + 1 我很赞同!
BattleCall + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
0立华奏0 + 1 我很赞同!
liuning670 + 1 虽然看不懂!但是感觉太牛逼啦!!!
rockymax + 1 深入浅出,雷锋
zlx2030 + 1 我很赞同!
yuday + 1 我很赞同!
708822504 + 1 我很赞同!
adq_cq + 1 热心回复!
frozenyihan + 1 我很赞同!
XhyEax + 1 不明觉厉!
sndncel + 1 牛X人物,支持一下
Chinawlcc + 1 点赞
qtfreet00 + 1 谢谢@Thanks!
Godream + 1 怒赞
wbzzfljf168 + 1 我很赞同!
山顶的一棵草 + 1 不明觉厉露个脸
逍遥枷锁 + 1 我很赞同!
Monitor + 1 顶你!!出系列教程不?
飞儿line + 1 谢谢@Thanks!
鬼魅丶幽怨魂 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 听鬼哥说故事 发表于 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下切换到工程根目录:


1.png


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



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



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




2.png

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

3.png


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

0x3:挂起IDA,进行分析

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


4.png

找到它的引用

5.png



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

6.png

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


7.png




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




8.png



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


9.png

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


10.png

然后我们可以看到:

11.png

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


12.png


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

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

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











相关附件地址:


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


 楼主| 听鬼哥说故事 发表于 2014-12-19 14:10
跟着鬼哥学so修改,三,作业篇

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


图片1.png


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


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


--------------------------------------------------------
下载地址:
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层关键点:


1.png


native层关键点:


2.png


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

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


3.png


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

4.png




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


5.png


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

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




[C] 纯文本查看 复制代码
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);  
  
  
}  





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


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




免费评分

参与人数 2热心值 +2 收起 理由
傲世V雄哥720 + 1 我很赞同!
吉子 + 1 牛逼的鬼哥。收我为徒吧。

查看全部评分

 楼主| 听鬼哥说故事 发表于 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给发下啊。
另外我把帖子合并一起了,这个图怎么这么小,好不清晰,是上传论坛后的问题吗?我去后台看看能不能设置。

免费评分

参与人数 1热心值 +1 收起 理由
skfxzxc + 1 我很赞同!

查看全部评分

我有一只连营鹿 发表于 2014-12-19 10:10
自带小板凳来学姿势
 楼主| 听鬼哥说故事 发表于 2014-12-19 10:17
Hmily 发表于 2014-12-19 10:04
鬼哥,上次那个crackme给发下啊。
另外我把帖子合并一起了,这个图怎么这么小,好不清晰,是上传论坛后的 ...

待会儿我不忙的时候,再重写把word的文档整理一下发过来吧。
crackme好早了,就别发了。。。

点评

赛后交流啊,那个安卓的就没被搞定,你现在出手给大家学习下吧!  详情 回复 发表于 2014-12-19 10:30

免费评分

参与人数 2热心值 +2 收起 理由
妖妖大人 + 1 我很赞同!
skfxzxc + 1 我很赞同!

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-23 21:07

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表