Android Native 程序逆向入门(一)—— Native 程序的启动流程
八月的太阳晒得黄黄的,谁说这世界不是黄金?小雀儿在树荫里打盹,孩子们在草地里打滚。八月的太阳晒得黄黄的,谁说这世界不是黄金?金黄的树林,金黄的草地,小雀们合奏着欢畅的清音:金黄的茅舍,金黄的麦屯,金黄是老农们的笑声。 —— 徐志摩·八月的太阳
ilocker:关注 Android 安全(新手) QQ: 2597294287
在生成 native 程序时,在链接阶段会传入一个链接脚本,在该脚本中指定了程序的入口函数。

可以看到,在默认的链接脚本 armelf_linux_eabi.x 中,入口函数指定为“_start”。
在 NDK 目录下搜索 ldscripts,所有的链接脚本都在该目录中。
_start 函数定义在 (libc 的 bionic 目录下) Crtbegin.c 中。

在 _start 中又调用了 __libc_init,并将 main 函数的地址作为参数传入。
再看 __libc_init 的源码 (在 libc 的 bionic 目录下的 Libc_init_static.cpp 文件中):

在 __libc_init 中先进行一些初始化工作,再调用 preinit_array、init_array,最后调用由参数 slingshot 传入的 main 函数。
上面的描述针对静态链接的程序,对于动态链接的程序还稍有不同。
对于动态链接 (在 gcc 命令行中指定 -Bdynamic),在生成的可执行文件的 .interp 中保存了程序解释器的文件路径,默认为“/system/bin/linker”。
当执行动态链接的程序时,系统会解析该 ELF 文件,并找到 .interp 中保存的程序解释器,也就是 android linker。然后先执行 linker,linker 会加载该程序的所依赖的一系列 so,并最后再调用该可执行程序。
linker 的入口函数 _start 不在 Crtbegin.c 中,而是在 linker 源码的 begin.S 文件中。

调用 __linker_init 函数完成 linker 的“自举”,并进行一些初始化工作,最后会返回原 native 程序的入口函数的地址 (从 native 程序的 ELF Header 中找到)。
mov pc, r0,跳转到 native 程序的入口函数 (_start) 去执行,接下来的执行过程与上面一样。_start 调用 __libc_init。动态链接程序的 __libc_init 定义在 Libc_init_dynamic.cpp 文件中 (静态链接程序的 __libc_init 定义在 Libc_init_static.cpp 文件中)。

看起来比静态链接程序的 __libc_init 简单点,因为一些初始化工作由 linker 完成了。
总结:静态链接与动态链接的 native 程序的入口函数都是 _start。动态链接的程序在执行 _start 之前,需要先由 linker 加载依赖库,并进行一些初始化工作。
学习资料: 《Android 软件安全与逆向分析》
Android Native 程序逆向入门(一)—— Native 程序的启动流程的更多相关文章
- Android进阶系列之源码分析Activity的启动流程
美女镇楼,辟邪! 源码,是一个程序猿前进路上一个大的而又不得不去翻越障碍,我讨厌源码,看着一大堆.5000多行,要看完得啥时候去了啊.不过做安卓的总有这一天,自从踏上这条不归路,我就认命了.好吧,我慢 ...
- Java程序员入门:Java程序员面试失败的5大原因
1 说得太少 尤其是那些开放式的问题,如"请介绍下你自己"或"请讲一下你曾经解决过的复杂问题".面试官会通过你对这些技术和非技术问题的回答来评估你的激情.他们也 ...
- CobaltStrike逆向学习系列(10):TeamServer 启动流程分析
这是[信安成长计划]的第 10 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 基本校验与解析 0x02 初始化 0x03 启动 Listeners 在之前的分析中,都是针对 Cob ...
- Android源代码解析之(十三)-->apk安装流程
转载请标明出处:一片枫叶的专栏 上一篇文章中给大家分析了一下android系统启动之后调用PackageManagerService服务并解析系统特定文件夹.解析apk文件并安装的过程,这个安装过程实 ...
- Android Native jni 编程入门
在某些情况下,java编程已经不能满足我们的需要,比如一个复杂的算法处理,这时候就需要用到jni(java native interface)技术: jni 其实就是java和c/cpp之间进行通信的 ...
- 从零学React Native之01创建第一个程序
本篇首发于简书 欢迎关注 上一篇文章是时候了解React Native了介绍了React Native.大家应该对React Native有个初步的认识. 接下来我们就可以初始化一个React Nat ...
- 让你的 Qt 桌面程序看上去更加 native(一共六篇)
<让你的 Qt 桌面程序看上去更加 native>是一个系列文章.在这个系列中,你将会了解到如何让你的 Qt 桌面应用程序看上去更加 native.这里,我假设你已经清楚如何使用 Qt 编 ...
- iOS程序员的React Native开发工具集
本文整理了React Native iOS开发过程中有用的工具.服务.测试.库以及网站等. 工具 你可以选择不同的开发环境:DECO.EXPO或者你可以使用Nuclide+Atom,目前我使用EXPO ...
- 不可或缺 Windows Native (25) - C++: windows app native, android app native, ios app native
[源码下载] 不可或缺 Windows Native (25) - C++: windows app native, android app native, ios app native 作者:web ...
随机推荐
- 2016读书List
2016年读书书单. 1. <华尔街漫步> + <战胜华尔街>+ <华尔街之狼> 2. <野蛮大陆> 3. <第三帝国的最后十四天> 4. ...
- 每天一命令 git stash
git stash 命令是用于保存当前进度的命令.该命令会保存当前工作区的改动.保存的改动是已经跟踪的文件的改动,对于未跟踪的改动stash是不会保存的. git stash 命令常用于分支切换的 ...
- linux常用命令之查阅文件
CAT cat – concatenate print files 连续的输出文件内容 用法 cat [-nbA] file 选项 -n line number 输出行号 -b line number ...
- Sequence.js 实现带有视差滚动特效的图片滑块
Sequence.js 功能齐全,除了能实现之前分享过的现代的图片滑动效果,还可以融合当前非常流行的视差滚动(Parallax Scrolling)效果.让多层背景以不同的速度移动,形成立体的运动效果 ...
- PHP 后台定时循环刷新某个页面 屏蔽apache意外停止
PHP 后台定时循环刷新某个页面 如果间隔时间过长的话 会出现apache自动停止的现象.出现的原因则是设置了 <IfModule mpm_winnt_module> ThreadsPe ...
- AngularJS 学习之路(1)
AngularJS 是一个 JS 框架,适用于以数据操作为主的 SPA (Single Page Application)应用. 不再是 "先查找元素在操作元素",所有操作都以 & ...
- CVE: 2014-6271、CVE: 2014-7169 Bash Specially-crafted Environment Variables Code Injection Vulnerability Analysis
目录 . 漏洞的起因 . 漏洞原理分析 . 漏洞的影响范围 . 漏洞的利用场景 . 漏洞的POC.测试方法 . 漏洞的修复Patch情况 . 如何避免此类漏洞继续出现 1. 漏洞的起因 为了理解这个漏 ...
- SharePoint 2013 列表关于大数据的测试
本文主要介绍SharePoint列表库的效率问题,一直以来以为阙值5k,超过会线性下降,需要分文件夹存放:或许这是之前版本的描述,但是2013版本通过测试,真心不是这么一回事儿. 下面,简单介绍下自己 ...
- 开通了个人微信公众号:slbGTD,准备把GTD相关的内容写成一本书
<Get Things Done>是一本书的名字,简称为GTD,中文书名为<搞定>,同时GTD也是一种时间管理.自我管理的系统性方法,既有让你办事更有效率的技巧,也有多个的视角 ...
- xmpp整理笔记:用户网络连接及好友的管理
xmpp中的用户连接模块包括用户的上线与下线信息展现,用户登录,用户的注册: 好友模块包括好友的添加,好友的删除,好友列表的展示. 在xmpp中 负责数据传输的类是xmppStream,开发的过程中, ...