
android ndk
yunshouhu
爱Java,更爱Android,学VC,搞c/c++的我。专注移动安全,游戏安全,逆向安全!十年戎马成神路,君临天下风雷动! https://github.com/yunshouhu
展开
-
JNI 引用问题梳理
转自:https://blog.rinc.xyz/posts/151119-jni-reference/最近项目中有个视频文件分块上传的模块,核心逻辑是 C/C++ 实现的,Android 上层调用自然又要写 JNI。其中有个需求是 Native 层上传进度更新时需要回调 Java 代码,这里我用了 C++11 的 Lambda 表达式: std::function<vo...转载 2019-08-30 16:30:44 · 542 阅读 · 0 评论 -
android native hook方法
android native hook方法主要分为:GOT HOOK 即import table hook(导入表hook)inline hook(内联hook)export table hook (导出表hook) 一、导入表(GOT HOOK)熟悉ELF结构的读者都知道,SO引用外部函数的时候,在编译时会将外部函数的地址以Stub的形式存放在.GOT表中,加载原创 2016-06-08 01:25:47 · 8106 阅读 · 0 评论 -
Android Valgring检测Native内存泄漏
说明:Native内存泄漏 --- 泛指底层库文件中的代码存在的内存泄漏,在我们的项目里是指 NavSDK底层so文件中存在的内存泄漏 . Valgrind --- 一款开源的跨平台的支持多种语言的描绘和检测内存操作相关问题的监 测工具 , 在我们的项目目前只检测内存泄漏 ,内存操作错误以及调用堆栈 . 使用流程 --- 通过NDK交叉编译把Androi转载 2017-03-01 10:46:39 · 2009 阅读 · 0 评论 -
Android反调试笔记
转自:https://my.oschina.net/cve2015/blog/7343811)代码执行时间检测通过取系统时间,检测关键代码执行耗时,检测单步调试,类似函数有:time,gettimeofday,clock_gettime.也可以直接使用汇编指令RDTSC读取,但测试ARM64有兼容问题。time_t t1, t2;time (&t1);/* Parts转载 2016-12-29 23:46:16 · 1537 阅读 · 2 评论 -
ndk生成ARM汇编(附代码)
转自:http://www.cnblogs.com/bingghost/p/5838688.html使用ndk即可生成arm汇编1.首先写好hello.c#include int main(int argc, char const *argv[]){ int a=1024; printf("hello=%d\n", a); return 0;}2.编写m转载 2016-12-29 23:18:44 · 2568 阅读 · 1 评论 -
ARM-ELF文件格式与GNU ARM Linker机制
这里所说的ARM系统基本文件格式,都是在基于ARM的嵌入式系统开发中常会碰到的文件格式。 ARM系统基本文件格式有三种:1) BIN,平板式二进制格式,一般用于直接烧写到Flash中,也可以用于加载到monitor程序中。2) ELF,EXECUTABLE AND LINKABLE FORMAT,一种通用的OBJECT文件格式,一般由GNU COMPILER COLLECTION转载 2016-11-02 15:24:01 · 495 阅读 · 0 评论 -
android linker 浅析
Android 的加载/链接器linker 主要用于实现共享库的加载与链接。它支持应用程序对库函数的隐式和显式调用。对于隐式调用,应用程序的编译与静态库大致相同,只是在静态链接的时候通过--dynamic-linker /system/bin/linker 指定动态链接器,(该信息将被存放在ELF文件的.interp节中,内核执行目标映像文件前将通过该信息加载并运行相应的解释器程序linker.)转载 2016-11-02 15:12:25 · 2369 阅读 · 0 评论 -
arm汇编语言(android)调用C函数之参数传递
转自:http://blog.youkuaiyun.com/gooogleman/article/details/3538033arm汇编语言调用C函数之参数传递来源: ChinaUnix博客 日期: 2008.06.28 17:30 (共有0条评论) 我要评论 对于转载 2016-11-06 00:54:15 · 639 阅读 · 0 评论 -
windows下gdb与gdb_server调试Android的程序
手机服务端:启动方式: gdbserver:23946 + bin程序路径附加方式: gdbserver:23946+-attach [pid]PC客户端:D:\Android-ndk-r9\toolchains\arm-linux-androideabi-4.4.3\prebuilt\windows\bin\arm-linux-androideabi-转载 2016-11-03 15:27:48 · 1469 阅读 · 0 评论 -
android开发--- jni使用RegisterNatives注册本地方法
1. 以前在jni中写本地方法时,都会写成 Java_com_example_hellojni_HelloJni_stringFromJNI的形式,函数名很长,而且当类名变了的时候,函数名必须一个一个的改,麻烦。现在好了有了RegisterNatives,现在一片顶过去五片,蓝瓶的好喝的!2. hello-jni.c中#include #include #include #de转载 2016-09-06 11:21:48 · 1459 阅读 · 0 评论 -
如何压缩ndk的so库
压缩so的有效手段:不要启用 Exceptions 和 RTTI不要使用 iostream使用 -fvisibility=hidden使用 gc-sections 丢弃未使用的函数使用 –icf=safe 移除重复代码修改交叉编译工具链的默认标记位限制编译的ABI详情下面参考链接。参考文档: Android NDK: How to Reduce Binaries Siz转载 2017-03-25 18:22:33 · 1631 阅读 · 0 评论 -
如何快速定位native方法在对应so中的位置
转自:http://www.jianshu.com/p/03800b72a367前言在逆向的时候,有些应用有一大堆的so,而且都是提前加载好,有的so甚至做了处理,很难看出函数名。本文讲述的方法可以快速定位:native方法的实现在哪个so中在so中的哪个位置原理我们知道,在使用native方法之前,需要先load对应的so。 在load so的时候转载 2017-03-25 18:26:02 · 7216 阅读 · 2 评论 -
arm64-v8a汇编指令
转自:http://blog.sina.com.cn/s/blog_936739790102v6ny.htmlA64指令 提供同A32和T32指令类似的功能, 也提供如下新功能1)一个清晰的,固定长度的指令集: 指令是32位宽度, 寄存器字段(fields)是 在固定位置的 连续的位, 立即数 通常也是占用连续的位2) 更多通用寄存器(r0-r30), 每个寄存器长度扩展为64位。 通转载 2017-05-02 23:25:18 · 7140 阅读 · 0 评论 -
Android P 调用隐藏API限制原理
转自:https://mp.weixin.qq.com/s?__biz=MzUxMTcwOTM4Mg==&mid=2247483664&idx=1&sn=4f9f733d3caedf2829be703df8e69cd8&chksm=f96ed8b9ce1951aff1e598a9724b395de8b7d9ad7c1cb68ccb56cf828749eb44086a...转载 2019-04-18 22:01:59 · 1458 阅读 · 0 评论 -
解决Android加固多进程ptrace反调试的思路整理
转自:https://blog.youkuaiyun.com/QQ1084283172/article/details/53613481一、Android多进程反调试的原理代码当ptrace附加目标进程时出现失败,正常情况下有理由认为目标进程已经被别的进程ptrace附加了。像梆梆加固就是采用的这种反调试的手法,效果还是不错的。/*********************************...转载 2019-04-09 16:20:52 · 2541 阅读 · 2 评论 -
Android 加载 SO 库 UnsatisfiedLinkError 错误的原因及解决方案
转自:http://crash.163.com/#news/!newsId=4Android 加载 SO 库 UnsatisfiedLinkError 错误的原因及解决方案追风 发布于 2016-05-02 Android 应用开发者应该对 UnsatisfiedLinkError 这种类型的错误比较熟悉了,这个问题一直困扰着广大的开发者,那么有没有想过有可能你什么都没做错,也会出现这...转载 2018-08-24 18:35:20 · 708 阅读 · 0 评论 -
在Android平台上加载本地库的危险性
转自:https://www.youkuaiyun.com/article/2015-11-10/2826182-the-perils-of-loading-native-libraries-on-android摘要:本文作者Hilal Alsibai来自名为“KeepSafe”的创业团队。他们为了给Android应用加密,完全通过JNI来调用加密库。结果在用户使用应用后,由于本地库的缺失,应用不断报错。...转载 2018-08-24 18:33:59 · 268 阅读 · 0 评论 -
谈Android NDK C++ RTTI 分析
转自:http://crash.163.com/#news/!newsId=28本文意在说明Android NDK 在实现C++ RTTI时的相关数据结构,并从汇编角度分析其内存布局,以帮助理解RTTI的实现原理,同时,分析在逆向过程中如何利用RTTI恢复C++类名信息。 用ndk-build编译C++代码时,默认的C++运行时库(libstdc++)是不支持RTTI的, 需要在...转载 2018-08-24 18:08:03 · 387 阅读 · 0 评论 -
Android NDK编译选项设置
转自:http://crash.163.com/#news/!newsId=24在Android NDK开发中,有两个重要的文件:Android.mk和Application.mk,各尽其责,指导编译器如何编译程序,并决定编译结果是什么。本文将详细说明几个常见的NDK选项的配置,帮助大家理解相应的配置选项。 一、Application.mk Application...转载 2018-08-24 17:43:24 · 2713 阅读 · 0 评论 -
Android SO库文件头分析
转自:https://blog.micblo.com/2018/02/10/Android-SO%E5%BA%93%E6%96%87%E4%BB%B6%E5%A4%B4%E5%88%86%E6%9E%90/因为项目的需要,我对Android系统加载.so文件有一些些研究,把最近看过的一些大牛的分析和现状结合一下,写篇东西做一下笔记。.so 文件是什么.so 文件是 Shared Object 文件...转载 2018-07-03 15:28:32 · 9631 阅读 · 2 评论 -
linux使用读写锁pthread_rwlock_t
转自:https://blog.youkuaiyun.com/onlyou930/article/details/6755593使用读写锁配置读写锁的属性之后,即可初始化读写锁。以下函数用于初始化或销毁读写锁、锁定或解除锁定读写锁或尝试锁定读写锁。下表列出了本节中讨论的用来处理读写锁的函数。表 4–9 处理读写锁的例程操作相关函数说明初始化读写锁pthread_rwlock_init 语法读取读写锁中的锁pt...转载 2018-05-02 19:10:43 · 681 阅读 · 0 评论 -
VirtualApp沙盒基本原理
转自:http://rk700.github.io/2017/03/15/virtualapp-basic/VirtualApp是一个开源的Android App虚拟化引擎,允许在其中创建虚拟空间,并在这个虚拟空间中运行其他应用。通过阅读源码及动态调试,基本了解了其运行原理,在此记录。本质Android应用隔离是基于Linux系统的多用户机制实现的,即每个应用在安装转载 2017-05-03 23:33:16 · 29348 阅读 · 2 评论 -
基于HOOK的Anti-debug调用点trace和Anti-anti
转自:http://bbs.pediy.com/showthread.php?t=199671一、概述相信动态调试过SO的坛友对Anti并不陌生,比如读取/proc/self/status,/proc/self/task/xxx/status、stat文件查看状态TracePid和PPid,读取wchan查看进程等待,添加notify,模拟器检测等等。经过各种掉坑之后,虽然知道转载 2016-07-07 16:47:06 · 911 阅读 · 0 评论 -
NDK编译和使用静态库、动态库
默认所有代码和文件在$project/jni下,否则特殊说明。情况一:编译静态库文件Android.mk:LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := hello-jniLOCAL_SRC_FILES := hello-jni.cinclude $(BUILD_STAT转载 2016-07-07 10:18:06 · 930 阅读 · 0 评论 -
在 Eclipse 中使用 NDK
自定义 Eclipse使用 Eclipse IDE 的好处之一是很少需要编译。每次在 Eclipse IDE 中保存文件时,就会自动构建项目。这非常适用于 Android SDK(即 Java)文件和 Android XML 文件,但是对于 NDK 构建的库来说怎么样呢?我们来了解一下。扩展 Eclipse 环境如前所述,构建本地库和运行 ndk-build 命令一样简单。原创 2016-05-08 00:48:11 · 1287 阅读 · 0 评论 -
android ndk log使用demo
#ifndef _COMM_H_#define _COMM_H_#define DEBUG 1#if DEBUG#define TAG "yunshouhu"#include #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)#define LOGD(...) __android_log原创 2016-05-07 17:51:11 · 765 阅读 · 0 评论 -
VisualGDB 调试NDK程序
http://blog.youkuaiyun.com/dj0379/article/details/38637973. 下载并安装VisualGDB, 安装完成后,在Visual Studio的目录中可以看到Android选项:2. 配置VisualGDB, 在Android -> Setup SDK/NDK location主要配置JDK,SDK,原创 2016-05-06 21:17:21 · 1840 阅读 · 0 评论 -
浅谈Android系统开发中NDK LOG的使用
在程序开发过程中,LOG是广泛使用的用来记录程序执行过程的机制,它既可以用于程序调试,也可以用于产品运营中的事件记录。在Android系统中,提供了简单、便利的LOG机制,开发人员可以方便地使用。在这一篇文章中,我们简单介绍在Android内核空间和用户空间中LOG的使用和查看方法。 一. 内核开发时LOG的使用。Android内核是基于Linux Kerne 2.36的,因转载 2016-05-04 22:43:09 · 1032 阅读 · 0 评论 -
android NDK方式调用Jar包
package com.example.hellojni;public class SoTool { static { System.loadLibrary("hello-jni"); } /*参数说明:android JNI方式调用Jar包 * path1: jar存储路径 * path2: 经过优化后的dex存存放路径原创 2016-05-14 17:09:13 · 1985 阅读 · 0 评论 -
getopt源码支持getopt_long方法和win32下使用
GNU libc提供了getopt和getopt_long用于解析命令行参数,很好用,想在windows下使用,就google了几个win32下的C/C++写得getopt,并作了一些比较。程序里往往会有许多开关的,运行时就要传入许多参数值来打开或关闭这些开关。以前,每写一个程序就要花一些精力来写这段代码,因为是给自己用,就比较偷懒,写得很丑陋,时间长了,自己再回过头来用自己的东西原创 2016-05-14 11:04:55 · 4195 阅读 · 1 评论 -
用ndk-stack分析应用native程序异常crash掉
http://cmzx3444.iteye.com/blog/1463035这几天在做android下的音频播放器,使用ffmpeg做解码器,过程中出现一个问题,执行的时候出现下面这个问题: Java代码 03-24 15:05:37.094: I/DEBUG(3223): *** *** *** *** *** *** *** *** *** *** ***转载 2016-05-03 19:14:12 · 659 阅读 · 0 评论 -
针对lldb反调试技术
什么是lldblldb是llvm+clang工具链中的调试器,类似于gdb等,提供的可用命令和设计架构跟gdb略有不同。 一些反调试手段下面罗列的一些反调试手段均在OS X系统上编写的控制台程序中测试通过。(ios程序上不保证可用)严格划分的话,反调试实际上分为两种类型:检测和防治检测类型的给你提供检测到调试器后的转载 2016-05-13 18:50:56 · 1128 阅读 · 0 评论 -
android ndk调用Log.getStackTraceString(new Throwable())输出堆栈信息
//String str = Log.getStackTraceString(new Throwable()); //Log.d("yunshouhu", str); jclass jcl_Log = (*env)->FindClass(env, "android/util/Log"); jmethodID mid_getStackTraceString = (*env)->GetStat原创 2016-05-13 16:13:48 · 3843 阅读 · 0 评论 -
NDK C++线程中如何调用JAVA API
http://stackoverflow.com/questions/8530924/how-to-call-java-api-from-ndk-c-threadhttp://www.cnblogs.com/wanqieddy/p/4303531.html在NDK中创建的线程中, 只允许调用静态的Java API. 当在线程中调用env->FindClass(), 系统就会发出异常转载 2016-04-29 18:04:48 · 740 阅读 · 0 评论 -
Android.NDK入门
ndk入门通常在以下几种情况下考虑使用JNI:对处理速度有要求Java代码执行速度要比本地代码(C/C++)执行速度慢一些,如果对程序的执行速度有较高的要求,可以考虑使用C/C++编写代码,然后在通过Java代码调用基于C/C++编写的部分。硬件控制如前面所述,Java运行在虚拟机中,和真实运行的物理硬件之间是相互隔离的,通常我们使用本地代码C实现对硬件驱动的控制,然后再通转载 2016-04-29 17:52:51 · 492 阅读 · 0 评论 -
JNI官方规范中文版——如何把一个JVM嵌入到本地程序中 native程序中加载jvm
http://blog.youkuaiyun.com/a345017062/article/details/8068936本章讲述如何把一个JVM嵌入到你的本地程序当中去。一个JVM可以看作就是一个本地库。本地程序可以链接这个库,然后通过“调用接口”(invocation interface)来加载JVM。实际上,JDK中标准的启动器也就是一段简单的链接了JVM的C代码。启动器解析命令、加载J转载 2016-05-08 01:02:04 · 1512 阅读 · 0 评论 -
NDK使用技巧、多线程调用注意、ndk中的工具使用
//NDK 使用技巧和多线程调用注意//http://www.ibm.com/search/csass/search/?q=ndk&sn=dw&lang=zh&cc=CN&en=utf&hpp=20&dws=cndw&lo=zhvoid demo(JNIEnv* env, jobject thiz) { //这JNI接口指针可以存储,但只在当前线程仍然是有效的。 /* A JNI en原创 2016-05-08 00:33:59 · 6236 阅读 · 0 评论 -
加密SO文件中自定义的section
http://0nly3nd.sinaapp.com/?p=695前言加密已知so文件中的某一section,在运行时解密。执行里面的代码!0×1libsyc.so里有一个.textsection,里面有一个方法返回一个字符串!生成未加密的libsyc.so的代码:转载 2016-05-19 18:36:45 · 1690 阅读 · 3 评论 -
我的Android进阶之旅------>Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题
其他:java.lang.UnsatisfiedLinkError:dlopen failed: “**/*/arm/*.so” has unexpected e_machine: 3原因分析apk安装时,系统把armeabi下的libBugly.so放入应用的私有目录中了!但这个libBugly.so不是arm的,而是x86编译的libBugly.so运行时,系统检察ELF文件中的e_m转载 2016-06-17 13:37:28 · 27329 阅读 · 2 评论 -
ARM中的常用指令
http://blog.chinaunix.net/uid-22915173-id-225005.htmlARM中的常用指令含义ADD 加指令SUB 减指令STR 把寄存器内容存到栈上去LDR 把栈上内容载入一寄存器中.W 是一个可选的指令宽度说明符。它不会影响为此指令的行为,它只是确保生成 32 位指令。Infocenter.arm.c原创 2016-06-06 22:06:41 · 3438 阅读 · 0 评论