gpt4 book ai didi

windows - FASM 汇编程序在退出前等待

转载 作者:可可西里 更新时间:2023-11-01 10:12:39 32 4
gpt4 key购买 nike

这是我在 FASM 中使用的代码:

format PE console
entry main

include '..\MACRO\import32.inc'

section '.data' data readable writeable
msg db "привіт!",0dh,0ah,0 ;hi
lcl_set db ?

section '.code' code readable executable
main:
;fail without set locale
push msg
call [printf]
pop ecx

;succeed with set locale
push msg
call _liapnuty
pop ecx

push 0
call [ExitProcess]

_liapnuty:
push ebp
mov ebp, esp
;sub esp, 0
mov ebx,[ebp+8] ; 1st arg addr

mov al, [lcl_set]
or al, al
jnz _liapnuty_rest
call __set_locale

_liapnuty_rest:
push ebx
call [printf]
pop ebx

mov esp, ebp
pop ebp
ret 0

__set_locale:
mov al, [lcl_set]
or al, al
jnz __set_locale_rest

push 1251
call SetConsoleCP
call SetConsoleOutputCP
pop ecx
mov [lcl_set], 1

;push lcl
;call [system]
; pop ecx
; mov [lcl_set], 1

;push cls
;call [printf]
; pop ecx

__set_locale_rest:
ret 0


section '.idata' import data readable
library kernel,'kernel32.dll',\
msvcrt,'msvcrt.dll'

import kernel,\
SetConsoleCP,'SetConsoleCP',\
SetConsoleOutputCP,'SetConsoleOutputCP',\
ExitProcess,'ExitProcess'

import msvcrt,\
printf,'printf'

它几乎完美地工作,除了在退出之前它出于某种原因等待一秒钟。它几乎立即输出数据,但无法快速关闭。如果原因是使用这些库或在调用 ExitProcess 后没有清除堆栈(这显然无法完成),请告诉我,我很乐意接受这个答案,但我想 100% 确定我在做一切正确。

最佳答案

所有这一切的原因是因为 kernel32 函数在返回时自行弹出它们的参数。如果我删除不必要的持久性有机污染物,它会再次开始快速工作。当然,该程序仍然在堆栈损坏的情况下运行,但它在最后做了很多损坏控制。这就是为什么它很慢,但仍然有效的原因。对于面临此问题的每个人,请务必小心调用约定。

为了调试应用程序并找出错误,我使用了 OLLYDBG。它是免费的,而且有效。它可以帮助您调试 EXE 和 DLL,允许一次执行一个命令。它还显示内存、堆栈以及所有寄存器和标志。

使用堆栈,我发现它已损坏。 OLLYDBG Screen

关于windows - FASM 汇编程序在退出前等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53147078/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com