自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(22)
  • 资源 (1)
  • 收藏
  • 关注

原创 函数返回结构体的内幕

函数返回结构体的内幕在刚接触C语言编程时,无论是前辈还是教科书,都反复告诫我们两件事:①函数的参数是值传递(意味着在函数中对参数本身的修改无法“传回”);②不要返回函数体内局部变量的地址,因为函数结束时栈会回收,局部变量也随之销毁(如果局部变量为类对象,其析构函数会被自动调用),但可以返回局部变量本身。 那么如果一个函数的返回值为结构体类型,其返回值是如何“返回”的呢?是通

2014-11-23 13:08:01 11283 1

原创 之九:磁盘页面的抽象

在讲《X86页式内存管理》中提到过“页面交换”。一个系统的物理内存总是有限的,但是运行在其上的进程却不敢不顾的一味“索取”,为了解决这种困境,在计算机的发展史上很早就有将内存中的内容与一个专用的磁盘空间交换的技术,即把内存中暂时不用的内容存到磁盘上,为其他急用的内容腾出内存空间,到需要时再将磁盘上的内容读到内存中。在继续之前,要明确几个概念。首先“虚存页面”指虚拟地址空间中一个固定大小,边界与

2014-11-23 12:49:15 1931

原创 之八:情景分析之堆栈扩展

注:本文展示的代码来自2.4.0版本的内核,入口函数do_page_fault定义在中。总体处理流程: 备注:①do_page_fault前半部分流程请参考“越界访问”的情景分析。②虚存区间结构vm_area中包含一个vm_operations_struct类型的指针vm_ops。vm_operations_struct定义了一组函数指针,其中的nopage函数指针指定了当该区

2014-11-23 12:39:54 960

原创 之七:.情景分析之越界访问

情景分析之越界访问注:本文展示的代码来自2.4.0版本的内核,入口函数do_page_fault定义在中。总体处理流程: 备注:①读取CR2寄存器获取出错地址CPU在发出页面异常时,会将对应的地址存到CR2寄存器中,在页面异常的处理程序中就可以从CR2中读取到出错地址。因为要读取CR2寄存器,C语言无法做到,只能通过嵌入式汇编实现。②当前进程的用户空间尚未建立前面讲

2014-11-20 15:57:28 614

原创 之六:虚存管理中的抽象

虚存管理中的抽象在软件设计时,我们一般要从需求中提取出抽象(类或者数据结构),然后围绕这些抽象设计相关的算法。内存管理自然也不能例外,这一节我们来看看为了管理为了内存以及整个虚存空间,linux提取哪些抽象,提取这些抽象背后的动机是什么?这些抽象之间的关联是什么?注:本文展示的结构体定义来自2.4.0版本的内核。1.  4G虚存空间的划分前面讲过,linux的页式存储管理为虚存地址

2014-11-14 22:05:45 1141

原创 之五:物理内存管理中的抽象

在软件设计时,我们一般要从需求中提取出抽象(类或者数据结构),然后围绕这些抽象设计相关的算法。内存管理自然也不能例外,这两节我们来看看为了管理为了物理内存以及整个虚存空间,linux提取哪些抽象,提取这些抽象背后的动机是什么?这些抽象之间的关联是什么?注:本文展示的结构体定义来自2.6.24版本的内核。1.最顶层——节点 Node    Node(内存节点)是因为NUMA的出现而产生的

2014-11-14 21:45:04 1480

原创 之四:页面映射中的结构体

备注:本文中引用的内核代码的版本是2.4.0。在前面的文章中,我们介绍了linux页式内存管理,讲到了页面目录PGD、中间目录PMD以及页表PT,本文来看下内核中对应的结构体定义。一、 页表项pte_t以及相关操作PGD、PMD以及PT分别是由pgd_t(页面目录项)、pmd_t(中检目录项)以及pte_t(页表项)构成的数组,这些表项(虽然只有32位)被定义成结构体,定义在中:

2014-11-14 21:21:17 2108

原创 libprotectClass.so头信息中的陷阱

libprotectClass.so头信息中的陷阱 1. libprotectClass.so头信息中诡异数字 libprotectClass.so是360加固用到的一个共享库。当我尝试用IDA打开这个共享库时,IDA给出如下提示:提示的意思是说elf文件(动态库so是elf文件的一种)中节区(section)描述符的size有误,SHT意即Section Header T

2014-11-02 11:20:45 1917 1

原创 之三:linux的页式内存管理

linux的页式内存管理备注:本文中引用的内核代码的版本是3.14。当地址的宽度是32位时,页面目录表+页面表的两级映射合情合理,但如果地址总线的宽度超过32位,比如64位时,两级映射就不合理了。linux要设计一套适用于所有地址宽度的页式内存管理机制,就不能不考虑这个问题。linux的页式管理将映射分成三层,在页面目录表和页面表之间加入一层“中间目录”。在代码中,页面目录称为PGD,中间

2014-11-02 11:04:36 1199

原创 之二:X86页式内存管理

X86页式内存管理内存管理的目的是什么?内存管理本身就像一个外观模式,它隐藏底层细节而给应用程序提供一个统一易用的访问内存的接口。程序可以访问4G空间中的任意地址,但实际上物理内存可能只有几百M,这之间的矛盾该怎么解决?关键时刻,还是得抱硬盘的大腿。当可用内存不足时,将内存中不紧急的内容从内存中换出到磁盘上,从而腾出内存给更紧急的程序使用。当需要访问之前的内容时,再将磁盘中数据读入到内存中。内

2014-11-02 10:50:48 711

原创 之一:X86段式内存管理与保护模式

X86段式内存管理与保护模式我们说一个CPU是16位的或32位的或64位的,指定是CPU中的ALU单元(算术逻辑单元)的宽度,通常也就是数据总线的宽度。那么地址总线呢?自然的,从程序设计的角度我们希望其与数据总线的宽度一致,这样一个地址也就是一个指针,其与整数同宽,在进行指针运算时,直接拿整数运算指令就可了,不需要专门的“指针运算指令”。在80286时代,当时数据总线的宽度是16位的,不出

2014-11-02 10:46:15 1368

原创 之三:三步法解析内核中的嵌入式汇编

三步法解析内核中的嵌入式汇编1.汇编指令格式在windows领域386汇编都以intel定义的指令格式来编写,而在unix领域,采用的却是AT&T格式。先来看看这两种格式的简要区别。1. AT&T格式中,寄存器名前要加“%”前缀;而在Iintel格式中则不带前缀AT&Tpush %eaxIntelpush eax

2014-11-02 10:34:24 1477

原创 之二:内核中list_head的理解

内核中list_head的理解1.需求分析我们在《数据结构》课程上,学习过双向链表。现在假定有下列需求。需求1:设计一个结构体,结构体本身支持双向链表,你的实现可能会是:方案1struct myStruct{    intmyValue;    structmyStruct *prev;    structmyStruct *next;};void

2014-11-02 10:07:43 704

原创 之一:写在前面

写在前面1.这是《情景分析》的读书笔记2013年9月,偶然的机会看到了《Linux内核源代码情景分析》(后文称《情景分析》)。对一个内核菜鸟来说,阅读此书就像郭靖读《九阴真经》一样难懂、难受。出于对这本书的敬仰我也只好不求甚解硬着头皮读了几章。虽然是不求甚解,但本书作者如庖丁解牛般对源码的剖析,其神乎其技给我留下了深刻的印象。11月,我与刚接触一年的linux分手,去搞逆向工程了,此书就被

2014-11-01 22:50:32 478

原创 也谈ERR_PTR,PTR_ERR,IS_ERR

由于C语言中没有“try-catch”机制,所以函数处理过程中的异常情况一般也是借用函数的返回值来通知条用者(caller)。在内核中,我们经常看到ERR_PTR,PTR_ERR,IS_ERR的身影,常见的场景如下:char *callee(){    //如果没有足够的内存,返回内存不足的错误码    if(no sufficient memory)        ret

2014-09-27 14:39:19 1188

原创 C++对象在内存中的布局(读汇编代码)

C++对象在内存中的布局研究方法以及ARM调用规范最近在对C++编写的SO库进行逆向,如果掌握了对象的布局,那么逆向也能轻松些,所以萌发了研究对象布局的想法。本文采用的研究方法是:编写C++代码,用gcc编译。通过IDA查看编译后的代码,分析ARM汇编代码,总结出内存布局。由于能力有限,本文研究的情形还是比较简单的。如果想深入研究的话,要读一读《深入C++对象模型》了。在进行具体分

2014-09-21 11:51:14 2392

原创 setjmp与longjmp原理分析

一、setjmp与longjmp的用法参考下面的文章        http://blog.csdn.net/chenyiming_1990/article/details/8683413二、setjmp与longjmp原理longjmp是如何回到setjmp函数里的呢?我们通过阅读源码来解决这个疑问。setjmp与longjmp的实现是与平台相关的,android的libc库

2014-01-08 11:43:44 5959

原创 如何将lua编译成动态库

如何将lua编译成动态库:http://guiquanz.github.io/2012/08/02/lua_improvements/

2014-01-07 12:05:38 4628 1

原创 排序算法之三——快速排序

像合并排序一样,快速排序也是基于分治策略。下面是对一个典型子数组A[p..r]快速排序的分治过程的三个步骤:分解:将数组A[p..r]分解成两个(可能为空)子数组A[p..q-1]和A[q+1..r],使得A[p..q-1]中所有的元素都小于等于A[q],而A[q+1..r]

2011-09-12 13:22:43 662

原创 排序算法之二——合并排序

有很多算法在结构上是递归的:为了解决一个给定的问题,算法要一次或多次地递归调用起自身来解决相关的子问题 。这些算法通常采用分治策略:将原有问题划分成n个规模较小而结构与原问题相似的子问题;递归地解决这些子问题,然后再合并其结果,就得到原问题的解。分治模式在每一层递归上都有三个

2011-09-05 13:29:01 1155

原创 排序算法之一——插入排序

大多数纸牌玩家都用插入排序方法来给纸牌排序:他们保持手上的纸牌有序,每新抓取一张纸牌,将新纸牌插入到合适的位置。要对数组x[n]进行排序,我们从有序子数组x[0..0]开始(只包含一个元素x[0],当然有序),然后按照下面伪代码所示的方法,插入元素x[1]...x[n-1]。伪代

2011-08-29 22:44:38 401

原创 与excel交互的几种“非常”思路

程序与Excel交互(Excel导入或导出),最经常使用的是OLE。OLE一个最大的缺点就是其针对单元格操作,加之文件IO的开销,在面对大数据量问题时,OLE就显得力不从心。可以试试下面几种非常规思路(导出excel的思路)。一:利用剪贴板可以将要导出的Excel内容按照

2011-08-24 21:42:09 1662

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除