八月的太阳晒得黄黄的,谁说这世界不是黄金?小雀儿在树荫里打盹,孩子们在草地里打滚。八月的太阳晒得黄黄的,谁说这世界不是黄金?金黄的树林,金黄的草地,小雀们合奏着欢畅的清音:金黄的茅舍,金黄的麦屯,金黄是老农们的笑声。 —— 徐志摩·八月的太阳

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 程序的启动流程的更多相关文章

  1. Android进阶系列之源码分析Activity的启动流程

    美女镇楼,辟邪! 源码,是一个程序猿前进路上一个大的而又不得不去翻越障碍,我讨厌源码,看着一大堆.5000多行,要看完得啥时候去了啊.不过做安卓的总有这一天,自从踏上这条不归路,我就认命了.好吧,我慢 ...

  2. Java程序员入门:Java程序员面试失败的5大原因

    1 说得太少 尤其是那些开放式的问题,如"请介绍下你自己"或"请讲一下你曾经解决过的复杂问题".面试官会通过你对这些技术和非技术问题的回答来评估你的激情.他们也 ...

  3. CobaltStrike逆向学习系列(10):TeamServer 启动流程分析

    这是[信安成长计划]的第 10 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 基本校验与解析 0x02 初始化 0x03 启动 Listeners 在之前的分析中,都是针对 Cob ...

  4. Android源代码解析之(十三)-->apk安装流程

    转载请标明出处:一片枫叶的专栏 上一篇文章中给大家分析了一下android系统启动之后调用PackageManagerService服务并解析系统特定文件夹.解析apk文件并安装的过程,这个安装过程实 ...

  5. Android Native jni 编程入门

    在某些情况下,java编程已经不能满足我们的需要,比如一个复杂的算法处理,这时候就需要用到jni(java native interface)技术: jni 其实就是java和c/cpp之间进行通信的 ...

  6. 从零学React Native之01创建第一个程序

    本篇首发于简书 欢迎关注 上一篇文章是时候了解React Native了介绍了React Native.大家应该对React Native有个初步的认识. 接下来我们就可以初始化一个React Nat ...

  7. 让你的 Qt 桌面程序看上去更加 native(一共六篇)

    <让你的 Qt 桌面程序看上去更加 native>是一个系列文章.在这个系列中,你将会了解到如何让你的 Qt 桌面应用程序看上去更加 native.这里,我假设你已经清楚如何使用 Qt 编 ...

  8. iOS程序员的React Native开发工具集

    本文整理了React Native iOS开发过程中有用的工具.服务.测试.库以及网站等. 工具 你可以选择不同的开发环境:DECO.EXPO或者你可以使用Nuclide+Atom,目前我使用EXPO ...

  9. 不可或缺 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 ...

随机推荐

  1. [小北De编程手记] : Lesson 06 玩转 xUnit.Net 之 定义自己的FactAttribute

    xUnit.Net本身提供了标记测试方法的标签Fact和Theory.在前面的文章<Lesson 02 玩转 xUnit.Net 之 基本UnitTest & 数据驱动>中,也对它 ...

  2. Git修改提交的用户名和Email

    git config --global user.name "Your Name" git config --global user.email you@example.com

  3. linux下使用taskset设置进程cpu绑定不起作用

    自从大规模使用了虚拟化之后,大流量时soft interrupt在某个cpu很高就是个严重的问题,最近一有时间就研究这个问题,如果网卡本身不支持多队列的话,有没有办法缓解这个问题. 一开始使用rps, ...

  4. JSON.stringify()和JOSN.parse()

    JSON.stringify()跟JSON.parse() 终于把这两个方法搞清楚了!!! JSON.tringify():把一个json数据转化成JSON string JSON.stringify ...

  5. WPF如何实现一款类似360安全卫士界面的程序?(共享源码!)

    以前学习Windows Form编程的时候,总感觉自己做的界面很丑,看到360安全卫士.迅雷等软件的UI设计都非常美观,心里总是憧憬着要是自己能实现这样的UI效果该多好!!!另一个困扰我的问题是,这个 ...

  6. 优秀的 HTML5 实战教程,提升你的综合开发能力

    HTML5 作为下一代网站开发技术,无论你是一个 Web 开发人员或者想探索新的平台的游戏开发者,都值得去研究.借助尖端功能,技术和 API,HTML5 允许你创建响应性.创新性.互动性以及令人惊叹的 ...

  7. 微信网页授权(OAuth2.0) PHP 源码简单实现

    提要: 1. 建议对OAuth2.0协议做一个学习. 2. 微信官方文档和微信官网工具要得到充分利用. 比较简单,直接帖源代码了.其中“xxxxxxxxxx”部分,是需要依据自己环境做替换的 /** ...

  8. .NET web开发之WebApi初试水

    前几天看了.NET的EF(Entity Framework),发现居然有这么先进的东西,只要操作几个类就可以完成数据库的增删查改,而且可以用数据库直接导出类(DB First).也可以用类来生成数据库 ...

  9. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q49-Q51)

    Question 49You are designing a SharePoint 2010 intranet site for a corporation. Your design must mee ...

  10. Ubuntu 16.04 LTS 安装配置 Nginx 1.10.0 Php7.0-FPM

    1. 安装Nginx,Php-7.0 ~$ sudo add-apt-repository ppa:nginx/stable ~$ sudo apt-get update ~$ sudo apt-ge ...