`
inshect
  • 浏览: 188928 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

破解汇编知识

阅读更多

寄存器
     所要了解的是8个32位的寄存器,分别是eax,ebx,ecx,edx,esp,ebp,edi,esi
     eax-edx这四个是通用寄存器,虽然各个都有各自的用途,不过你可以用它们来做任何事!是32位的,自然有低位和高位,我们又可以通过ax,bx,cx,dx来访问其低十六位,但高十六位是无法访问的!比如eax=12345678h,那么低十六位ax=5678h!而十六位的自然也有低位和高位,不过高八位是可以访问的,如ax可以分为ah和al,看字面就知道,ah(high)高八位,al就为低八位了!前面的例子,ax=5678h,那么ah=56h,al=78h!这四个寄存器主要是用来暂放计算结果或什么什么的!
     esp-esi这四个主要是寻址时用来存放偏移或指针,所以,也就称为指针寄存器或变址寄存器了~如在OD中看到的[eax],其实eax中存放的是一个内存地址,而实际要访问的是那个内存地址里的内容!
     esp(堆栈指针寄存器):
        很重要的一个概论,堆栈有着先进后出的特点,就好像有一个圆柱形的筒子,该直径刚好是一个乒乓球的直径,所以最先放进去的球当然会最后出来.而esp呢,永远是指着最顶的那个球的,也就是永远都指向栈顶!在od中也很常见了,比如push和pop就是对栈的操作,push把一个数据压入栈中,也就是把一个球放进去,再去调用push时就再放进一个,而esp则指向第二个放进去的那个球了!使用pop呢就从栈中弹出一个数据,前面说了,堆栈有着先进后出的特点,所以用pop呢就从最后放进去的那个球先出了(除非你破坏筒子(破坏堆栈?那是不可能的,程序马上死给你看))!而esp还是指向栈顶!
     取个代码例子:
     (1) mov ecx, 100<---------100传入ecx
     (2) mov eax, 200<---------200传入eax
     (3) push ecx <------------ecx先进了
     (4) push eax<-------------再来是eax
     (5) pop ebx<--------------从栈顶取出一个,也是最后进去的那一个,结果存到ebx
     (6) pop ecx<--------------从栈顶取出一个,也就是刚刚先进去的那个了,结果存到ecx
最后ebx=200,ecx=100

备注别人发布的文章上边push语句有误,我已经改正过来了。


     到了win32的平台下,api大家都知道了吧!api的参数都是靠堆栈来传递的,比如说一个FindWindow,在C里我这样调用
->::FindWindow(NULL,"a")->而反汇编之后在系统底层反汇编代码就象这个样子:
     push xxxxxxxx->xxxxxxxx为"a"的内存地址
     push yyyyyyyy->yyyyyyyy为空中止字符串的指针
     call zzzzzzzz->调用FindWindow
     而在call里面先使用pop弹出先前压入栈的参数再使用

     ebp(基址指针寄存器):
     它称为基址指针寄存器,它们都可以与堆栈段寄存器SS(堆栈段)联用来确定堆栈中的某一存储单元的地址,ESP用来指示段顶的偏移地址,而EBP可作为堆栈区中的一个基地址以便访问堆栈中的信息。

     ESI(源变址寄存器)和EDI(目的变址寄存器)一般与数据段寄存器DS联用,用来确定数据段中某一存储单元的地址。这两个变址寄存器有自动增量和自动减量的功能,可以很方便地用于变址。

     还有两个专用寄存器,分别是eip和flags
     flags:
        这个是标志寄存器了,存放条件标志码、控制标志和系统标志的寄存器!在od中也见很多了,比如zf(零标志),用cmp比较时,把两个操作数相减,为0就置zf为1,否则zf为0。而jnz就是看zf是否为0,为0就跳!这样说起来似乎更乱了,建议大家去记那些大于就跳,小于就跳的,比较简单(jnz就是不相等就跳)``哦呵呵!!至于其它标志,这里不再阐述了,可以去参看汇编速查!
        cmp eax,ebx<-比较eax和ebx,两个相减,为0的话zf就为一,否则zf为0
        jnz xxxxxxx<-判断zf是否为0,为0就跳到xxxxxxx处,也就是所谓的不相等就跳

     eip(指令指针寄存器):
        这个很好理解,根据od来说,载入一个程序后,比如代码像这样:
        0043C412 >/$Content$nbsp;    55               push       ebp            <-载入后停在这,看寄存器窗口eip这时为43c412
        0043C413     |.     8BEC             mov        ebp, esp       <-f8运行一步之后,eip为43c413
        0043C415     |.     6A FF            push       -1             <-eip为43c415
        0043C417     |.     68 C8B64800      push       0048B6C8       <-eip为43c417
        有人会说"原来eip是指示当前执行到代码处的地址的!"     ,这不对!!因为f8运行还没通过那条代码,所以还不算已经执行了,没错,eip指向的就是下一条将要执行的指令的指针!

段寄存器:
      cs代码段,ds数据段,ss堆栈段,es附加段
      在Win32编程中段的概念已经不重要了!而在Crack时你总不会是在调是dos时代的程序吧!-!

4.0 常用汇编指令
    mov ax,cx    <-很常用了,把cx的值送入ax中,cx值保持不变
    cmp eax,ecx<-很常见了吧,比较eax和ecx,置标志位!方法前面说过了
    xor eax,eax<-看这个,eax与自己异或,是清零的操作!
    lea eax,str<-并不传送数据,只传送该数据的地址,将str字符串的地址传到eax
    push eax     <-进栈操作,前面说过了,eax进栈
    pop    ebx     <-出栈操作,前面也说了,弹出位于栈顶的数据存入ebx
    ADD 加法指令 格式:ADD DST,SRC 执行的操作:(DST)<-(SRC)+(DST)
    SUB 减法指令 格式:SUB DST,SRC 执行的操作:(DST)<-(DST)-(SRC)
    MUL 无符号乘法指令 格式: MUL SRC    执行的操作:字节操作(AX)<-(AL)*(SRC);字操作(DX,AX)<-(AX)*(SRC);双字操作:(EDX,EAX)<-         (EAX)*(SRC)
    DIV 无符号除法指令 格式:DIV SRC    执行的操作:字节操作:16们被除数在AX中,8位除数为源操作数,结果的8位商在AL中,8位余数在AH中         。表示为:
         (AL)<-(AX)/(SRC)的商,(AH)<-(AX)/(SRC)的余数。字操作:32位被除数在DX,AX中。其中DX为高位字,16位除数为源操作数,结果的16         位商    在AX中,16位余数在DX中。表示为:(AX)<-(DX,AX)/(SRC)的商,(DX)<-(DX,AX)/(SRC)的余数。
    nop          <-    无操作,去掉指令用的吧!去掉一个跳转,让程序直接往下走,就到注册成功处啦(扯远了````)
    call         <- 调用子程序或函数用的

    关于跳转指令,可以查看汇编速查手册,别强迫自己把所有的都一下记住,浪费精力,不懂时再查一下,久了就记住了!
   
5.0 高级语言程序的汇编浅解析
    汇编语言要和硬件直接打交道,写病毒是方便点啦!!而在高级语言中,如C中我们要面向的是问题的解决,对于硬件资源操作,编译器搞定了!在这里稍微讲一下高级语言中与反汇编代码相应的一些地方:
    1、定义变量
      int a;
      一个变量其实是存放在一个内存地址里,如果对a进行赋值"a=10",在反汇编中就有可能表现为:
      mov word ptr[007e58c2],A
      像这个样子,而a所对应的内存地址就是0x007e58c2了,当然是乱写的一个地址而已,系统怎样分配?(天知道...)

2、比如一个数组
      char str[]="hello";
      占用了6个字节,最后一个是以0结尾的空字节,数组名可以当做数组的指针!str[0]='h',str[0]相应一个变量地址,比如为[0040e123],那么[0040e124]就为'e',[0040e125]就为'l'....了`

3、指针
     char *p;
     指针也是一个变量,所以它也对应一个内存地址!但访问时应该是访问其指向的内存地址的内容,而不是这个指针变量的内容,其内容只是一个地址而已!假如该指针变量地址为007e1000,那么语句p=a,这句在高级语言里是让指针p指向a这个内存单元!p里的内容是a的地址,*p实际上是a的内容了!而反汇编有可能表现成这样:
    mov [007e1000],007e2000<-假如007e2000为变量a的地址,那么就是把a的地址传到007e1000这个内容里了!

4、函数调用
    sub(a,b);
    假如sub是自定义的一个减法函数,作用为参数一减去参数二,上面语句为在C中调中时传递参数!前面有说过了,Win32平台下函数调用的参数是通过堆栈来传递的,那么反汇编就是:
    (假如a=2,b=1)
    mov eax,2
    mov ebx,1
    push eax
    push ebx
    call 取地址(sub)
    .......

分享到:
评论

相关推荐

    破解基础知识汇编(飘云阁)

    破解基础知识汇编 从飘云阁上转来的 有需要的朋友可以拿走

    破解基础知识汇编CHM

    对于想学习破解的朋友,而又不知道从哪下手,建议你看看这个,将会丰富你的破解知识,带你入门

    软件破解教程 汇编知识

    全面展示软件破解精华 以及汇编知识 脱壳技术应用

    菜鸟学习破解汇编基础视频教程

    《菜鸟学习破解汇编基础视频教程》是一套针对汇编语言初学者精心设计的教学资源,旨在帮助新手快速入门并掌握汇编语言的基础知识。汇编语言是计算机科学中的一种低级编程语言,它与机器语言紧密相关,是计算机硬件...

    函数模板、复杂宏、汇编知识练习题.ppt

    函数模板、复杂宏、汇编知识练习题.ppt

    函数模板、STL、复杂宏、汇编知识.ppt

    函数模板、STL、复杂宏、汇编知识.ppt

    汇编语言 知识点 必备 重点汇编语言 知识点 必备 重点

    了解汇编语言的知识点对于理解和优化计算机程序至关重要。以下是一些关键的汇编语言知识点: 1. **寄存器**: - 寄存器是CPU内部的高速存储区域,用于暂时存储数据和指令。例如,CS:IP寄存器组合控制程序执行流程...

    汇编语言基础知识教程

    **汇编语言基础知识教程** 汇编语言是一种低级编程语言,它是计算机硬件可以直接理解的语言,与机器码直接对应。在本教程中,我们将深入探讨汇编语言的基础知识,旨在为初学者提供一个易于理解的学习路径。 ### ...

    汇编课件——介绍详细的汇编知识

    在"汇编课件——介绍详细的汇编知识"中,您将获得以下关键知识点: 1. **基础知识**:了解汇编语言的基本概念,如指令集、寄存器、地址模式等。寄存器是CPU内部的高速存储单元,它们直接参与运算,而地址模式则决定...

    汇编语言重点知识总结

    汇编语言重点知识总结 汇编语言是计算机科学中的一门重要语言,用于编写低级语言程序,直接控制计算机硬件。以下是汇编语言的重点知识总结: 一、寄存器和存储器 * 寄存器是计算机中的一个小型内存,用于存储数据...

    菜鸟的汇编汇编汇编汇编

    2. **汇编语言__第一次上机.doc**:通常涵盖首次接触汇编语言时的基础知识,如数据类型、指令集介绍和简单的程序编写。 3. **新建 Microsoft Word 文档.doc**:可能包含额外的学习资料,如代码示例、解惑答疑或者...

    汇编API 汇编API 汇编API

    汇编API的学习涉及到许多底层计算机系统知识,如CPU架构、内存管理、中断机制等。熟悉汇编API能够使开发者更好地理解计算机系统的运作原理,并在需要的时候写出更高效、更可控的代码。然而,由于其复杂性和低级特性...

    汇编知识学习及免杀实践

    以下将详细介绍这些文件所涵盖的汇编知识及其在免杀实践中的应用。 首先,"8088_汇编速查手册_.txt" 是一本关于8088汇编的参考手册,8088是Intel早期的微处理器,它是x86架构的鼻祖。这份手册可能包含了8088处理器...

    公共基础知识汇编最全面版

    公共基础知识汇编最全面版(包括政治、经济、法律、管理、人文、科技部分的常识练习题和答案

    Win32汇编下载汇编汇编汇编汇编汇编

    总的来说,这个资源包为32位汇编语言编程的学习提供了一个全面的起点,涵盖了理论知识、实践案例和额外的学习资源。通过系统学习,读者不仅可以掌握汇编语言的基本语法和操作,还能深入理解Windows系统的底层机制,...

    汇编语言相关知识详解(文档)

    汇编语言相关知识详解(文档) 仅供学习交流! 后续会持续分享相关资源,记得关注哦! 汇编语言相关知识详解(文档) 仅供学习交流! 后续会持续分享相关资源,记得关注哦! 汇编语言相关知识详解(文档) 仅供...

    汇编复习知识点.xmind

    汇编语言的一些基础知识点总结,通过Xmind很形象的表达出了章节与章节之间的关系

Global site tag (gtag.js) - Google Analytics