逆向与汇编的一些笔记

原创 2013年12月04日 22:29:59

寄存器

EAX:累加寄存器

EBX:基址寄存器

ECX:计数寄存器

EDX:数据寄存器

ESI:来源寄存器

EDI:目标寄存器

EBP:基址指针寄存器

ESP:堆栈指针寄存器

EIP:指令指针寄存器

 

条件跳转指令

ja  CF=0 and ZF=0

jab CF=0

jb   CF=1

jbe  CF=1 of ZF =1

jcxz  CX=0

je     ZF=1

jecxz   ECX=0

jg   ZF=0  and    SF=OF

jge  SF=OF

jl  SF!=OF

jle  ZF=1   or SF!=OF

jmp  无条件跳转

jna  CF=1 or  ZF=1

jnae  CF=1

jnb   CF=0

jnbe  CF=0 and ZF=0

jnc     CF=0

jne     ZF=0

jng     ZF=1 or SF!=OF

jnge   SF!=OF

jnl       SF=OF

jnle     ZF=0 and SF=OF

jno      OF=0

jnp      PF=0

jns      SF=0

jnz      ZF=0

jo       OF=1

jp       PF=1

jpe    PF=1

jpo     PF=0

js      SF=1

jz      ZF=1

 

标志位

Z标志位(0标志),这个标志位是最常用的,运算结果为0时候,Z标志位置1,否则置0。

O标志位(溢出标志),在运行过程中,如操作数超出了机器能表示的范围则称为溢出,此时OF位置1,否则置0。

C标志位(进位标志),记录运算时从最高有效位产生的进位值。例如执行加法指令时,最高有效位有进位时置1,否则置0。

 

cmp指令大概有以下几种格式:

cmp eax, ebx ;如果相等,Z标志位置1,否则0.

cmp eax, [404000] ;将eax和404000地址处的dword型数据相比较并同上置位。

cmp [404000], eax ;同上。

 

test指令

test eax,eax  ;如果eax的值为0,则Z标志位置1

 

逻辑运算

and eax,ebx 

or eax,ebx

xor eax,ebx

not eax

 

CALL指令

call XXX; 等于 push eip; 然后 jmp XXX;

call有以下几点调用方式 

call 404000h ;直接跳到函数或过程的地址

call eax ;函数或过程地址存放在eax

call dword ptr [eax]

call dword ptr [eax+5]

call dword ptr [<&API>] ;执行一个系统API

 

PE文件格式

PE文件结构:

DOS header

DOS stub

PE File Header

Image Optional Header

Section Table

Data Directories

Sections

 

GetModuleHandleA这个API函数用于获取程序的ImageBase(基址)

VA(VirtualAddress,虚拟地址)

RVA(RelativeVirtualAddress,相对虚拟地址)

EP(EntryPoint,程序入口点)

 

 

软件断点

设置该断点的原理是在断点处重写代码,插入一个int3中断指令,当CPU执行到int3指令的时候,OD就可以获得控制权。软件断点只能在OD的CPU界面下,在数据段它下不了,在一条指令的中间它也下不了。 

硬件断点:

这个原理跟软件断点不同,硬件断点的可行性依赖于CPU的物理支持。CPU有四个调试寄存器。如果我们想下在windows的动态链接库里下断点,需要用到硬件断点,因为用软件断点下在dll文件中是不会保存的,重启程序后将丢失断点。

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

c&c++反汇编与逆向分析学习笔记(3)--基本数据类型表现形式

千万不要小看这些数据类型,我相信你肯定不知道float型数在变参函数参数传值时发生了什么。 “小尾方式”在内存中存放数据,即按字节存放,高数据位存放在内存的低端,低数据位放在内存的高端。比如十六...
  • kyt511
  • kyt511
  • 2015年04月05日 22:17
  • 971

C++反汇编与逆向分析技术揭秘小笔记

题记:分析能力很大程度体现在分析效率上,语法细节乃至数据代码间的复杂性不应该成为主要困难   所谓逆向分析,不应该只是单纯的逆向代码,真正目标应该是逆向出代码作者的思维、意图 即透过代码分析意图...
  • xuqiqw
  • xuqiqw
  • 2012年06月29日 20:23
  • 2337

C++反汇编与逆向之识别main函数学习笔记

int main(int argc, char* argv[]) { // main(int 1, char * * 0x00380d70) line 7 // mainCRTStartup(...

C++反汇编与逆向分析之数据类型的基本表现学习笔记

float GetFloat() { return 12.25f; } void Add(int &nVar) { nVar++; } int main(int argc, char* arg...

反汇编与逆向分析技术_笔记

1.c++数据结构的底层表述形式 1.内存中数据采用16禁制表示. 一字节=2个十六进制 , 一个16进制 = 4个二进制  二进制 = 一位  (so, 一个字节 = 8 bit) 2....
  • xue_you
  • xue_you
  • 2013年05月11日 20:48
  • 1113

Android逆向基础笔记—Android中的常用ARM汇编指令

Android中的反编译是,我们常常会用到一些ARM汇编指令。这里我收集一些,供大家参考。...

c&c++反汇编与逆向分析学习笔记(5)--加法的求值过程和编译器优化

学了逆向分析之后,发现,虽然我们写了程序,但是程序并不是按完全按照我们写的代码一句 一句执行的,很有可能一大部分代码都被编译器优化修改了。只有了解这些东西,我们才能写出 性能更加优益,可读性与精炼...
  • kyt511
  • kyt511
  • 2015年04月10日 11:34
  • 689

Android逆向基础笔记—Android中的常用ARM汇编指令

一  ARM寄存器 1.通用寄存器 1).未分组寄存器:R0~R7 2).分组寄存器:R8~812 R13:SP,常用作堆栈指针,始终指向堆栈的顶部,当一个数据(32位)推入堆...

c&c++反汇编与逆向分析学习笔记(8)--除法表达式

除法运算对应的汇编指令分为有符号idiv和无符号div两种。除法指令的执行周期较长,效率也低,所以编译器想尽办法用其他运算指令代替除法指令。C++中的除法和数学中的除法不同。在C++中,除法运算不保留...
  • kyt511
  • kyt511
  • 2015年04月11日 19:50
  • 821

pe逆向入门笔记一汇编指令学习及crackme初体验

pe逆向入门笔记一 汇编指令学习及crackme初体验 push略 pop指令 如 执行  pop eax 则栈顶的数会传给 eax这个寄存器 具体说明: 原来esp 地址为0019ff...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:逆向与汇编的一些笔记
举报原因:
原因补充:

(最多只允许输入30个字)