Linux | c&cpp | Email | github | QQ群:425043908 关注本站

itarticle.cc

01TCMalloc的使用与源码剖析(申请和归还)

TCMalloc给每个线程分配了一个线程局部缓存,小对象的分配是直接由线程局部缓存来完成的,这样就避免了多线程程序中的锁竞争情况。当线程局部缓存中的内存不够时,会将对象从中央数据结构移动到线程局部缓存中,同时定期的用垃圾收集器把内存从线程局部缓存迁移回中央数据结构中。

TCMalloc将尺寸小于等于256 * 1024字节的对象(“小”对象)和大对象区分开来。大对象直接使用页级分配器从中央页堆直接分配。即,一个大对象总是页对齐的并占据了整数个数的页。

02TCMalloc的使用与源码剖析(内存泄露检查)

gperftools是google提供的一套分析工具,包括堆内存检测heap-profiler,内存泄漏分析工具heap-checker和CPU性能监测工具cpu-profiler。众所周知堆外内存的泄漏是很难追踪的,使用MAT等dump分析工具也只能从堆中最大或者最多的对象入手去分析发生泄漏的地方。而gperftools将malloc的调用替换为它自己的tcmalloc,从而统计所有内存分配的行为,帮助我们更快的定位到发生泄漏的地方。

03Linux替换动态库导致正在运行的程序崩溃

在替换so文件时,如果在不停程序的情况下,直接用 cp new.so old.so 的方式替换程序使用的动态库文件会导致正在运行中的程序崩溃。解决的办法是采用“rm+cp” 或“mv+cp” 来替代直接“cp” 的操作方法。

04linux进程动态so注入

1、如何能够接触到正在执行进程的内存空间.

2、__libc_dlopen_mode 的内存地址是多少(如何查找)

3、如何找到 link_map 地址

4、如何根据 符号名字符串 和 link_map 找符号的内存地址

5、如何调用 __libc_dlopen_mode?

05Linux逆向之hook&注入

利用ptrace进行hook的原理和步骤

1、首先需要使得hook程序利用ptrace attach target程序,保护现场,保存原寄存器内容和内存数据

2、通过得到指向link_map链表的指针,通过一系列的遍历操作,根据函数名查找到各种函数的真实地址

3、通过修改target程序的寄存器和内存使其调用dlopen函数,从而将hook.so加入target内存空间

4、修改需要被hook的func函数地址的GOT表为hook.so中hook_func函数地址

5、完成hook,恢复现场,恢复原寄存器内容和内存数据,退出ptrace

06windows 磁盘清理工具-- SpaceSniffer

SpaceSniffer - 揪出偷偷占用你硬盘空间的流氓!直观分析并清理硬盘垃圾文件的绝佳好工具!

当电脑用久了之后,大多数人都会发现Windows

会越来越慢,而且硬盘空间也慢慢地满了。特别是下载控,电影控,软件控,收集控等,往往空间就像是被病毒侵蚀一样不知不觉就被耗尽了,直到有一天…“新出的片片塞不进去啦!!”

但可惜的是,所有的垃圾清理软件也无法判断哪些文件是对你有用或没用,最后还是得自己来一次大清理!

07记游戏运营之好奇和争执

让游戏用户花钱,出于等价交换,那多半也是满足了用户某方面的需求。当一个人在玩游戏的时候,多半是会把自己代入到游戏中去,一些在现实中无法实现的事情肯定希望在游戏中能实现一二,譬如说希望能当个英雄拯救家园,希望能当个将军驰骋疆场,希望能当个皇帝拥有三千后宫佳丽。譬如还有些用户希望见谁就砍谁一刀来抒发心中的不满,我记得当年玩某个游戏时,正悠闲的走在路上去采药,莫名其妙的就挂了,后发现被路人砍了一刀,然后怒气值直接暴涨。

08帧同步游戏的设计

TCP是基于重传来保证可靠性,如果IP包丢包,TCP协议需要等待至少2个往返时延才会重新发送这个数据包,丢包严重甚至会断线,一旦断线,则触发断线重连流程。

这是腾讯一款以忍者格斗为题材的ACT手游给出来的数据,可以看到在各种网络情形下,UDP的表现(延迟分布)基本上都优于TCP。

09AT&T与Intel汇编语言的比较

在Intel的语法中,寄存器和和立即数都没有前缀。但是在AT&T中,寄存器前冠以“%”,而立即数前冠以“$”。在Intel的语法中,十六进制和二进制立即数后缀分别冠以“h”和“b”,而在AT&T中,十六进制立即数前冠以“0x”。

1、直接跳转:跳转目标是作为指令封一部分编码。 如:jmp 0x2358, 直接跳转是跳转到这个地址执行指令,是根据下一条指令位置作的加减法。

objdump -d xxxx 里面看到的汇编指令(如下图),虽然显示是目标指令的地址,但看机器码会发现,这个值实际上是一个偏移值。

405678-405657=30 (1、这个是16进制的计算,不是10进制的。2、需要用405657即下一条指令的地址作为基准作偏移,实际上是加上了本身这条指令占用的字节数)

jmp的机器码有三个:e9、eb、ff (ff 是用于绝对跳转的,就是跳转到这个地址执行;e9和eb是相对跳转的,就是拿下一条指令的地址加上后面的偏移量)

2、间接跳转:目标是从寄存器或存储器位置读出来的。如:jmp *%eax间接跳转字节码基本都是ff,也是绝对跳转。就是跳转到这个地址。这个区别于e9和eb是相对地址。

3、e9和ff 是扩展到64位的

10dlopen函数详解

Linux提供了一套API来动态装载库。下面列出了这些API:

dlopen:该函数将打开一个新库,并把它装入内存。该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的。这种机制使得在系统中添加或者删除一个模块时,都不需要重新进行编译。

dlsym:在打开的动态库中查找符号的值。

dlclose:关闭动态库。dlerror:返回一个描述最后一次调用dlopen、dlsym,或dlclose的错误信息的字符串。

11函数调用-汇编分析

汇编函数调用过程

1、压栈: 函数参数压栈,返回地址压栈

2、跳转: 跳转到函数所在代码处执行

3、执行: 执行函数代码

4、返回: 平衡堆栈,找出之前的返回地址,跳转回之前的调用点之后,完成函数调用

call:把call指令的下一条指令地址作为本次函数调用的返回地址压栈,然后使用jmp指令修改指令指针寄存器EIP,使cpu执行被调用函数的指令代码。

ret:它表示取出当前栈顶值,作为返回地址,并将指令指针寄存器EIP修改为该值,实现函数返回。

ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。

EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。

12float和double表示范围和精度

范围:float的指数范围为-127--128,double的范围是-1023-1024。

负指数决定了绝对值最小的非零数,正指数决定了绝对值最大的数。也即决定了范围。

也即float的范围为-2^128-2^128,double的范围是-2^1024-2^1024。

精度:float和double的精度是由尾数位决定的。浮点数在内存中是按照科学计数法来存储的,其整数部分始终是一个隐藏着的1。由于他是不变的,因此对精度不会造成影响的。

float精度范围是:2^23一共7位,因此最多能表示7位,但是能保证的是6位。

double的精度范围是2^52一共16位,同理最多能表示16位,但是能保证的是15位。

我的名片

网名:丰果 | Ranger

职业:游戏开发

现居:上海市

Email:86668082@qq.com




站点信息

  • 建站时间:2016-04-01
  • 文章统计:728条
  • 文章评论:82条
  • QQ群二维码:扫描二维码,互相交流