文档章节

学 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
深圳
程序员
私信 提问
一步一步学ROP之linux_x64篇

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

阿里聚安全
2016/11/07
32
0
献给汇编初学者-函数调用堆栈变化分析

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

失足处男的倒霉孩子
2014/09/04
765
2
借助编译器阅读耗子叔6个变态的C语言Hello World程序

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

firebroo
2016/07/12
1K
3
ptmalloc2的堆溢出利用初探(zz)

看的我直冒汗啊 :em06: ... ... ptmalloc2的堆溢出利用初探 By backend at nsfocus.com Date: 2003-09-16 ★ 目录   起因   原因   分析   突破   代码   例外   结束   参考...

zt371
2009/05/05
446
0
纯 C# 实现 Hook 功能

原文出处:zhao.yj 发布一个自己写的用于Hook .Net方法的类库,代码量不大,完全的C#代码实现,是一个比较有趣的功能,分享出来希望能和大家共同探讨 安装:Install-Package DotNetDetour 源...

zhao.yj
2016/06/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

eslint rules 规则

'rules': { "comma-dangle": ["error", "never"], //是否允许对象中出现结尾逗号 "no-cond-assign": 2, //条件语句的条件中不允许出现赋值运算符 "no-console": 2, //不允许出现console语句 ...

agenyun
15分钟前
1
0
类型判断时instanceof和equals的不同用法

接口设计时为了避免序列化的麻烦,将接口定义为参数为map<String,String>类型的接口,但是现在调用时需要转换当前的实体Bean为Map,接口接收方再把Map转换为另一个Bean实体。过程中的需要对类...

wangtx
22分钟前
1
0
vue 组件间传值(个人精编)

1.父组件向子组件传值 1⃣️.子组件标签绑定需要传递的参数名2⃣️.子组件页面使用props 接收参数 2.子组件向父组件传值  1⃣️.子组件使用$emit来触发一个自定义事件,并传递一个参...

MrBoyce
32分钟前
1
0
(荷兰)彼得·冯·门施著:博物馆学研究的目的

博物馆学研究的目的 (荷)彼得·冯·门施 尽管诸多关于博物馆学认知目的的不同看法可以被归纳为数个主要群体,但没有一个群体可以被称为“学派”。一般来说,学派是由于博物馆学研究目的的不...

乔老哥
42分钟前
2
0
Vue slot的用法

之前看官方文档,由于自己理解的偏差,不知道slot是干嘛的,看到小标题,使用Slot分发内容,就以为 是要往下派发内容。然后就没有理解插槽的概念。其实说白了,使用slot就是先圈一块地,将来...

peakedness丶
54分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部