首页
社区
课程
招聘
[旧帖] 寄存器作为参数的迷惑 0.00雪花
发表于: 2014-3-19 17:45 3296

[旧帖] 寄存器作为参数的迷惑 0.00雪花

2014-3-19 17:45
3296
.386
.model flat, stdcall
option casemap:none
include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.data
.code
sum proc v1, v2, v3
        PrintHex v3
    mov eax, v1
    add eax, v2
    mov [v3],eax
        mov ecx, [v3]
        PrintHex ecx
    ret
sum endp

start:
        invoke sum,1h,2h,edx
        PrintHex edx
        mov ecx,[edx]
        PrintHex ecx
    ret
end start

输出结果为:
v3 = 000D1136 (FirstAsm.asm, 15)
ecx = 00000003 (FirstAsm.asm, 20)
edx = 000D1136 (FirstAsm.asm, 26)
ecx = 6A026A52 (FirstAsm.asm, 28)

根据我现有知识,觉得应该输出下面才对啊!
v3 = 000D1136 (FirstAsm.asm, 15)
ecx = 00000003 (FirstAsm.asm, 20)
edx = 000D1136 (FirstAsm.asm, 26)
ecx = 00000003 (FirstAsm.asm, 28)

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 1904
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
edx没有赋值啊!
2014-3-19 18:15
0
雪    币: 181
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
mov [v3],eax

这里在使用,是正常的,说明不用赋值。
2014-3-20 13:32
0
雪    币: 181
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
改正了函数中的错误,但第三个参数换成esp还是不行。
.386
.model flat, stdcall
option casemap:none
include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.data
        dwVal dd 10h
.code
sum proc v1, v2, v3
        PrintHex v3
    mov eax, v1
    add eax, v2
        mov edi, v3
    add [edi],eax
        ret
sum endp

start:
        PrintLine
        PrintHex dwVal
        invoke sum,1h,2h,addr dwVal
        PrintHex dwVal
        ret
end start
2014-3-20 14:29
0
雪    币: 6
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
刚才试了试。

.386
.model flat, stdcall
option casemap:none
include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.data
.code
sum proc v1, v2, v3
  PrintHex v3
  mov eax, v3
  mov ebx, [v3]
  mov ecx, [eax]
  PrintHex eax
  PrintHex ebx
  PrintHex ecx
    ret
sum endp

start:
   PrintHex edx
  invoke sum,1h,2h,edx
    ret
end start

edx = 00401208 (a.asm, 26)
v3 = 00401208 (a.asm, 15)
eax = 00401208 (a.asm, 19)
ebx = 00401208 (a.asm, 20)
ecx = 058F5260 (a.asm, 21)

-----------------------------------------------------------------------------

mov eax, [v3] 这样只能取v3本身的值。不能像寄存器一样作为地址。

楼主第二次貌似就是这个意思啊,好好地教育了我一番啊。

楼主说的用esp不行,貌似是个寄存器都不行吧。寄存器里边放的地址值应该不能改动吧,改动意味着你意图改动这个地址值指向的内存数据的地址,非法。

记得弄数组的时候就不能改,一旦改动就不允许写,程序崩溃。

楼主再测试一下,如果有结果跟我说一下啊。谢谢了。我是刚学,还不太懂,有什么不得到的地方还望别见怪。
2014-3-20 19:43
0
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
1L

sum 使用堆栈开辟了局部变量区, 用来保存参数的副本。

mov eax,v1
mov eax,v2
mov [v3],eax

这段代码将堆栈中的副本v1, v2相加后, 并没有把结果存入 edx 指向的内存, 而是存入了堆栈中存放v3副本的地方。
也就是说, edx 指向的内存未被初始化, 其中的数值不能确定, 在 1L中就是 0x6A026A52.

4L

4L中的例子应该没问题, 如果第三个参数换成 esp, 那么会影响到进程的正常终止。在sum函数第一次压栈前,这段代码 esp 指向的4byte内存保存着终止线程的调用函数地址。当调用了sum后, 这里的指被改了, 程序崩溃。

希望我的回答对LZ有用。呵呵。
2014-3-21 19:06
0
游客
登录 | 注册 方可回帖
返回
//