ELF头部的结构体为 elf32_hdr 或 elf64_hdr, 在Android系统源代码的 /bionic/libc/kernel/uapi/linux/elf.h 可以找到。...e_phoff Offset: 0x1C Length: 4 (32bits) Type: unsigned int 程序头表的偏移,涉及“连接视图”和“执行视图”。...e_phnum Offset: 0x2C Length: 2 Type: unsigned short 在执行视图中,Segments的数量。...Android 系统对其进行检测,并且严格到实际的数目。...作者的话 个人喜欢计算机技术,主要涉及的领域包括:Android系统,Linux内核,嵌入式软/硬件,机器人和智能硬件。同时也对其他的各个技术栈都感兴趣。
楔子 继续Linux Kernel内核态加载elf main入口调看 类同 elf文件实际上就类似于windows上的exe文件。...注意 注意下elf的入口其实是_start函数,linux kernel在设置调用main函数入口的时候实际上是设置的rip(new_ip)为_start入口,此处为:0x4016b0。...new_sp=0x00007ffcb46c7560,看下它内存是啥 可以看到它确实是:0x0000000000000001。...那么这个很明显的就在于,当CPU从内核态切换到用户态的时候,直接跳转到用户态的RIP所在的地址,也就是elf函数_start地址,同时设置了RSP的值。...结尾 到这里elf大致上有个了解了,后面继续看下其它方面的。 作者:江湖评谈
public class Demo { public static void foo() { int a = 1; int b = 2; int c...class、dex、odex、ELF相爱相杀 从执行文件上面进行分析的话,JVM 对应 class 文件,Dalivk 对应 odex 文件,而 ART 对应 oat 文件。...但是为了每次启动时都去掉从字节码到机器码的编译过程,Google 又从 Dalivk 中优化出了 ART,在其安装应用的时候将 dex 文件进行预处理生成可执行的 oat 文件。...第一次开机就会生成在 /system/app//oat/ 下 在系统运行过程中,虚拟机将其 从 /system/app 下 copy 到 /data/davilk-cache/...第一次开机就会生成在 /system/app//oat/ 下; 在系统运行过程中,虚拟机将其 从 /system/app 下 copy 到 /data/davilk-cache
我们已经从Linux进程基础中了解了进程。现在我们看一下从程序到进程的漫漫征程。 一段程序 下面是一个简单的C程序,假设该程序已经编译好,生成可执行文件vamei.exe。...当然,还可以是C++,Java,Objective-C等等。选用C语言的原因是:它是为UNIX而生的语言。) main()函数中调用了inner()函数。...进程附加信息 除了上面的信息之外,每个进程还要包括一些进程附加信息,包括PID,PPID,PGID(参考Linux进程基础以及Linux进程关系)等,用来说明进程的身份、进程关系以及其它统计信息。...内核可以通过查看自己空间中的各个进程的附加信息就能知道进程的概况,而不用进入到进程自身的空间 (就好像我们可以通过门牌就可以知道房间的主人是谁一样,而不用打开房门)。...具体机制请参看Linux内核相关书籍) 这一篇写了整合了许多东西,所以有些长。
): 10} 也可以通过输出参数,把一个局部变量的地址传递到函数之外,go 语言也会检查到这种情况,从而把此局部变量放在堆上,以垃圾回收管理 type Con struct...{ ptr *int} func test(in *Con) { i := 110 in.ptr = &i // 局部变量的值被赋值到函数外了} func main() { var...用来返回一个对象的地址 i := 110 *in = &i} func main() { var result *int // 这个指针对象仅仅用来存放地址 test(&result) // 从...s 中去,可以增加 s 的容量 len 或者 cap copy(s1, s2) 把 s2 的内容拷贝到 s1,控制一个切片中的数据主要靠这个手段,类似于 memcpy(),注意 copy() 并不会扩容...如果希望使用 try...catch 的方式处理错误,可以: throw:panic() 函数 catch:被 defer 的函数,实际上是被 finally 时机运行的 try:就是从 defer 异常处理函数开始
可以被反编译 由于 OLLVM 是在编译过程中对 LLVM IR 进行了处理,IR 属于架构无关指令,在 LLVM 后端依然要生成平台相关的指令,所以最终只是变成了「更加复杂的 C/C++ 代码」而已。...函数间引用关系可见 混淆对象受限于 IR 指令,无法精细的对 Native 指令进行操作,使得保护后的代码仍然可以被反编译工具用 「交叉引用」 搜索到,对函数间调用关系的保护效果差。...支持工具推荐 支持ARM 虚拟化保护方案的工具:Virbox Protector 开发环境支持 Windows、Linux、macOS。...开发语言支持 C、C++、Objective-C、Swift、go、汇编语言等。
01 简介 在进行Linux系统的攻击应急时,大家可能会查看pid以及/proc相关信息,比如通过/proc/$pid/cmdline查看某个可疑进程的启动命令,通过/proc/$pid/...02 技术核心 这里向大家介绍一个linux系统的底层调用函数memfd_create(2),它在内核3.17中引入,会创建一个匿名文件并返回一个文件描述符指向它,该文件表现和常规文件类同, 可以进行修改...这里还有一个问题,如何将elf二进制文件写入到创建的文件当中,@MagisterQuis这里使用open函数将$FH内容添加进创建的匿名文件$fd当中,而$FH通过perl转化自要执行的elf文件,这就是该脚本的第二部分...可以看到我们的elf文件最终以匿名文件的方式在内存中被加载执行了,从匿名文件运行的程序与运行于普通文件的程序之间唯一真正的区别是/proc/pid/exe符号链接。...参考: https://magisterquis.github.io/2018/03/31/in-memory-only-elf-execution.html http://man7.org/linux
(这里针对ELF可执行文件,对于共享库的.init段,还是由interpreter来调用的!!!....2 crt1.o crti.o crtbegin.o test.o -L /usr/lib/gcc/i386-redhat-linux/4.0.0/ -ldl -lc crtend.o crtn.o...这里特定的解释器是动态链接器,即ld.so,它自己也是ELF 共享库的格式。...一旦找到包含该库的文件,动态链接器会打开该文件,读取ELF头部寻找程序头部,它 指向包括dynamic段在内的众多段。...从库的dynamic段中,它将库的符号表加入到符号表链 中,如果该库还进一步需要其它尚未加载的库,则将那些新库置入将要加载的库链表中。
楔子 Glibc操控微软的CLR Elf操控Glibc,让后者加载CLR 那么谁操控Elf呢? 自然是Linux Kernel了, 本篇来看下。...例子 hello.c #include #include void main() { printf("********************hello world...*************************\r\n"); execlp("/test","test",NULL); } test.c void main() { printf("...console=ttyS0" -s -S -smp 1 -nographic lldb链接qemu: lldb vmlinux lldb gdb-remote 1234 b do_execve b load_elf_binary.../hello elf文件,后者则通过execlp调用了./test。
从C#到TypeScript - Reflect 在C#里如果想只通过名字来生成类实例、获取属性或执行方法可以使用反射,反射是基于元数据,现在很多流行语言都支持元数据,以此来提供更多便利的功能。...ES6和TypeScript也有Reflect,不过因为JavaScript本身是解释型语言,很多操作如根据名字字符串获取属性,根据字符串执行函数这些原本就有支持,Reflect只是把这些操作归结到一起...Set 定义如下: Reflect.get(target, name, receiver); Reflect.set(target, name, value, receiver); 看上去也很好理解,和C#...Reflect.preventExtensions(target) 让一个对象变为不可扩展 Reflect基本上就是把之前Object的方法和一些命令如delete in之类聚到一起,相信ES6之后用
从C#到TypeScript - Promise 背景 相信之前用过JavaScript的朋友都碰到过异步回调地狱(callback hell),N多个回调的嵌套不仅让代码读起来十分困难,维护起来也很不方便...其实C#在Task出现之前也是有类似场景的,Async Programming Mode时代,用Action和Func做回调也很流行,不过也是意识到太多的回调嵌套代码可读性差且维护不易,微软引入了Task...Promise不能在任务进行中取消,只能等结果返回,这点上不如C#的Task,Task可以通过CancelTaskToken来取消任务。...success'); throw new Error('error'); }).catch(function(error) { console.info(error); // 不会执行到这里...console.info('done')); } catch (e){ console.info(e); // 由于最后面的done,所以会把finally里的异常抛出来,如果没有done则不会执行到这里
这篇文章会解释什么是C语言(比较简要),理论上怎样编译Rust供C使用,以及如何在实际使用从Rust和C两方面来实现我们的Rust解析器。我们还将看到如何测试这样的绑定。 什么是C语言,为什么有C?...通过设计,C提供了有效地映射到典型机器指令的构造,因此它在以前用汇编语言编码的应用程序中得到了持久的使用,包括操作系统,以及从超级计算机到嵌入式系统的各种计算机应用软件。 ?...Dennis Ritchie, C语言的发明者. C语言对编程语言世界的影响可能是史无前例的。从操作系统开始以及之上的几乎所有的东西都是用C语言写的。...而Rust的C绑定会转换这个AST到另外为C准备的struct和enum。Rust内部的类型不需要这个转换,只有对需要直接暴露到C语言的类型才是必须的。...然后是从argv[1]得到的filename用来读取博客文章到parse函数。
从C#到TypeScript - function 虽然TypeScript里有了类,但JavaScript的function也还在,这也是和C#的不同所在。...C#里函数不能脱离类工作,但TypeScript的function和JavaScript一样,可以单独工作。...同C#里的函数参数可以有默认值一样,TypeScript也支持,并且还支持可空参数。...TypeScript同样可以通过剩余参数来支持,形式上类似于C#的param。 剩余参数的格式是...restParam: string[]。...泛型函数 同C#一样支持泛型函数,写法也差不多。
从C#到TypeScript - 接口 为了更好的抽象出行为和属性,TypeScript在ES6的基础上增加了接口interface。...C#也有interface,不过TypeScript的接口还不大一样,C#里的接口一般是为类服务,让类实现接口中定义的方法或属性。...类的接口 这和C#的差不多,描述了公共的成员;不过实现接口语法有点类似于Java,用的是implements。...Control = { isSelected : true }; c.isSelected= false; // 没问题 另外,接口还支持可选属性,同C#的可空属性一样,用?...从实现上看有点类似于C#的delegate。
从C#到TypeScript - 类型 TypeScript和C#一样是微软搞出来的,而且都是大牛Anders Hejlsberg领导开发的,它们之间有很多共同点,现在尝试以C#程序员的角度来理解下TypeScript...,都是用number表示,这样也省了很了事,少了C#里类似long转int overflow问题。...功能上和C#差不多: 目的都是为数值提供一个友好的名字,增加代码可读性和可重构性 默认情况下从0开始编号 也可以手动赋值 可以实现类似C# Flag特性 但也有一些细节不一样: C#的枚举值toString...]; 也有类似C#的泛型List let list: Array = ['a', 'b', 'c']; 数组功能没C#配合linq那么强大,不过配合其他一些库如lodash也可以很方便的进行各种操作...也有个鸡肋的Tuple,不好用,不过新版的Tuple好像已经在C#7.0的计划当中。
从C#到TypeScript - Proxy 我们知道在C#中要实现代理功能需要自己来实现代理类,并且每个类需要不同的代理类,使用起来不方便,虽然借助一些AOP框架可以一定程度实现拦截,但毕竟框架级别的还是太重了
移动多行: :n1,n2 m k # 从n1行到n2行的文本移动到k行处,其中m是移动命令 搜索和替换: /string:向前搜索指定字符串。 搜索时忽略大小写:set ic ?...5.1 安装(c语言中文网) 由于 Linux 操作系统的自由、开源,在其基础上衍生出了很多不同的 Linux 操作系统,如 CentOS、Ubuntu、Debian 等。...然后通常使用gcc的-static 选项从该PIC 目标文件生成动态库文件默认情况下库文件的存放位置:/usr/lib或/lib。...对于不同版本的gcc来讲,n的取值范围及其对应的优化效果可能并不完全相同,比较典型的范围是从0变化到2或3。 通常情况下,数字越大,会起到更好的优化效果,但整个编译链接的过程会变慢。...continue:继续运行,到下一个断点停止 run:执行当前被调试的程序。 quit:退出gdb 。 break n:在第n行设置断点,这将使程序执行到这里时被挂起。
从C#到TypeScript - 类 在ES6之前Javascript的类都是用function定义的,ES6把类关键字正式加进来,虽说其实也还是function,不过代码可读性上好了不少。...TypeScript同样支持class,并且和C#也非常相似,下面来看看: 类 同C#一样,由构造函数,属性,方法组成,属性和方法有三个级别的访问权限:private, protected, public...,比C#少个internal。...不过不同的是C#类的成员默认是private,而TypeScript默认是public。 在类里面所有成员都必须用this来访问。...u.checkLogin()); // true u.name = 'test'; console.info(u.checkLogin()); // false 参数属性 上面的User类有两个成员,而且都是从构造函数赋值的
从C#到TypeScript - Generator 上篇讲了Promise,Promise的执行需要不停的调用then,虽然比callback要好些,但也显得累赘。...console.info(p.next()); console.info(p.next()); 先看下和普通函数的区别,function后面多了一个*,变成了function*,函数体用到了yield,这个大家比较熟悉,C#
www.oracle.com/technetwork/java/javase/downloads/java-se-6u24-download-338091.html cp /Downloads/jdk-6u24-linux-x64....bin /usr/java cd /usr/java sh /jdk-6u24-linux-x64.bin Set JAVA_HOME / PATH for single...http://tubaluer.iteye.com/blog/1374376 http://hi.baidu.com/wangyucao1989/blog/item/279cef87c4b37c34c75cc315...m=9f65cb4a8c8507ed4fece7631046893b4c4380147d8c8c4668d4e419ce3b4c413037bfa6663f405a8e906b6075a94f5feef166253c0123b5998bdd0c81ac925f75ce786a6459db0144dc47f497016fd620e11eb2b81897ad813384daa3c4ae5744bd24127af1e7fd5d1764cb7881652697ad...&p=8366de5985cc45ff57ec9e0c5552&user=baidu&fm=sc&query=linux+vi%C3%FC%C1%EE++%D5%B3%CC%F9&qid=cf9f6a0113148d9e
领取专属 10元无门槛券
手把手带您无忧上云