符号表

Java的消亡史

随声附和 提交于 2019-12-14 11:07:54
作为一名程序猿 ,我们每天都在写Code,但你真的了解它的生命周期么?今天就来简单聊下它的生命历程,说起一段Java Code,从出生到game over大体分这么几步:编译、类加载、运行、GC。 编译 Java语言的编译期其实是一段“不确定 ”的过程,因为可能是一个前端编译器把.java文件转变为.class文件的过程;也可能是指JVM的后端运行期编译器(JIT编译器)把字节码转变为机器码的过程;还可能是指使用静态提前编译器(AOT编译器)直接把.java文件编译成本地机器码的过程。但是在这里我们说的是第一类。也是符合我们大众对编译认知的。编译在这个时间段经历了哪些过程呢? 词法、语法分析 词法分析是将源代码的字符流转变为Token集合,而语法分析则是根据Token序列抽象构造语法树(AST)的过程,AST是一种用来描述程序代码语法结构的树形表示形式,语法树的每个节点都代表着程序代码中的一个语法结构,例如包、类型、修饰符、运算符、接口、返回值甚至代码注释都可以是一个语法结构。 填充符号表 完成了语法和词法分析之后,下一步就是填充符号表的过程,符号表中所登记的信息在编译的不同阶段都要用到。在这里延伸一下符号表的概念。符号表是什么呢?它是由一组符号地址和符号信息构成的表格,最简单的可以理解为哈希表的K-V值对的形式。为什么会用到符号表呢?符号表最早期的应用之一就是组织程序代码的信息

链接过程详解

橙三吉。 提交于 2019-12-11 05:39:26
一:链接的基本概念 链接(linking)是将各种代码和数据片段收集并组合成为一个单一文件的过程,这个文件可被加载(复制)到内存并执行。 链接可以执行于编译时,也可以执行于加载时,甚至执行于运行时。在现代系统中,链接是由叫做链接器(linker)的程序自动执行的。 为什么需要链接器呢?一切都是为了简单、为了方便!试想一下,一个巨大的工程有巨大的源文件,包含N多个模块,如果没有链接的存在,那么当你改动某个模块时,不得不重新编译整个工程,消耗巨大的时间和资源。而在链接器的帮助下,你只需要简单编译修改过的模块,之后重新链接生成可执行文件就OK了。 下面,我们将基于一个运行Linux的x86-64系统,详细讨论关于链接的各个方面。 二:从代码到可执行文件 考虑如下的一个c语言程序: code/link/main.c int sun(int *a, int n); int array[2] = {1, 2}; int main() { int val = sum(array, 2); return val; } code/link/sum.c int sum(int *a, int n) { int i, s = 0; for (i = 0; i < n; i++) s += a[i]; return s; } 从源文件到可执行文件需要哪几个步骤呢? 1:预处理器将C的源程序main

[转]安卓加固之so文件加固

心已入冬 提交于 2019-12-10 09:02:45
一、前言   最近在学习安卓加固方面的知识,看到了 jiangwei212 的博客,其中有对so文件加固的两篇文章通过节加密函数和通过hash段找到函数地址直接加密函数,感觉写的特别好,然后自己动手实践探索so加密,这里记录一下学习遇到的困难和所得吧,收获还是非常大的。 二、通过加密节的方式加密函数  1、加解密思路   加密:我们自己写一个Demo根据ELF文件格式,找到我们要加密的节,加密保存在ELF文件中   解密:这里有一个属性__attribute__((constructor)),这个属性使用的节优于main先执行,使我们解密有了可能。  2、实现流程   ①编写我们的native代码,在native中将要加密的函数置于一个节中,并将解密函数赋予__attribute__((constructor))属性     a.在函数申明后面加上 __attribute__((section(".mytext"))) ,将函数定义在我们自己的section中     b.我们需要编写一个解密函数,属性用__attribute((constructor))申明,这样就可以在在so被加载的时候,在main之前将我们的节解密。      然后使用ndk-build将native代码编译成so文件   ②编写加密程序(我这里使用VS2010)     a.解析so文件,找到

const与#define

眉间皱痕 提交于 2019-12-09 20:57:11
C++中const符号表原理图 const int a=10; 当遇见常量声明时,在符号表中放入常量 编译过程中若发现使用常量则直接以符号表中的值替换 编译过程中若发现对const使用了 entern或者&操作符 ,则给对应的常量分配存储空间。 key value a 10 结论: C语言中const变量是只读变量,有自己的存储空间 C++中的const常量 可能分配存储空间,也可能不分配存储空间 当const常量为全局,并且需要在其他文件中使用时;当使用&操作符取const常量的地址时-->分配存储空间 C++中的const常量类似于宏定义 const int c =5; ≈ #define c 5 C++中的const常量与宏定义不同 const常量是由编译器处理的,提供 类型检查和作用域检查 宏定义由预处理器处理,只是单纯的文本替换。 在函数fun中定义 const int a=10; #define b 10 则在fun函数之外,只可以使用b而不能使用a! 来源: oschina 链接: https://my.oschina.net/u/3749576/blog/1622293

PHP中函数的运行机制与实现原理

狂风中的少年 提交于 2019-12-09 20:12:23
PHP中函数的运行机制与实现原理 在任何语言中,函数都是最基本的组成单元。对于php的函数,它具有哪些特点?函数调用是怎么实现的?php函数的性能如何,有什么使用建议?本文将从原理出发进行分析结合实际的性能测试尝试对这些问题进行回答,在了解实现的同时更好的编写php程序。同时也会对一些常见的php函数进行介绍。 PHP函数的分类 在php中,横向划分的话,函数分为两大类:user function(内置函数)和internal function(内置函数)。前者就是用户在程序中自定义的一些函数和方法,后者则是php本身提供的各类库函数(比如sprintf、array_push等)。用户也可以通过扩展的方法来编写库函数,这个将在后面介绍。对于user function,又可以细分为function(函数)和method(类方法),本文中将就这三种函数分别进行分析和测试。 php函数的实现 一个php函数最终是如何执行,这个流程是怎么样的呢? 要回答这个问题,我们先来看看php代码的执行所经过的流程。 从上图可以看到,php实现了一个典型的动态语言执行过程:拿到一段代码后,经过词法解析、语法解析等阶段后,源程序会被翻译成一个个指令(opcodes),然后ZEND虚拟机顺次执行这些指令完成操作。Php本身是用c实现的,因此最终调用的也都是c的函数,实际上

Hook原理--逆向开发

蓝咒 提交于 2019-12-06 04:15:19
今天我们将继续讲解逆向开发工程另一个重要内容--Hook原理讲解。Hook,可以中文译为“挂钩”或者“钩子”,逆向开发中改变程序运行的一种技术。按照如下过程进行讲解 Hook概述 Hook技术方式 fishhook原理及实例 符号表查看函数名称 总结 一、Hook概述 在逆向开发中是指改变程序运行流程的技术,通过Hook可以让自己的代码运行在别人的程序中。需要了解其Hook原理,这样就能够对恶意代码攻击进行有效的防护。 二、Hook技术方式 2.1 Method Swizzle方式 Method Swizzle 上次已经讲到,是利用OC的Runtime的特性,去动态改变SEL(方法编号)与IMP(方法实现)的对应关系,达到OC方法调用流程更改的目的。也是主要用于OC方法。 2.2 Cydia Substrate方式 Cydia Substrate 原名叫做Mobile SubStrate,主要作用为针对C函数,OC函数以及函数的地址进行Hook操作。并且有个很大的优势,Cydia Substrate 并不是仅仅是针对iOS设计,Andriod一样也可以使用。 2.2.1 Cydia Substrate定义了一系列的函数和宏,底层调用了objc的runtime和fishHook来替代目标函数或者系统方法。 其中有两个函数 MSHookMessageEx主要用于OC方法 void

更新日志

独自空忆成欢 提交于 2019-12-06 03:27:43
中秋、十一长假归来,“满血复活”的我们做了 fir.im 和 BugHD 的优化更新:) BugHD 新增功能 1.iOS 客户端上线 BugHD iOS 客户端上线了,你可以随时随地查看应用崩溃状况。如果需要精确看到崩溃错误堆栈的代码行,可以在 BugHD 网站上传符号表版本。如何上传 iOS 符号表,请点击 这里 iOS 版 AppStore地址 Android 版 下载地址 2.BugHD 网站移动端适配 我们对 BugHD 网站进行了移动端适配,如果你发现任何 Bug,欢迎将详尽信息反馈到 dev at fir dot im . 3.cocapods 配置去掉版本号 过去在使用 cocapods 配置的方法导入 SDK 时 ,需要在项目 Podfile 添加以下代码:pod 'FIR.im'加版本号。在此次优化中,我们去掉了版本号,并保证每次都可以更新到 SDK 最新版本。需要在你项目的 Podfile 中添加以下代码: pod 'FIR.im' 然后执行 pod 安装命令: $ pod install 4.添加客户端下载页 BugHD 优化 1.上传符号表进度条显示 有用户反馈,当上传符号表时,页面上的“正在加载”进度条在地址栏上的显示不够明显,为此我们添加了新的进度条显示。 fir.im 新增 Eclipse 插件 拥有合适的 Eclipse

Python 学习笔记

断了今生、忘了曾经 提交于 2019-12-06 03:22:37
目录 Python 学习笔记 0 IDEA设置 1 Python 特点 2 Python 解释器 2.1 命令行常用输入 2.2 源文件的字符编码 2.3 清屏命令 2.4 python版本切换 3 Python 作为计算器使用 3.1 数字直接计算 3.2 字符串 3.3 列表 3.2 走向编程的第一步 4 流程控制工具 4.1 if 语句 4.2 for 语句 4.3 range() 函数 4.4 break 和 continue 语句,以及循环中的 else 子句 4.5 pass 语句 4.6 定义函数 4.7 函数定义的更多形式 4.8 文档字符串和函数标注 5 数据结构 5.1 列表的更多特性 5.2 del 语句 5.3 元组和序列 5.4 集合 5.5 字典 5.6 循环的技巧 5.7 深入条件控制 6 模块 7 输入输出 Python 学习笔记 0 IDEA设置 导入本地py文件时,模块下方出现红色波浪线时如何解决 进入设置,找到Console下的Python Console,勾选选项 “Add source roots to PYTHONPAT” 在当前项目程序目录右键单击,然后“Mark Directory as”为“Sources Root” 1 Python 特点 Python是一种解释型语言,不需要编译和链接。 Python程序的书写是紧凑而易读的。

Linux下显示运行时链接(运行时加载)

六月ゝ 毕业季﹏ 提交于 2019-12-05 14:56:10
目录 介绍 如何加载动态库 dlopen() 第一个参数: 被加载动态库的路径 第二个参数: flag表示函数符号的解析方式 dlopen 返回值 dlsym() 参数: 返回值 符号优先级 dlerror() dlclose() show code 内容学习自《 程序员的自我修养 链接装载与库》 如果只是想知道如何使用如何加载动态库和那4个函数的使用,可以直接从如何加载动态库开始看。 介绍 支持动态链接的系统往往都支持一种更加灵活的模块加载方式,叫做显式运行时链接(Explicit Run-time Linking),有时候也叫做运行时加载。也就是让程序自己在运行时控制加载指定的模块,并且可以在不需要该模块时将其卸载。从前面我们了解到的来看,如果动态链接器可以在运行时将共享模块装载进内存并且可以进行重定位等操作,那么这种运行时加载在理论上也是很容易实现的。而且一般的共享对象不需要进行任何修改就可以进行运行时装载,这种共享对象往往被叫做动态装载库(Dynamic Loading Library),其实本质上它跟一般的共享对象没什么区别,只是程序开发者使用它的角度不同。 这种运行时加载使得程序的模块组织变得很灵活,可以用来实现一些诸如插件、驱动等功能。当程序需要用到某个插件或者驱动的时候,才将相应的模块装载进来,而不需要从一开始就将他们全部装载进来,从而减少了程序启动时间和内存使用

crashlog解析-iOS

梦想的初衷 提交于 2019-12-05 06:34:49
Crashlog 解析 对于从事iOS移动端测试的同学来说,应用crash十分常见。对于必现crash,通过必现路径复现crash就能定位问题,但对于偶现crash、压力测试crash或者线上crash,就只能通过crashlog来分析,本文介绍iOS端crashlog解析的一些通用知识点。 (做个笔记,以百度地图为例并不适用所有) 1. Crashlog 获取方式 1.1 连接 Xcode 直接读取 crashlog Mac电脑安装Xcode开发平台,通过USB线连接手机与电脑,点击Xcode→Window→De vices and Simulators进入如下界面 (以Xcode9为例)。 图1.1 再点击View Device Logs,读取手机中的crashlog文件。 图1.2 找到对应时间点且process名称为对应app(比如百度地图为IphoneCom)的crashlog文件,右键导出即可。 图1.3 1.2 通过手机直接复制 如果是线上用户主动反馈的crash,那么可能就无法通过上述方式获取crashlog文件,可以让用户进入隐私→诊断与用量→诊断与用量数据查看本地crashlog(iOS10),找到对应时间点且process名称为对应app(比如百度地图为IphoneCom)的文件,并通过手动复制后发送给我们,然后保存成.crash文件。这里有几点需要说明: ①