首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于masm32的汇编编码

基于masm32的汇编编码
EN

Stack Overflow用户
提问于 2016-01-15 21:42:17
回答 2查看 1.4K关注 0票数 0

在程序集编码中,使用masm32。

我如何才能将一个值放入一个变量中,这个变量不是在.data段中被违抗,而是通过本地解密来实现的?

图斯:

代码语言:javascript
运行
复制
.486                                    
.model flat, stdcall                    
option casemap :none                    

include \masm32\include\windows.inc     
include \masm32\macros\macros.asm       

include \masm32\include\masm32.inc
include \masm32\include\gdi32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\masm32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib


.data  

.code  

start:  

call main  
exit  

main proc  

LOCAL dewit:DWORD

mov dewit, 0
print dewit  

ret  

main endp  

end start

我试过这样的方法:

代码语言:javascript
运行
复制
Mov dewit, 0  

它不起作用。然而,这一守则:

代码语言:javascript
运行
复制
Mov dewit, input("enter a number")  

它确实有价值。

有人吗?

**本地解密只能在程序中进行。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-16 23:15:39

由于您使用的是http://www.masm32.com/,如果您试图打印一个32位的值,那么尝试用str$这样做。

代码语言:javascript
运行
复制
print str$(dewit)

这会将内存位置dewit处的32位值转换为字符串,并将该字符串打印在控制台上。这也适用于一个即时的值:

代码语言:javascript
运行
复制
print str$(100)

和一份登记册:

代码语言:javascript
运行
复制
print str$(eax)

如果希望打印无符号值,也可以使用$ustr

这些宏在MASM32 SDK附带的高级宏帮助中进行了描述。

票数 0
EN

Stack Overflow用户

发布于 2016-01-16 23:13:33

您可以在调试器中找到这种情况。以下是从调试器中查看的代码的开始:

代码语言:javascript
运行
复制
CPU Disasm
Address   Command                                  Comments
00401000  CALL 0040100C                            ; call main
00401005  PUSH 0                                   ; /ExitCode = 0
00401007  CALL <JMP.&kernel32.ExitProcess>         ; \KERNEL32.ExitProcess
0040100C  PUSH EBP                                 ; main
0040100D  MOV EBP,ESP
0040100F  ADD ESP,-4
00401012  MOV DWORD PTR SS:[LOCAL.1],0             ; dewit = 0
00401019  PUSH DWORD PTR SS:[LOCAL.1]              ; /Arg1 => 0
0040101C  CALL 00401024                            ; print
00401021  LEAVE
00401022  RETN

因此,调用print (请记住,print是一个宏,因此一旦编译,它就会展开)。记住你按了0到print

代码语言:javascript
运行
复制
CPU Disasm
Address   Command                                  Comments
00401024  PUSH EBP                                 ; print (guessed Arg1)
00401025  MOV EBP,ESP
00401027  ADD ESP,-0C
0040102A  PUSH -0B                                 ; /StdHandle = STD_OUTPUT_HANDLE
0040102C  CALL <JMP.&kernel32.GetStdHandle>        ; \KERNEL32.GetStdHandle
00401031  MOV DWORD PTR SS:[LOCAL.1],EAX
00401034  PUSH DWORD PTR SS:[Arg1]                 ; /Arg1 => [Arg1]  *** push 0 ***
00401037  CALL 00401060                            ; \so.00401060

0x00401034行中,0被推送为调用的参数。

让我们看看代码:

代码语言:javascript
运行
复制
CPU Disasm
Address   Command                                  Comments
00401060  MOV EAX,DWORD PTR SS:[Arg1]              ; eax = 0
00401064  LEA EDX,[EAX+3]
00401067  PUSH EBP
00401068  PUSH EDI
00401069  MOV EBP,80808080
0040106E  /MOV EDI,DWORD PTR DS:[EAX]              ; trying to dereference [0]... 

代码试图在地址0(也就是空指针错误)处读取,这是一个大的no no。

查看print宏在macros.asm中,似乎这个宏不进行任何格式化,然后您应该使用printf

您的代码已修复(需要msvcrt.incmsvcrt.lib用于printf宏,该宏仍在macros.asm中定义):

代码语言:javascript
运行
复制
.486                                    
.model flat, stdcall                    
option casemap :none                    

include \masm32\include\windows.inc  
include \masm32\include\msvcrt.inc  
include \masm32\macros\macros.asm       

include \masm32\include\masm32.inc
include \masm32\include\gdi32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\msvcrt.lib
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib


.data  
format_string db "value: %d", 0

.code  

start:  

    call main  
    exit  

main proc  

    LOCAL dewit:DWORD

    mov dewit, 0
    print "printing value: "
    printf ("value: %d", dewit)

    ret  

main endp  

end start

没有任何代码的代码大致相同,包括:

代码语言:javascript
运行
复制
; compile and link with:
; ml test.asm /link /subsystem:console /defaultlib:kernel32.lib /defaultlib:msvcrt.lib

.686
.model flat, stdcall
option casemap: none

ExitProcess PROTO STDCALL :DWORD

externdef _imp__printf:PTR c_msvcrt
crt_printf equ <_imp__printf>

.data
fmt db "value: %d", 0

.code
start:
    call MyFunc
    invoke ExitProcess, 0
    ret


MyFunc proc
    LOCAL foo:DWORD

    mov foo, 42

    push foo
    push offset fmt
    call crt_printf 

    ret
MyFunc endp

end start

我也完全同意@Jester:

此外,考虑不要使用助手特性,直到您也可以手动完成它,并了解汇编程序正在做什么。

宏是很棒的,但是除非您能够理解它们所做的事情并通过手工实现它们,否则您应该避免使用它们。他们对初学者的眼睛隐藏了太多的东西。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34820341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档