- 博客(331)
- 资源 (13)
- 收藏
- 关注

原创 Android Apk加壳原理分析
0x00 阅读本文前,建议读者首先阅读Android加壳原理,参考文章Android中的Apk的加固(加壳)原理解析和实现。如果没有看过这篇文章,本文理解起来比较困难。 0x01 下面我们来分析脱壳代码为什么要这样写,核心脱壳代码在ProxyApplication类里面,首先执行成员方法attachBaseContext,然后执行成员方法onCreate。 那么attach
2016-01-19 17:43:19
8022
1

原创 Android安全之旅系列博客导读
总结下近一年的学习经历,以中国的新年为节点。时间从2015年年后到今天,2015年年末。 1、重新学习了一遍《Linux内核源代码情景分析上下册》,毛德操著,并记录学习历程,写下了博客。 2、重新学习了一遍《Android系统源代码情景分析》,罗升阳著,并记录从开机启动到Home界面的展示整个流程。 3、学习了一个小型java虚拟机的源代码,并调试修改源代码中的错误,最后可以运行
2016-01-17 12:41:29
2944
2
原创 从ndk编译,说到so文件结构以及ida导入、导出函数
一、背景一直以来对ndk的编译链接所依赖的文件没有完成弄明白,还有ida的导入、导出函数与dynsym section之间的关系是什么?二、ndk编译所依赖的文件1、我们一般在Application.mk中指定所需要的平台版本和编译后so的架构。APP_PLATFORM := android-21APP_ABI := armeabi-v7a这个android-21对应什么呢?这是android ndk的根目录。这里指定的编译so时,链接时需要的so文件,如果指定了andro.
2020-10-11 15:56:45
2069
1
原创 extern C 透彻理解
一、背景一直以来对extern C的理解都停留在表面,只知道为了C/C++混合编程。今天来透彻理解下这个概念。二、整体的项目结构。jni ---Android.mkLOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := lesson2 LOCAL_SRC_FILES := Lesson2.cpp MyTest.cpp module.cLOCAL_LDLIBS :=..
2020-10-11 11:26:02
1084
1
原创 go routine channel select
package mainimport ( "fmt" "time")func worker(id int, c chan int) { for n := range c { time.Sleep(time.Second * 5) fmt.Printf("Worker %d received %c\n", id, n) }}func createWorker(...
2020-02-26 21:10:38
454
原创 golang 错误处理
一、deferpackage mainimport ( "fmt" "os" "bufio" "imooc.com/ccmouse/learngo/functional/fib")func tryDefer() { for i := 0; i < 100; i++ { defer fmt.Println(i) if i == 30 { // Unc...
2020-02-24 12:43:44
387
原创 golang 闭包 函数作为参数和返回值
一、闭包package mainimport ( "bufio" "fmt" "io" "strings" "learn/functional/fib")type intGen func() intfunc (g intGen) Read( p []byte) (n int, err error) { next := g() if next > 1000...
2020-02-24 12:42:21
2017
1
原创 golang 接口
一、目录结构mock ---mockretriever.goreal ---retriever.gomain.gomockretriever.gopackage mockimport "fmt"type Retriever struct { Contents string}func (r *Retriever) String() strin...
2020-02-24 12:40:51
182
原创 golang 数组 切片 Map rune
一、数组package mainimport "fmt"func printArray(arr [5]int) {//无法改变原值 arr[0] = 100 for i, v := range arr { //遍历数组 fmt.Println(i, v) }}func main() { var arr1 [5]int arr2 := [3]int{1, 3, 5}...
2020-02-23 20:48:41
652
原创 golang 基本语法
一、变量定义package mainimport ( "fmt" "math" "math/cmplx")var ( aa = 3 ss = "kkk" bb = true)func variableZeroValue() { var a int var s string fmt.Printf("%d %q\n", a, s)}func variabl...
2020-02-23 19:54:59
339
原创 golang 面向对象 包管理
一、包管理1、GOPATH ---bin ---pkg ---src ---learn ---entry.go(package main) ---tree ...
2020-02-23 17:50:30
368
原创 C++ shared_ptr week_ptr unique_ptr
一、shared_ptrmain.cpp#include <iostream>using namespace std;int main(){ shared_ptr<int> myp(new int(100)); shared_ptr<int> myp1(myp); myp = nullptr;//效果同reset一样 //myp.re...
2020-02-13 19:49:40
665
原创 C++ 左值 右值 移动构造函数 移动赋值运算符
一、左值、右值、左值引用&、右值引用&&main.cpp#include <iostream>using namespace std;int main(){ string str = "I love china"; const char *p = str.c_str(); cout << (void*)p << e...
2020-02-13 19:34:16
1179
原创 C++ lambda表达式
一、lambda函数main.cpp#include <iostream>#include "template.h"using namespace std;int main(){ auto f5 = [](int a) ->int { return a + 1; }; f5(1); vector<int> myvector...
2020-02-07 19:38:24
258
原创 C++ std::funtion 可调用函数 std::bind
一、std::funtiontemplate.h#pragma once#include <iostream>#include <map>#include <functional>class RC{public: void operator()(int tv) { std::cout << "RC operator:"...
2020-02-07 11:58:04
276
原创 C++ decltype用法
一、decltypedecltype用于推断类型template.h#pragma once#include <iostream>#include <map>template<typename T>class CT2{public: //typename T::iterator iter; decltype(T().begin()...
2020-02-07 10:27:58
1023
原创 C++ 可变参函数模板 可变参类模板 模板模板参数
一、可变参函数模板template.h#pragma once#include <iostream>#include <map>void myfunct2(){ std::cout << "终止调用" << std::endl;}template <typename T, typename...U>void ...
2020-02-07 08:08:45
435
原创 C++ 类模板、函数模板全特化、偏特化
一、类模板全特化、偏特化#pragma once#include <iostream>#include <map>template <typename T, typename U>class TC{public: TC() { std::cout << "泛化版本构造函数" << std::endl; }...
2020-02-06 20:44:06
4062
原创 C++ using新用法、类成员指针
一、using新用法template.h#pragma once#include <iostream>#include <map>template <typename wt>struct map_s{ typedef std::map<std::string, wt> type;};//C++11template &l...
2020-02-06 19:40:02
1014
原创 C++ 函数模板、类模板、类成员函数模板
一、函数模板template.h#pragma once#include <iostream>#include <map>template <typename T>T funcadd(T a, T b){ T addhe = a + b; return addhe;}template <typename T, int a, ...
2020-02-06 19:04:10
1275
原创 C++ const用法总结
一、const描述常量const int a = 100;//a不可以改变二、const描述引用int a = 10;const int& b = a;//b不可以改变a的值const int a = 10;const int & b = a;//只能用const int&类型引用三、const描述指针#include <iostre...
2020-02-06 11:28:53
278
原创 浅谈桌面启动一个应用Activity
startActivity 1、Launcher进程 Handler机制在主线程循环处理消息,在onCreate时调用了startActivity,通过Binder进程间通信机制发送了START_ACTIVITY_TRANSATION。 START_ACTIVITY_TRANSATION:异步请求,发送完Launcher进程睡觉等待在主线程。 2、SystemServer
2017-07-29 17:41:27
811
原创 Binder进程间通信二次总结
0x00 从进程的角度来看Android系统启动 0x01 一次同步Binder进程间通信 Client:处理从Binder Driver返回的命令status_t IPCThreadState::waitForResponse(Parcel *reply, status_t *acquireResult){ int32_t cmd; int32_t err;
2017-07-29 10:48:07
961
原创 Linux进程与线程及其他知识点拾遗
0x00进程与线程的区别 进程和线程都是由父进程创建出来了,区别在于是否共享页表和页目录表。 进程是通过系统调用fork来创建的。使用全新的页表和页目录表,实行copy_on_write策略。asmlinkage int sys_fork(struct pt_regs regs) { return do_fork(SIGCHLD, regs.esp, ®s, 0)
2017-07-08 17:06:52
1105
原创 Linux内核页面换入换出
0x00内存页面分类与换入换出规则 内存页面分为用户页面和内核页面。 用户页面有以下几种: 1、普通的用户空间页面,包括进程的代码段、数据段、堆栈段、以及动态分配的存储堆。 2、通过系统调用mmap()映射到用户空间的已打开文件的内容。 这些页面既涉及分配、使用和回收,也涉及页面的换出/换入。 内核页面有以下几种: 1、kmalloc分配用作某些临时性的数
2017-07-08 11:51:40
4202
原创 Android SO逆向-C++虚函数表解析
0x00 一般继承(无虚函数覆盖)class Base {public: Base() { ALOGD("Base ..."); } virtual void f() { ALOGD("Base::f"); } void g() { ALOGD("Base::g"); } virtual void h() { ALOGD("Base::h"); } virtual ~Base
2017-01-12 09:21:28
1962
原创 AndroidManifest文件格式、Resource.arsc文件格式解析与混淆
0x01 AndroidManifest文件格式解析 1.1 文件格式解析 我们就不重新造车轮子了,参考Android逆向之旅---解析编译之后的AndroidManifest文件格式。 提示下,在看这篇文章时,大家最好下载了010editor,并且下载了解析AndroidManifest文件的模板AndroidManifestTemplate.bt,这样可以帮助我们更加清晰的理
2016-09-24 17:08:26
4437
原创 反编译利器Apktool和Dex2jar导入源码以及编译调试
0x00 Apktool源码下载与导入 0.1 apktool源码下载 地址:https://github.com/iBotPeaches/Apktool。 0.2 导入 打开Android Studio,选择Open an existing Android Studio project,选择Apktool文件夹导入。 0x01 编译并调试Apktool源码 1.
2016-09-20 21:30:21
3808
原创 Android SO 加载分析与导入表Hook、导出表Hook
0x00 参考文章 关于so加载分析,就是从System.loadlibrary开始的,层层玻璃代码真相,在Android SO 加壳(加密)与脱壳思路,我们说ELF Header中的一些字段是无用的,Section Header也是无用的,这是为什么呢? 答案是在so加载的过程中,没有使用的,有关Android so加载深入分析,请参考这篇pdf,http://download.cs
2016-08-16 08:55:40
4215
原创 Android NDK中C++ STL库动态和静态链接
0x00 本文参考 本文参考Android NDK中C++运行时库介绍。 我们在开发NDK的时候,经常需要使用C++ STL库开发,那么这些库是如何和我们的程序链接的呢? 0x01 C++ STL分类 这些静态链接库和动态链接库都位于哪呢? 答案是位于ndkpat/sources/cxx-stl。我们截图看下这个目录: 我们可以清晰的对照两张图。libstlpo
2016-08-15 22:33:28
15628
原创 Anti-Debugging Skills In APK
0x00 本文参考 本文主要是参考Anti-Debugging Skills In APK ,请读者先阅读此文,本文只是对其中的难点进行讲解和说明。 0x01 ida调试so原理 要理解反调试原理,首先要理解调试原理。有关如何使用ida调试so,请参考ida动态调试so,在init_array和JNI_ONLOAD处下断点。 几个关键的步骤,说明下原理: 1.1 在手机
2016-08-15 20:32:22
2098
原创 Android SO 加壳(加密)与脱壳思路
0x01 常见的Android SO加壳(加密)思路 1.1 破坏Elf Header 将Elf32_Ehdr 中的e_shoff, e_shnum, e_shstrndx, e_shentsize字段处理,变为无效值。由于在链接过程中,这些字段是无用的,所以可以随意修改,这会导致ida打不开这个so文件。 1.2 删除Section Header ...
2016-08-14 17:56:23
20276
1
原创 Android PLT/GOT 符号重定向过程
0x00 项目工程 项目地址:http://download.youkuaiyun.com/detail/jltxgcy/9602851。 下面列出核心代码:#include "com_example_ndkplt_PLTUtils.h"#include #include #include #include #define LOG_TAG "PLTUtils"#define ALOGD
2016-08-14 15:45:14
2935
原创 Android SO 文件结构及readelf命令
0x00 Android SO 文件结构 so文件结构详细的分析,请看Android逆向之旅---SO(ELF)文件格式详解,这里就不重复造车轮子了。 我们待分析的so已经上传到csdn,下载地址:http://download.youkuaiyun.com/detail/jltxgcy/9602803。 0x01 readelf命令 1.1 so文件整体图 1.2 reade
2016-08-14 10:51:40
7631
原创 Inject Zygote and Hook Native Method(过反调试,过防dump)
0x00 进程注入 通过ptrace机制,调用目标进程的dlopen来加载我们的so,实现进程注入。 这部分知识在Android中的so注入(inject)和挂钩(hook) - For both x86 and arm,有详细的解释,请读者先阅读这篇文章。 那么被注入的进程是如何返回到我们的进程中呢?答案在regs->ARM_lr = 0。具体的分析请参考Android注入完全
2016-08-13 21:06:22
5982
原创 Android Inline Hook
0x00 Android Inline Hook Inline Hook即内部跳转Hook,通过替换函数开始处的指令为跳转指令,使得原函数跳转到自己的函数,通常还会保留原函数的调用接口。与GOT表Hook相比,Inline Hook具有更广泛的适用性,几乎可以Hook任何函数,不过其实现更为复杂,考虑的情况更多,并且无法对一些太短的函数Hook。 项目代码:https://github
2016-08-13 17:58:29
4441
原创 Android SO ARM及Thumb2指令集
0x01 ARM寄存器 1.1 通用寄存器 1.未分组寄存器:R0~R7 2.分组寄存器:R8~812 R13:SP,常用作堆栈指针,始终指向堆栈的顶部,当一个数据(32位)推入堆栈时,SP(R13的值减4)向下浮动指向下一个地址,即新的栈顶,当数据从堆栈中弹出时,SP(R13的值加4)向上浮动指向新的栈顶。 R14:连接寄存器(LR),当执行BL子程序调用指令时,R
2016-08-13 10:06:36
3526
原创 C语言字符串处理及内存管理函数
0x00 这一节,我们介绍下常用的C语言字符串处理函数和内存管理函数。 0x01 字符串处理函数: strstr:返回字符串中首次出现子串的地址 详解地址:http://c.biancheng.net/cpp/html/174.html。 strchr:查找某字符在字符串中首次出现的位置 详解地址:http://c.biancheng.net/cpp/ht
2016-08-12 21:12:55
1098
原创 Linux系统编程-管道与文件
0x00 管道经常用于进程间通信,进程间通过管道的读端和写端进程通信。 我们介绍一个比较简单的例子。int main(int argc, char *argv[]){ int pipefd[2]; if (pipe(pipefd) == -1) ERR_EXIT("pipe error"); pid_t pid; pid = fork(); if (pid == -1
2016-08-06 18:14:31
1022
原创 Linux系统编程-信号
0x00 信号和中断类似,中断是硬件发出,而信号由软件发出。 信号常用于进程间通信,一个信号常见的处理如下: 1、设置对应信号的信号处理函数。 2、当信号来临时,打断正常执行的程序(本质上是在系统调用前检查是否有信号的到来),去执行信号处理函数。 3、信号处理函数执行完,继续执行原程序。 0x01 我们先来看一下linux中一共支持多少种信号。使用命令ki
2016-08-06 17:17:24
725
压缩SDK demo
2014-08-01
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人