
汇编语言
ccboby
企业私有云 www.yliyun.com
展开
-
[教程]逆向反汇编第一课
<br />开篇总要说点什么,我也避免不了这种套俗.老生常谈还是那些东西.谁让我们现在的机子大部分都是32位的系统呢.当然也有不少人使用64的了.既然大部分都在32的机子,那我们还是说32咯.<br />在编写32位机子的应用程序的时候,都有一个启动函数WinMain,不管是C或D还是E,但是Windows程序执行并不是从这个函数开始执行的,首先被执行的是启动函数的相关代码,这段代码是由IDE生成的,也就是编译器.首先由启动代码完成一些初始化的进程,再调用WinMain函数.<br />对已C/C++的程序转载 2010-11-27 12:04:00 · 1070 阅读 · 0 评论 -
汇编寄存器简介
<br />ebp和esp是32位的SP,BP <br />esp是堆栈指针 <br />ebp是基址指针 <br />ESP与SP的关系就象AX与AL,AH的关系.<br /><br />32位CPU所含有的寄存器有:<br /><br />4个数据寄存器(EAX、EBX、ECX和EDX)<br />2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)<br />6个段寄存器(ES、CS、SS、DS、FS和GS)<br />1个指令指针寄存器(EIP) 1个标志寄存器(EF转载 2010-11-12 20:01:00 · 576 阅读 · 0 评论 -
什么是堆栈——汇编语言入门
我们所接触到的段寄存器有四种:CS、DS、ES、SS,CS段是代码段,当然是存放代码的段了。DS和ES是存放数据的段。这个SS是堆栈段,什么是堆栈呢?堆栈又有什么用呢?一、什么是堆栈堆栈是一种线性表(就是像一条线一样存储的序列),堆栈是一种限制的线性表。堆栈只允许在一端进行插入和删除。允许插入和删除的一端称为栈顶(top),另一端称为栈底(button)。堆栈的插入叫做入栈,删除叫做出栈。根据堆栈的特点可知,最先入栈的总是最后出栈的,最后出栈的总是最先出栈的。ss段寄存器存储的是堆栈段的基地址,sp则存储堆转载 2010-11-12 20:27:00 · 9105 阅读 · 1 评论 -
汇编语言里 eax, ebx, ecx, edx, esi, edi, ebp, esp
eax, ebx, ecx, edx, esi, edi, ebp, esp等都是X86 汇编语言中CPU上的通用寄存器的名称,是32位的寄存器。如果用C语言来解释,可以把这些寄存器当作变量看待。比方说:add eax,-2 ; //可以认为是给变量eax加上-2这样的一个值。这些32位寄存器有多种用途,但每一个都有“专长”,有各自的特别之处。EAX 是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器。EBX 是"基地址"(base)寄存器, 在内存寻址时存放基地址。ECX 是计转载 2010-11-12 20:13:00 · 823 阅读 · 0 评论 -
rep movsd ;repz CMPSB , CMPSW , CMPSD
<br />movsd是把ds:[si]开始的DWORD传送到es:[di]开始的内存中(将ds:[si]处的4个字节数据送到es:[di]处),如果DF标志为0则si、di分别加4;如果DF为1则si、di分别减4。REP前缀表示重复执行该指令,每次执行后cx减1,直到cx为0结束。REPZ与REP类似,主要用于cmps、scas等指令,除了判断cx之外还判断ZF标志,如果ZF为0则结束。由于movs指令不会影响DF标志,所以用repz前缀没有意义,处理器会将repz当作rep处理。<br />CMPSB原创 2010-11-15 22:52:00 · 4353 阅读 · 0 评论 -
setz
<br />新条件指令集setCC,setz意思是当flag z标志被设定时,al寄存器设1,否则al为0。这样就省去了条件跳转,保证了流水线.setz指令是把ZF标志的值传给一个字节型操作数,ZF=1时结果为1,ZF=0时结果为0。原创 2010-11-15 22:59:00 · 10345 阅读 · 0 评论 -
汇编里面的esp解释
最近在学加密解密,用od进行反汇编的时候,又重新对汇编了解研究了一下。。特别是对esp做了一个深入的研究。。下面是网上搜索到的。先记在这边看看。。 在寄存器里面有很多寄存器虽然他们的功能和使用没有任何的区别,但是在长期的编程和使用中,在程序员习惯中已经默认的给每个寄存器赋上了特殊的含义,比 如:EAX一般用来做返回值,ECX用于记数等等。在win32的环境下EBP寄存器用与存放在进入call以后的ESP的值,便于退出的时候回复ESP 的值,达到堆栈平衡的目的。 应用以前说过的一段话: 原程序的O转载 2010-11-12 19:43:00 · 6867 阅读 · 1 评论 -
汇编当中 dword ptr [ ] 是什么意思
dword 双字 就是四个字节ptr pointer缩写 即指针[]里的数据是一个地址值,这个地址指向一个双字型数据比如mov eax, dword ptr [12345678] 把内存地址12345678中的双字型(32位)数据赋给eax <br />转载 2010-11-29 11:48:00 · 34229 阅读 · 1 评论 -
[教程]逆向反汇编第二课
<br />既然说的是函数,那么参数肯定不可缺少了,函数是有参数的,可是他们的参数传递却并不全部相同.函数传递参数有三种方式:堆栈方式 寄存器方式和通过全局变量进行隐含参数的传递.如果参数是通过堆栈传递的,就需要定义参数在堆栈中的顺序,并约定函数被调用后,由谁来平衡堆栈如果参数是通过寄存器传递的,就要确定信息存放在那个寄存器中.每种机制都有优缺点,而且这个还是和使用的语言也有关系的.<br /> 利用堆栈传递参数<br /> 堆栈是一种"先进后出"的存储区,栈顶指针ESP之象堆栈中第转载 2010-11-27 12:14:00 · 1379 阅读 · 0 评论 -
[教程]逆向反汇编第三课
说完利用堆栈传递参数了,下面该说说使用寄存器传递参数的话题了.寄存器传递传输的方式并没有一个标准,所有与平台相关的方法都是由IDE(也就是编译器)开发人员制定的.尽管没有统一的标准,但绝大多数编译器提供商都在不对兼容性声明的情况下,遵循相应的规范,吉fastcall规范._fastcall顾名思义,特点就是快,因为他是靠寄存器来传递参数的. 不同编译器实现的fastcall稍有不同,如Microsoft Visual C++编译器采用fastcall规范传递参数时,最左边的两个不大于4个字节(DW原创 2010-11-27 12:20:00 · 709 阅读 · 0 评论 -
[教程]逆向反汇编第四课
在各个语言中有数据结构这个东东,它是计算机存储 组织数据的方式.逆向分析时,确定了数据结构后,算法就容易得到了.有时候事情当然也会反着来,根据特定的算法来判断数据结构. 先看局部变量的 局部变量十亿个函数内部定义的变量,只有在函数内才能使用,如计数器,临时变量等.使用局部变量带来的好处,使程序模块化封装变的可能.从汇编语言角度看,局部变量就是在堆栈中进行分配,函数执行完毕后释放这些堆栈,或者直接把局部变量放在寄存器中,我在视频中也告诉各位把寄存器可以理解为变量. 第一种方法原创 2010-11-27 12:25:00 · 619 阅读 · 0 评论 -
[教程]逆向反汇编第五课
<br />全局变量作用于整个程序,一直都存在这个我们稍微了解任何一门编程语言都知道,他放在全局变量的内存区;而局部变量则是存在于函数的堆栈区,当函数调用结束后便消失.在大多数程序中,常数一般放在全局变量中,如一些注册版标记 测试版标记等.<br /> 在大多数情况下,在汇编代码中识别全局变量比其他结构要容易的多.全局变量通常位于数据块(.data)的一个固定地址上,当程序需要访问全局变量时,一般会用一个固定的硬编码的地址直接对内存寻址.比如说这样:mov eax,dword ptr [4084c0h原创 2010-11-27 12:41:00 · 546 阅读 · 0 评论 -
[教程]逆向反汇编第六课
<br />既然要玩逆向,驱动那我们就算不懂但至少要了解下C/C++语言,C++是一门支持OO的语言,对面想对象的软件开发提供了丰富的支持库.但要高效 正确的使用C++中的继承 多态等语言的特性,必须对这些特性性的底层实现有一定得了解. <br /><br /> 其实就核心概念而言,C++的对象模型的核心概念并不多,但最核心的是虚函数.虚函数是在程序运行时刻定义的函数,虚函数的地址是不能在编译时刻确定的,它只能在调用即将进行之前加以确定.对所有虚函数引用通常放在一个专用数组--虚函数表中,每个至少使用转载 2010-11-27 12:43:00 · 630 阅读 · 0 评论 -
[教程]逆向反汇编第七课
<br />在以C为代表的高级语言中用if-then-else,switch-case等高级语句来构成程序的判断流程, <br />不仅条理清晰且维护性还是不错的.而汇编语言的代码则复杂得多,会看到cmp等指令的后面跟着 各类的跳转指令jz jnz等.识别关键跳转是软件破解的一个重要技能,许多软件用一个或多个跳转 来实现注册或非注册. <br />下面先说说if-then-else语句 <br />将语句if-then-else语句编译代码后,整数用cmp指令比较,而浮点值则是使用fcom fcomp比 较转载 2010-11-27 12:45:00 · 671 阅读 · 0 评论 -
[教程]逆向反汇编第八课
<br />在进行软件分析的过程中,经常需要计算转移指令机器码或修改指定的代码.虽然许许多多的辅助工具同样可以做到这些事,但是掌握其原理还是必要的.<br />根据转移的距离远近,还可以分为以下几类:.<br />短转移:无条件转移和条件转移的机器码都是两个字节.转移范围是-128~+127字节.<br />长转移:无条件转移的机器码是5哥字节,条件转移的机器码是6哥字节.这是因为条件转移要用2个字节表示其转移类型(如je jg和jns),其他4哥字节表示转移偏移量.无条件转移要用2个字节表示其转移(如je转载 2010-11-27 12:47:00 · 502 阅读 · 0 评论 -
[教程]逆向反汇编第九课
<br />条件设置指令的形式是:SETcc r/m8,其中r/m8是表示8位寄存器或单字节内存单元. <br />条件设置指令根据处理器定义的16种条件cc,测试一些标志位,然后把结果记录到目标操作数中.当条件满足时,目标操作数会被置1,否则置0.这16种条件与条件转移指令jcc中的条件是一样的. <br />条件设置指令可以用来消除程序中的转移指令.在C语言里,常会见到执行以下功能的语句: <br />c=(a<B)?C1:C2; <br />如果允许出现条件分支,编译器会产生如下的代码或者是非常类似的转载 2010-11-27 12:52:00 · 475 阅读 · 0 评论 -
[教程]逆向反汇编第十课
<br />循环是高级语言中可以进行反向引用的一种语言形式,其他类型的分支语句(比如IF-THEN-ELSE等)都是由低向高地址区域走的.因此,通过这点可以较方便的将循环语句识别出来.如果确定某段代码是循环,就可以分析其计数器,一般是用ecx寄存器做计数器,也有用其他方法来控制循环的,如/"test eax,eax/"等. <br />看一个简单的循环代码: <br /> view plaincopy to clipboardprint?xoreax,eax;eax清零 @@: incecx;计转载 2010-11-27 12:55:00 · 721 阅读 · 0 评论 -
C反汇编实例(详细注解版)(一)
<br />呵,好久没写优快云文章了,来凑个热闹。最近我阅读了楚狂人,wowocock写的《天书夜读》试读本,对C反汇编感触颇深,书中有一例算法反汇编,其对汇编的阅读确实富有挑战,而该书中也未详解,在此,我谨将此例详细分析如下,帮助大家更好理解C反汇编代码,若有任何错误,请大家批评指正!<br /> 该例的要求是求两个3x3矩阵的乘积,其C源代码如下:<br />int myfunction(int a[3][3], int b[3][3], int c[3][3])<br />{<br转载 2010-11-27 13:03:00 · 1005 阅读 · 0 评论 -
C反汇编实例(详细注解版)(二)
<br />那么有了上述三方面的基础,我们就可以来逐一解读那段“传奇”的汇编代码了。<br />初始化i<br />00411A3E mov dword ptr [i],0<br />跳转至条件判断<br />00411A45 jmp myfunction+30h (411A50h)<br />循环表达式,对i每轮加1<br />00411A47 mov eax,dword ptr [i]<br />00411A4A add eax,1<br />00411A4D mov dword ptr [i],eax转载 2010-11-27 13:10:00 · 733 阅读 · 0 评论 -
C反汇编实例(详细注解版)(三)
<br />上次我分析了一下,debug模式下反汇编后的算法部分代码,天才的您可能觉得不算糟,想再搞点花样,那么本文就能满足你的需求。天书夜读上其实还贴出来了release模式下的代码,它经过vc编译器O2的优化,我初次看到反汇编代码时,还真汗了一把。不过定下心来细细品位还是可以看懂的,尽管正如原书所说,连语句的对应顺序也已经不见了。。。<br /> 废话不多说,先贴出代码大伙“饱饱眼福”。。。<br />00401000 mov eax,dword ptr [esp+4]<br />004转载 2010-11-27 13:13:00 · 645 阅读 · 0 评论