文档章节

学 Win32 汇编[12]: PTR、OFFSET、ADDR、THIS

涂孟超
 涂孟超
发布于 2014/09/26 15:36
字数 537
阅读 9
收藏 0

PTR: 指定要操作的数据尺寸
; Test12_1.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.data
    val db 11h, 22h, 33h, 44h, 55h, 66h, 77h, 88h

.code
main proc
    xor eax, eax             ;清空 EAX, 同 mov eax, 0
    mov eax, dword ptr val   ;
    PrintHex eax             ;44332211
    
    xor eax, eax             ;
    mov eax, dword ptr val+1 ;
    PrintHex eax             ;55443322
    
    xor eax, eax             ;
    mov ax, word ptr val     ;
    PrintHex eax             ;00002211
    
    xor eax, eax             ;
    mov al, byte ptr val     ;
    PrintHex eax             ;00000011
    ret
main endp
end main

 
 
 
 
 

 

 

  

OFFSET: 获取全局变量或标号的偏移地址
; Test12_2.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.data
    v1 db 'abcdefg', 0
    v2 dd 11223344h

.code
main proc
    PrintHex offset v1    ;00403000
    PrintHex offset v2    ;00403008
    PrintHex offset main  ;00401000 - 这里的 main 是个标号
    ret
;本例中的 offset 不能用 addr 代替
main endp
end main

 
 
 
 
 

 

 

  

ADDR: 类似 offset 也是获取变量的地址...
; Test12_3.asm
.386
.model flat, stdcall

;include    windows.inc
include    kernel32.inc
includelib kernel32.lib
include    user32.inc
includelib user32.lib

.data
    v1 dd 00434241h ;ABC
    v2 dd 00636261h ;abc

.code
main proc
    invoke MessageBox, 0, offset v1, offset v2, 0 ;现在 v1、v2 是全局变量
    invoke MessageBox, 0,   addr v2,   addr v1, 0 ;使用 offset 和 addr 均可
    invoke ExitProcess, 0
main endp
end main

 
 
 
 
 

 

 

  

获取局部变量的地址只能使用 ADDR:
; Test12_4.asm
.386
.model flat, stdcall

;include    windows.inc
include    kernel32.inc
includelib kernel32.lib
include    user32.inc
includelib user32.lib

.code
main proc
    LOCAL v1,v2
    mov v1, 00434241h
    mov v2, 00636261h
    ;invoke MessageBox, 0, offset v1, offset v2, 0  ;offset 不能获取局部变量的地址
    invoke MessageBox, 0,   addr v2,   addr v1, 0
    invoke ExitProcess, 0
main endp
end main

 
 
 
 
 

 

 

  

OFFSET 和 ADDR 的异同:
1、offset 不能获取局部变量的地址;
2、addr 只能用于调用函数(invoke)时, 不能用于赋值操作;
3、addr 面对局部变量时会转换为 lea 等指令, addr 面对全局变量时则直接调用 offset;
4、在 invoke 中应尽量使用 addr, 其他只用 offset.

THIS:
; Test12_5.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.data
    TextAddr equ this byte   ;伪指令 this 可让当前变量和下一个变量同址 
    szText db 'Asm', 0
.code
main proc
    PrintHex offset szText   ;00403000
    PrintHex offset TextAddr ;00403000
    
    PrintString szText       ;Asm
    mov [TextAddr], 'a'      ;给 TextAddr 赋值
    PrintString szText       ;asm
    ret
main endp
end main

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2010/04/07/1706340.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
献给汇编初学者-函数调用堆栈变化分析

标 题: 献给汇编初学者-函数调用堆栈变化分析 作 者: 堕落天才 时 间: 2007-01-19,19:20:09 链 接: http://bbs.pediy.com/showthread.php?t=38234 跟一个朋友谈堆栈的时候 就写下了这段文字...

失足处男的倒霉孩子
2014/09/04
570
2
一步一步学ROP之linux_x64篇

一步一步学ROP之linux_x64篇 一、序 **ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防御(比如内存不可执行和代...

阿里聚安全
2016/11/07
32
0
借助编译器阅读耗子叔6个变态的C语言Hello World程序

hello1.c 这段代码初步一看,有点晕,但是如果耐心下来仔细读读,从一个安全从业者的角度来说,其实就是最为初级的加密,定义了一堆宏进行替换,很容易就可以把代码还原解读了,但是有一种更...

firebroo
2016/07/12
1K
3
你想错了,并不是所有指针都是4字节。

以前自己也一直认为, 指针都一样,32机器的寻址是32位,大小都是4,原来,我一直是错的,成员函数指针的大小就不是4,不过,它应该不是普通的函数指针,看来自己以前对成员函数指针的理解太...

长平狐
2012/10/08
129
0
基于Android的ELF PLT/GOT符号重定向过程及ELF Hook实现

转自:http://blog.csdn.net/l173864930/article/details/40507359 引言 写这篇技术文的原因,主要有两个: 其一是发现网上大部分描述PLT/GOT符号重定向过程的文章都是针对x86的,比如《Red...

finallyjustice
2015/06/12
0
2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

基于TP5的微信的公众号获取登录用户信息

之前讲过微信的公众号自动登录的菜单配置,这次记录一下在TP5项目中获取自动登录的用户信息并存到数据库的操作 基本的流程为:微信设置自动登录的菜单—>访问的URL指定的函数里获取用户信息—...

月夜中徘徊
56分钟前
0
0
youTrack

package jetbrains.teamsys.license.runtime; 计算lis package jetbrains.ring.license.reader; 验证lis 安装后先不要生成lis,要把相关文件进行替换 ring-license-checker-1.0.41.jar char......

max佩恩
59分钟前
0
0
12.17 Nginx负载均衡

Nginx负载均衡 下面的dig看到可以返回2个IP,就是解析出来的IP,这样我们可以做负载均衡。 dig www.qq.com 1.vim /usr/local/nginx/conf/vhost/fuzai.conf 2.添加如下配置 upstream qq //定义...

芬野de博客
今天
0
0
SSE(Server Send Event 服务端发送事件)

package com.example.demo.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframe......

Canaan_
今天
0
0
jvm调优

1.jvm运行模式 client模式:启动快,占用内存少,jit编译器生成代码的速度也更快. server模式:主要优势在于代码优化功能,这个功能对于服务器应用而言尤其重要. tiered server模式:结合了client与...

Funcy1122
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部