程序的静态链接 程序的产生 程序是由程序员编写,经过编译链接过程,最终能够在计算机中运行的东西。本质上来说编译链接过程其实就是将由人能看懂的代码段翻译成机器能看懂的代码段,然后指导机器的运行,比起程序在机器中被运行,博主更喜欢程序指导机器运行这样的说法。 编译链接事实上分为4个过程:预编译、编译、汇 ...
分类:
其他好文 时间:
2019-03-05 23:21:21
阅读次数:
328
JSPatch 支持了动态调用 C 函数,无需在编译前桥接每个要调用的 C 函数,只需要在 JS 里调用前声明下这个函数,就可以直接调用: 我们一步步来看看怎样可以做到动态调用 C 函数。 函数地址 首先若要动态调用 C 函数,第一步就是需要通过传入一个函数名字符串找到这个函数地址,这里一个必要的前 ...
分类:
其他好文 时间:
2019-02-18 19:16:37
阅读次数:
194
c++的多态使用虚函数实现,通过“晚绑定”,使程序在运行的时候,根据对象的类型去执行对应的虚函数。 C++ 之虚函数的实现原理 带有虚函数的类,编译器会为其额外分配一个虚函数表,里面记录的使虚函数的地址,当此类被继承时,子类如果也写了虚函数就在子类的虚函数表中将父类的函数地址覆盖,否则继承父类的虚函 ...
分类:
编程语言 时间:
2019-02-06 12:00:59
阅读次数:
176
1、如何区分多个对象调用同一个类函数? 类外部访问类成员,必须用对象来调用。一个类的所有对象在调用的成员函数,都执行同一段代码,那成员函数如何区分属于哪个对象呢? 在对象调用成员函数时,除接收实参外,还接受一个对象的地址。也就是隐含参数:this 指针(编译器自动实现). this 指针指出,成员函 ...
分类:
编程语言 时间:
2019-01-03 22:39:41
阅读次数:
219
lambda lambda关键字用于创建匿名函数,lambda函数能接收任意数量参数,只能返回一个表达式的值 lambda自带返回值 用一次就清除 格式: lambda函数地址 给lambda起名字 使用: 递归 递归调用:调用一个函数的过程中直接或者间接地调用了该函数本身 递归特性: 递归效率低, ...
分类:
编程语言 时间:
2018-11-29 01:19:25
阅读次数:
203
函数对象指的是: 函数的内存地址可以像变量值一样去使用 函数对象的使用 def func(): #定义一个函数 print('from func') #这是功能 1、函数对象可以被引用 f=func #将函数地址放到一个变量中 print(f) #打印这个函数的值,得到的是一个函数的内存地址 f() ...
分类:
编程语言 时间:
2018-11-18 11:23:29
阅读次数:
196
函数名的本质: 函数可以作为容器中一项 函数名可以赋值 可以作为参数 可以做返回值 返回值的本质:是返回的值,而不是某个变量 def func(): a=1 return a b=func() print(b) func#函数的内存地址 函数名加括号==调用 函数地址加括号==调用 函数名可以赋值 ...
分类:
其他好文 时间:
2018-11-06 20:22:18
阅读次数:
160
GOT应该保存的是puts函数的绝对虚地址,这里为什么保存的却是puts@plt的第二条指令呢? 原来“解释器”将动态库载入内存后,并没有直接将函数地址更新到GOT表中,而是在函数第一次被调用时,才会进行函数地址的重定位,这样做的好处是可以加快程序加载速度,尤其对大型程序来说。有关这方面的更详细的信 ...
分类:
其他好文 时间:
2018-11-03 19:21:27
阅读次数:
251
二、libbase 其实上面加载完SO库后,hook的功能我们完全可以自己在动态库中实现。而adbi作者为了方便我们使用,编写了一个通用的hook框架工具即libbase库。libbase依然在解决两个问题:1.获取要hook的目标函数地址;2.给函数打二进制补丁即inline hook。 关于获取 ...
分类:
移动开发 时间:
2018-11-03 19:12:07
阅读次数:
201
C++ 虚函数 虚函数 基类中使用virtual关键字声明的函数,称为虚函数。 虚函数的实现,通过虚函数表来实现的。即V table 这个表中有一个类,用于储存虚函数的地址。解决其继承,覆盖的问题,用于保证其真实反映的函数。这样有虚函数的实例,将会储存在这个实例的内存中。即用父类的指针,操作子类的时 ...
分类:
编程语言 时间:
2018-11-01 00:58:24
阅读次数:
186