免杀汇编基础大全

by:陨落星辰

OllyDbg 的界面 的界面。

OllyDbg 的界面有 5 个 分别是反汇编窗口、寄存器窗口、堆栈窗口、信息窗口、数据窗口、 参考文本字符串窗口。

反汇编窗口: 反汇编窗口:
反汇编窗口显示被调试程序的代码。它有 4 个列:地址、机器码、反汇编代码和注释。 最后一列注释栏显示相关 API 参数或运行简表,非常有用。 在反汇编版面窗口中(注:不是列标题) ,默认时,双击完成以下动作。 地址列:显示相对被单击的地址,再次双击返回到标准地址模式;
机械码列:设置或取消无条件断点,对应的快捷键是 F2 键; 反汇编代码列:调用汇编器,可直接修改汇编代码; 注释列:允许增加或编辑注释,对应的快捷键是“; ”键。 要从键盘上选择多行,直接按下 Shift 键和上下光标箭头或者 PgUp/PgDn 键,也可以利 用右键菜单命令。按住 Ctrl 键并按上下光标键,一行一行的滚动汇编窗口(当数据与代码 混合时,此功能非常有用)
信息窗口: 信息窗口:
动态跟踪时,显示与指令相关的各寄存器值、API 函数调用提示和转跳提示等信息。
数据面板窗口: 数据面板窗口:
以十六进制和字符串方式显示文件在内存中的数据。要显示数据,可以单击右键→转 到表达式或按“Ctrl+G”键打开地址窗口,输入地址。
寄存器窗口: 寄存器窗口:
显示 CPU 各寄存器的值,支持浮点、MMX 和 3DNow!寄存器,可以单击鼠标右键切换 或单击窗口标题切换显示寄存器方式。
堆栈窗口: 堆栈窗口:
显示了堆栈的内容,即 ESP 指向地址的内存。堆栈窗口非常重要,各个 API 函数和子 程序等都利用它传递参数和变量等。
OllyDbg 的单步跟踪功能键
OllyDbg 功能键 F7 F8 Ctrl+F9 Alt+F9 F9 功能 单步步进,遇到 CALL 跟进 单步步过,遇到 CALL 跳过,不跟进。 直接到出现 RET 指令时中断 若进入系统领空,此命令可瞬间回到应用程序领空 运行程序
免杀常用汇编代码
机械码,又称机器码 又称机器码. 一. 机械码 又称机器码 C32Asm 打开,编辑 exe 文件时你会看到 许许多多的由 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F 组成的数码,这些数码 就是机器码. 修改程序时必须通过修改机器码来修改 exe 文件. 二.需要熟练掌握的全部汇编知识 需要熟练掌握的全部汇编知识 不大容易理解,可先强行背住,混个脸儿熟,以后慢慢的就理解了 cmpa,b 比较 a 与 b mova,b 把 b 的值送给 a 格式: MOV OPRD1,OPRD2 mov eax, dword ptr [1001C86C]
ret 返回主程序
nop 无作用,英文“nooperation”的简写, 意思是“donothing”(机器码 90)***机器码的含义参看上 面 (解释:ultraedit 打开编辑 exe 文件

时你看到 90,等同于汇编语句 nop) call 调用子程序 je 或 jz 若相等则跳(机器码 74 或 0F84) jne 或 jnz 若不相等则跳(机器码 75 或 0F85) jmp 无条件跳(机器码 EB) jb 若小于则跳 ja 若大于则跳 jg 若大于则跳 jge 若大于等于则跳 jl 若小于则跳 jle 若小于等于则跳 pop 出栈 push 压栈
堆栈 堆栈要点
堆:顺序随意 栈:先进后出 堆和栈的区别 堆栈是堆放货物的仓库。从地面起自下而上堆放的货物总是“先进后出”的。 在计算机中,堆栈是用来存放临时需要暂时储存的数据的存储器。是读写存储器 RAM 中的一个特殊的区域,是一组按照“先进后出”的方式工作的、用于暂存信 息的存储单元。
寄存器
寄存器一般分为以下几类
4 个数据寄存器(EAX、EBX、ECX 和 EDX) 2 个变址和指针寄存器(ESI 和 EDI) 2 个指针寄存器(ESP 和 EBP) 6 个段寄存器(ES、CS、SS、DS、FS 和 GS) 1 个指令指针寄存器(EIP) 1 个标志寄存器(EFlags) ①数据寄存器 数据寄存器主要用来保存操作数和运算结果等信息, 从而节省读取操作数所需占用总线和访 问存储器的时间。 32 位 CPU 有 4 个 32 位的通用寄存器 EAX、EBX、ECX 和 EDX。对低 16 位数据的存取, 不会影响高 16 位的数据。这些 低 16 位寄存器分别命名为:AX、BX、CX 和 DX,它和先前的 CPU 中的寄存器相一致。 4 个 16 位寄存器又可分割成 8 个独立的 8 位寄存器(AX: AH-AL、 BX: BH-BL、 CX: CH-CL、 DX:DH-DL),每个寄 存器都有自己的名称,可独立存取。程序员可利用数据寄存器的这种“可分可合”的特性,灵 活地处理字/字 节的信息。 Eax=4=dowrd Ax=2=word Ah=1=byte 我们可以假设内存表就是一张纸. 当我输入一个数据的时候,软件就会为我们在内存中开辟 一个地址,以往内存表中存放数据,如这里就是往这个地址开始写入数据:0040339C . 我们对内存表的高位和低位的理解就可以想做这里就是一张白纸. 我们把每个空格都当作 一个位置,从 0~1000 开始计数,写在最前的就是低位,比如说写四个数,从 0~3 . GAME 数据的 低位~高位就是从 G 到 M. 之后呢,我们从内存表中区数据,放入寄存器中,我们可以把寄存器比做一个水桶,我们放入数 据的时候肯定是把"水"先倒到水筒的底部. 如我们从内存中区 GAME 放入到水桶中的话 水桶中存放的数据就成了 EMAG 也就是 45 4D 41 47 (注意每个字节是两个 16 进制的字符) 而水桶的高位和地位呢,想必大家会很明白,水桶的最上方就是高位,水桶底就是低位,所以 EMAG 数据的高低位就是 E~G(E 为最高位 G 为最低位)
这样大家就清楚 高高低低原则了 (低位用 D 表示 高位用 G 表示) D G G D 如果把内存地址的数据 01 02 03 04 放到寄存器就是 04 03 02 01 G D D G 如果

把寄存器 的数据 04 03 02 01 放到内存地址为 01 02 03 04
寄存器 AX 和 AL 通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。 累加器可用于乘、 除、输入/输出等操作,它们的使用频率很高; 寄存器 BX 称为基地址寄存器(Base Register)。它可作为存储器指针来使用; 寄存器 CX 称为计数寄存器(Count Register)。在循环和字符串操作时,要用它来控制循环次 数;在位操作 中,当移多位时,要用 CL 来指明移位的位数; 寄存器 DX 称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数 参与运算,也 可用于存放 I/O 的端口地址。
在 16 位 CPU 中,AX、BX、CX 和 DX 不能作为基址和变址寄存器来存放存储单元的地址, 但在 32 位 CPU 中,其 32 位 寄存器 EAX、EBX、ECX 和 EDX 不仅可传送数据、暂存数据保存算术逻辑运算结果,而 且也可作为指针寄存器, 所以,这些 32 位寄存器更具有通用性。 ②变址和指针寄存器(ESI 和 EDI) 变址和指针寄存器 寄存器 ESI、EDI、SI 和 DI 统称为变址寄存器(Index Register),主要用于存放存储单元在段 内的偏移量, 通过它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存 储单元提供方便。 变址寄存器不可分割成 8 位寄存器。作为通用寄存器,也可存储算术逻 辑运算的操作数和运算结果。 它们可作一般的存储器指针使用。在字符串操作指令的执行 过程中,对它们有特定的要求,且具有特殊的功能 ③指针寄存器(ESP 和 EBP) 指针寄存器 32 位 CPU 有 2 个 32 位通用寄存器 EBP 和 ESP。其低 16 位对应先前 CPU 中的 SBP 和 SP, 对低 16 位数据的存取,不影 响高 16 位的数据。 寄存器 EBP、ESP、BP 和 SP 称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单 元的偏移量, 用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。 指针寄存器不可分割成 8 位寄存器。 作为通用寄存器, 也可存储算术逻辑运算的操作数和运 算结果。 它们主要用于访问堆栈内的存储单元,并且规定:
BP 为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据; SP 为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶。
④段寄存器(ES、CS、SS、DS、FS 和 GS) 段寄存器 、 、 、 、 CPU 内部的段寄存器: CS——代码段寄存器(Code Segment Register),其值为代码段的段值; DS——数据段寄存器(Data Segment Register),其值为数据段的段值; ES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值; SS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值; FS——附加段寄存器(Extra Se

gment Register),其值为附加数据段的段值; GS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值。 在 16 位 CPU 系统中,它只有 4 个段寄存器,所以,程序在任何时刻至多有 4 个正在使用的 段可直接访问;在 32 位 微机系统中,它有 6 个段寄存器,所以,在此环境下开发的程序最多可同时访问 6 个段。 32 位 CPU 有两个不同的工作方式:实方式和保护方式。在每种方式下,段寄存器的作用是 不同的。有关规定简 单描述如下: 实方式: 前 4 个段寄存器 CS、DS、ES 和 SS 与先前 CPU 中的所对应的段寄存器的含义完 全一致,内存单元的逻辑 地址仍为“段值:偏移量”的形式。为访问某内存段内的数据,必须使用该段寄存器和存储单 元的偏移量。 保护方式: 在此方式下,情况要复杂得多,装入段寄存器的不再是段值,而是称为“选择 子”(Selector)的某个值。 注:这里特别提供 FS 寄存器的偏移说明 FS 寄存器指向当前活动线程的 TEB 结构(线程结构) 偏移 说明 000 指向 SEH 链指针 004 线程堆栈顶部 008 线程堆栈底部 00C SubSystemTib 010 FiberData 014 ArbitraryUserPointer 018 FS 段寄存器在内存中的镜像地址 020 进程 PID 024 线程 ID 02C 指向线程局部存储指针 030 PEB 结构地址(进程结构)
034 上个错误号 举例: POP DWORD PTR FS:[004] 这个句指令的意思就是将堆栈顶部的 4 个字节的字符弹栈出去!
⑤指令指针寄存器(EIP) 指令指针寄存器 32 位 CPU 把指令指针扩展到 32 位, 并记作 EIP, 的低 16 位与先前 CPU 中的 IP 作用相 EIP 同。 指令指针 EIP、IP(Instruction Pointer)是存放下次将要执行的指令在代码段的偏移量。在具有 预取指令功 能的系统中,下次要执行的指令通常已被预取到指令队列中,除非发生转移情况。所以,在 理解它们的功能 时,不考虑存在指令队列的情况。 在实方式下,由于每个段的最大范围为 64K,所以,EIP 中的高 16 位肯定都为 0,此时,相 当于只用其低 16 位 的 IP 来反映程序中指令的执行次序。

BY:陨落星辰

相关文档
最新文档