逆向与破解-操作数定位方式实例

mac2025-10-19  9

汇编指令时逆向的基本,我们看到的最基本的都是汇编指令,存在部分反汇编工具支持将代码转换为类C代码。

前文已经转载过一篇涉及操作码和对应的功能的文章,这次则是操作数的定位方式。

以下为原文。

 

计算机只容许使用bx、si、di、bp寄存器做间接和相对寻址 其中bx为基址存储器,si、di为变址存储器   内存寻址方式:确定访问内存存储单元偏移地址的方式称为寻址方式。 直接寻址:[偏移地址] 寄存器间接寻址:[基址寄存器/变址寄存器] 寄存器相对寻址:[基址寄存器/变址寄存器+偏移量值] 基址变址寻址:[基址寄存器+变址寄存器] 相对基址变址寻址:[基址寄存器+变址寄存器+偏移量值] 注意: a 格式上的注意,正确区分寻址方式 b 五种寻址中,均可以使用段前缀     //ds:[0001H] c masm编译器编译时,代码中的直接寻址必须采用段前缀的形式  

指针寄存器包括堆栈寄存器SP(stack pointer)和基数指针寄存器BP(base pointer),变值寄存器包括源变址寄存器SI(source index)和目的变值寄存器DI(destination index)。这4个寄存器都是16位寄存器,这些寄存器在运算过程中也可以用来存放操作数(只能以字为单位),但经常的用途是在段内寻址时提供偏移地址,SP,BP一般与段寄存器SS联用,以确定堆栈寄存器中某一单元的地址,SP用以指示栈顶的偏移地址,而BP可作为堆栈区中的一个基地址,用以确定在堆栈中的操作数地址。SI,DI一般与段寄存器DS联用,以确定数据段中某一存储单元的地址,SI,DI具有自动增量和自动减量的功能,这一点使在串操作指令中用做变址非常方便,SI作为隐含的源变址DS联用,DI作为隐含的目的变址和ES连用,从而达到在数据段和附加段中寻址的目的。

BX+SI BX+DI BP+SI BP+DI

1. 直接寻址

偏移地址值直接出现在执行代码中。

mov 寄存器,[偏移地址] mov [偏移地址],寄存器

2. 寄存器间接寻址

偏移地址通过寄存器取得使用

mov 寄存器,[寄存器] mov [寄存器],寄存器 assume cs:daima daima segment mov ax,2000H mov ds,ax mov ax,1122H mov cx,3344H mov bx,0000H mov [bx],ax ;将ax值放入ds 2000:0000 mov bx,0002H mov [bx],cx ;将cx值放入ds 2000:0002 mov ax,4c00H int 21H daima ends end

3. 寄存器相对寻址

偏移地址值通过[寄存器+偏移量值]的形式运算后获得。下面的是三个实例

mov 寄存器,[寄存器+偏移量值] mov 寄存器,ds:[寄存器+偏移量值] mov [寄存器+偏移量值],寄存器 mov ds:[寄存器+偏移量值],寄存器 assume cs:code,ds:data data segment db 'abc' data ends code segment start: mov ax,data mov ds,ax mov bx,0000H mov ah,[bx+0000H] mov al,[bx+0001H] mov ax,4c00H int 21H code ends end start ;交换ds中偏移地址1和4,2和5,3和6的数据 assume cs:code,ds:data data segment db 'abcdef' data ends code segment start: mov ax,data mov ds,ax mov bx,0000H mov cx,3 A: mov ah,ds:[bx] mov al,ds:[bx+0003H] mov [bx+0003H],ah mov [bx],al inc bx loop A mov ax,4c00H int 21H code ends end start assume cs:code,ds:data data segment db 'abc' db 0H,0H,0H data ends code segment start: mov ax,data mov ds,ax mov si,0000H mov di,0003H mov cx,3 A: mov ah,[si] mov [di],ah inc si inc di loop A mov ax,4c00H int 21H code ends end start

4. 基址变址寻址方式

偏移地址值通过[基址寄存器+变址存储器]的形式运算后获得。

格式:

mov 寄存器,[基址寄存器+变址寄存器] mov [基址寄存器+变址寄存器],寄存器

实例

mov ax,[bx+si] mov ax.[bx+di] ;不可以这样 mov ax,[si+di] ;累计相加偏移地址0002H 3次。 assume cs:code,ds:data data segment db 1H,1H,2H data ends code segment start: mov ax,data mov ds,ax mov ah,00H mov bx,0000H mov si,0002H mov cx.3 A: mov al,[bx+si] add ah,al inc bx dec si loop A mov ax,4c00H int 21H code ends end start

5. 相对基址变址寻址

偏移地址值通过[基址寄存器+变址寄存器+偏移量值]的形式运算后获得。

格式:

mov 寄存器,[基址寄存器+变址寄存器+偏移量值] mov [基址寄存器+变址寄存器+偏移量值],寄存器

实例:

;取出1H、3H放入ah、al assume cs:code,ds:data data segment db 0H,0H,0H,1H,2H,3H data ends code segment start: mov ax,data mov ds,ax mov bx,0000H mov si,0001H mov ah,[bx+si+0002H] mov di,0003H mov al,[bx+di+0002H] mov ax,4c00H int 21H code ends end start

 

最新回复(0)