吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 46078|回复: 80
上一主题 下一主题
收起左侧

[Android 原创] 《教我兄弟学Android逆向06 用AndroidStudio编写第一个so》

  [复制链接]
跳转到指定楼层
楼主
会飞的丑小鸭 发表于 2018-3-8 15:55 回帖奖励
本帖最后由 会飞的丑小鸭 于 2018-4-28 13:52 编辑



上一篇 教我兄弟学Android逆向05 在smali代码中插入Log》我教会了你随心所欲的在smali代码中插入log,你也很认真的学习了,那么这节课我将带你走进so的世界,这时你有一些疑问,经常听比人说soso的那么so到底是什么呢?我是来学破解技术的啊为什么这节课要让我编写so?
先看一下下面的介绍:
Android开发中,我们经常会用到.so文件。原因有很多,比如部分方法不想暴露,如加密规则。比如部分秘钥需要存储,哪怕最简单的一个String我们使用.so调用获取这个String,也比直接明文写在代码中要来的安全。那么逆向破解也是一样,你要破解一个so就得先学习这个so是怎么编写的 为了避免以后破解so时知其然而不知其所以然 所以今天我为你带来了这篇教程。

那么今天的主线是:如何用AndroidStudio编写一个so并在java层调用so中的方法?

带着这条主线 我将开始今天的教程 下面要认真听课了!
一. 打开AndroidStudio 新建一个类,声明native方法。这个类是java与C/C++交互的中介,方法由java声明,由C/C++实现。






[Java] 纯文本查看 复制代码
public class myJNI {
  //加载so库
    static {
        System.loadLibrary("JniTest");
    }
  //native方法
    public static native String sayHello();
}


二.打开android studio终端,使用javac编译上述文件,生成class文件。
1.打开myJNI类所在的目录,并复制路径




2.找到AndroidStudio最底部的Terminal打开命令行 输入命令cd+自己刚刚复制的目录(如果底部没有Terminal 按住快捷键alt+f2也能调出来)


3.使用javac编译上述文件,生成class文件。


4.确认自己的包名和类名!然后在java目录使用 javah -jni 包名.类名 命令生成.h头文件 然后就能看到生成了一个h文件。 注意一定要在java层目录下输入命令,不然不会报错:找不到xxx类  






三. 新建一个jni文件夹,新建main.c,把.h里面的内容复制进去,并实现里面的函数。
1. 新建一个jni文件夹


2.新建main.c




3.生成的h文件
[C] 纯文本查看 复制代码
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_jwxdxnx06_myJNI */

#ifndef _Included_com_jwxdxnx06_myJNI
#define _Included_com_jwxdxnx06_myJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_jwxdxnx06_myJNI
* Method: sayHello
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_jwxdxnx06_myJNI_sayHello
(JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif


拷贝修改后的main.c
[C] 纯文本查看 复制代码
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_jwxdxnx06_myJNI */

#ifndef _Included_com_jwxdxnx06_myJNI
#define _Included_com_jwxdxnx06_myJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_jwxdxnx06_myJNI
* Method: sayHello
* Signature: ()Ljava/lang/String;
*/
//就实现了个函数 JNIEnv的用法可以自行百度,这里就不展开了
JNIEXPORT jstring JNICALL Java_com_jwxdxnx06_myJNI_sayHello(JNIEnv *env, jclass jobj)
{
//返回一句话
return (*env)->NewStringUTF(env,"hello 52pojie!");
}

#ifdef __cplusplus
}
#endif
#endif


4.还要在jni文件夹下添加一个空白的util.c文件,不然会报错,我也不知道为什么。


5、配置NDK打开Project的local.properties文件添加NDK路径 ndk下载链接:https://pan.baidu.com/s/1K0yDiJsn4cI0k1Bnpv920A 密码:hj4o


6.打开app Module的build.gradle文件,在defaultConfig节点里添加以下代码 注意这里的moduleName,是我们在之前自己编写的类里面加载的so库名
[Java] 纯文本查看 复制代码
ndk {
moduleName "JniTest"
ldLibs "log", "z", "m"
abiFilters "armeabi", "armeabi-v7a", "x86"
}



7.还要在gradle.properties里面加上这么一句话:
android.useDeprecatedNdk=true


四. 生成SO库
1.完成以上步骤之后,我们rebuild一下就可以生成so库了 生成的so在项目的app\build\intermediates\ndk\debug\lib路径下





五.配置so库
在src\main下新建文件夹jniLIB,并将生成的SO文件拷贝到该文件夹下





六.打开MainActivity.java插入一条log来调用so中的sayHello方法,并连接手机调试






七.总结
本节课带你编写了第一个so文件,并在java层调用了so中的sayHello方法,学习完本节课相信你已经对so有了初步的了解,本节课的例子自己一定要跟着做一遍 ,对本节课教程中不懂得有疑问的,自己一定要去百度 。完成本节课的例子后,记得做课后作业。

课后作业:
编写so并在里面实现一个加法的功能
最终效果:java层调用so中的Add方法,传入两个参数22和30,通过log显示出来52, 记住不懂的百度。


本节课所用到的AndroidStudio项目和生成的Apk:
链接:https://pan.baidu.com/s/12n3QnoRQK01LdG0oFVqTIQ 密码:ndef

本节课参考:https://www.cnblogs.com/wzben/p/5733571.html



下一篇:教我兄弟学Android逆向07 IDA破解第一个so









点评

.h文件无法生成参照此贴https://blog.csdn.net/ezconn/article/details/82352531  发表于 2019-3-14 13:12

免费评分

参与人数 31吾爱币 +39 热心值 +31 收起 理由
iamyrc + 1 + 1 用心讨论,共获提升!
Crdsa + 1 + 1 热心回复!
邓啸宇 + 1 + 1 谢谢@Thanks!
stevencaptain + 1 + 1 用心讨论,共获提升!
52pojie61022109 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
7353401 + 1 + 1 我很赞同!
renhang + 1 + 1 谢谢@Thanks!
cr7890 + 1 + 1 谢谢@Thanks!
Toosan + 1 + 1 热心回复!
Woodmon + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
IThink + 1 + 1 谢谢@Thanks!
zhang53000 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
文远张辽 + 1 + 1 谢谢@Thanks!
lianwuqj + 1 + 1 热心回复!
羽落星寒 + 1 + 1 谢谢@Thanks!
雨木 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
coolu + 1 + 1 谢谢@Thanks!
夏雨微凉 + 2 + 1 谢谢@Thanks!
帅哥没人陪 + 1 + 1 谢谢@Thanks!
妖邪有泪 + 1 + 1 谢谢@Thanks!
afcapp + 1 + 1 谢谢@Thanks!
shanhuyi + 1 + 1 谢谢@Thanks!
qtfreet00 + 6 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Seay + 1 + 1 我很赞同!
呵呵哒三毛 + 1 + 1 用心讨论,共获提升!
sunnylds7 + 1 + 1 谢谢@Thanks!
笙若 + 1 + 1 谢谢@Thanks!
qaz003 + 3 + 1 谢谢@Thanks!
xwzj20170829 + 1 + 1 谢谢@Thanks!
Lewtq + 1 + 1 我很赞同!
Tears丶残阳 + 1 + 1 热心回复!

查看全部评分

本帖被以下淘专辑推荐:

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

来自 60#
Se8s0n 发表于 2019-1-9 16:31
在NDK17版本,楼主的步骤里面可能有一点点要修改的
生成main.c之后,打开app/Module目录下的build.gradle文件,在defaultConfig节点里添加以下代码
[Java] 纯文本查看 复制代码
ndk {
moduleName "JniTest"
ldLibs "log", "z", "m"
abiFilters "armeabi-v7a", "x86"
}


因为我在尝试的时候,发现产生了“Process 'command 'D:\SDK\ndk-bundle/ndk-build.cmd'' finished with non-zero exit value 2”的报错,
只有去掉了"armeabi",才能正常执行。
原因是“ABI "armeabi" is deprecated in r16 and will be removed in r17.”

然后关于为什么一定要添加util.c的文件,我想应该是它也是生成main.c文件初始化要用到的文件之一吧,虽然我还没有探究过。

上面算是学习笔记之类的东西,谢谢楼主!
推荐
江南小虫虫 发表于 2019-10-7 15:21
本人用的是android studio 3.5.1, 这个教程已经不适用了... ... 所以自己动手搞了一下, 有需要可以去看看: https://blog.csdn.net/A807296772/article/details/102298970
推荐
iamyrc 发表于 2018-11-1 10:34
gradle3.0以上弃用”android.deprecatedNdkCompileLease = 1512283120054“这种用法了,可以用CMake+LLDB生成so。具体写法见这个blog -> https://www.jianshu.com/p/997ae19a5fae
沙发
Tears丶残阳 发表于 2018-3-8 16:34
前排~!周末试试~!
3#
Lewtq 发表于 2018-3-8 16:39
感谢楼主,学起来!
4#
夏雨微凉 发表于 2018-3-8 17:04 来自手机
楼主终于又开始了,支持
5#
zhaotianrun 发表于 2018-3-8 17:04
好厉害,果然是安卓的好文章
6#
日暮途远 发表于 2018-3-8 17:18
支持,对NDK开发这块不是太了解,借此文章进行学习,感谢分享!
7#
xwzj20170829 发表于 2018-3-8 17:52
楼主现在用的什么版本AS 2.2.3?
我之前用的是2.2.3现在卸载后装了3.0的出现很多问题
你还是用2.2.3的话我就重装2.2.3的了
8#
kk1212 发表于 2018-3-8 18:04
路过学习一下 ,so库文件编好之后一般是要加个混淆避免被破解
9#
 楼主| 会飞的丑小鸭 发表于 2018-3-8 18:12 |楼主
xwzj20170829 发表于 2018-3-8 17:52
楼主现在用的什么版本AS 2.2.3?
我之前用的是2.2.3现在卸载后装了3.0的出现很多问题
你还是用2.2.3的话我 ...

是的As更新后会出现很多问题  所以我一直在用2.2.3 没有更新
10#
debug_cat 发表于 2018-3-8 19:34 来自手机
学习啦,非常感谢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

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

GMT+8, 2024-4-25 09:05

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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