Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
[Asm] Прочитать параметры
#11
Akumu Написал:Использовать функцию strcpy, вместо копирования первых 8 байт регистром rax.
https://github.com/Emeraude/MinilibC-asm...master/src к примеру

Добавлено через 42 секунды
Только буффер сразу сделайте достаточно большим

что не пойму как заюзать..:redlol:
Лучше взять и изобрести завтрашний день, чем переживать о том, что вчерашний был так себе.
Ответ
#12
Sojang Написал:что не пойму как заюзать..:redlol:

Я на самом деле 64х ассемблером не увлекался никогда... В rsi указатель на исходную строку, в rdi буффер куда будет скопирована строка.

Код:
    global strcpy
    section .text

strcpy:
    push rbp
    mov rbp, rsp

    xor rcx, rcx
loop:
    cmp BYTE [rsi + rcx], 0
    je end
    mov al, [rsi + rcx]
    mov [rdi + rcx], al
    inc rcx
    jmp loop

end:
    mov BYTE [rdi + rcx], 0
    mov rax, rdi

    mov rsp, rbp
    pop rbp
    ret
Ответ
#13
Akumu Написал:Я на самом деле 64х ассемблером не увлекался никогда... В rsi указатель на исходную строку, в rdi буффер куда будет скопирована строка.

Код:
    global strcpy
    section .text

strcpy:
    push rbp
    mov rbp, rsp

    xor rcx, rcx
loop:
    cmp BYTE [rsi + rcx], 0
    je end
    mov al, [rsi + rcx]
    mov [rdi + rcx], al
    inc rcx
    jmp loop

end:
    mov BYTE [rdi + rcx], 0
    mov rax, rdi

    mov rsp, rbp
    pop rbp
    ret

спасибо, однако что то пошло не так:redlol:
[SRC="asm"]
.const
Init dq 140019EA8h
Printf dq 140009148h
.data
msg db 32
.code
onLog proc
mov rsi, [rcx]
mov rdi, [offset msg]
call strcpy
xor ecx, ecx
call Init
mov rcx, rax
lea rdx, msg
call Printf
ret
onLog endp

; test
strcpy proc
push rbp
mov rbp, rsp

xor rcx, rcx
strcpy endp
loopfunc proc
cmp BYTE ptr [rsi + rcx], 0
je endfunc
mov al, [rsi + rcx]
mov [rdi + rcx], al
inc rcx
jmp loopfunc
loopfunc endp
endfunc proc
mov BYTE ptr [rdi + rcx], 0
mov rax, rdi

mov rsp, rbp
pop rbp
ret
endfunc endp

end
[/SRC]
вот такой код не работаетSad
Лучше взять и изобрести завтрашний день, чем переживать о том, что вчерашний был так себе.
Ответ
#14
все еще актуально..
Лучше взять и изобрести завтрашний день, чем переживать о том, что вчерашний был так себе.
Ответ
#15
может размер буффера ?
Ответ
#16
[SRC="asm"]format PE64 console
entry start

include 'win64a.inc'

section '.text' code readable executable

start:
lea rax,[testmsg]
call onLog
xor rax,rax
call [ExitProcess]
int3

onLog:
; fix me
mov rsi,rax ; src str
lea rdi,[msgbuf] ; dst buff
mov rdx, 511 ; max chars
call strncpy ; copt string from [rax] to [msgbuf]
retn
int3

strncpy:
push rbp
mov rbp, rsp

xor rcx, rcx
jloop:
cmp BYTE [rsi + rcx], 0
je jend
cmp rcx, rdx
je jend
mov al, [rsi + rcx]
mov [rdi + rcx], al
inc rcx
jmp jloop

jend:
mov BYTE [rdi + rcx], 0
mov rax, rdi

mov rsp, rbp
pop rbp
ret

section '.data' data readable writeable
testmsg db "This is a test message!",0
msgbuf rb 512

section '.idata' import readable writeable
library kernel32,'KERNEL32.DLL'
include 'api/kernel32.inc'[/SRC]

fasm
Ответ
#17
msg db 32 ; это буфер в один байт со значением 0x20
msg db 32 dup(0) ; надо так. это буфер в 32 байта, заполненный нулями

и если правильно понял, то
mov rsi, [rcx] ; это копирует в rsi байты по адресу
mov rsi, rcx ; а надо так, чтобы поместить в rsi сам адрес
Ответ
#18
Ugly Написал:msg db 32 ; это буфер в один байт со значением 0x20
msg db 32 dup(0) ; надо так. это буфер в 32 байта, заполненный нулями

и если правильно понял, то
mov rsi, [rcx] ; это копирует в rsi байты по адресу
mov rsi, rcx ; а надо так, чтобы поместить в rsi сам адрес

Первое копирует qword по адресу rcx в rsi
Второе копирует содержимое регистра rcx в rsi
Ответ
#19
Akumu Написал:[SRC="asm"]format PE64 console
entry start

include 'win64a.inc'

section '.text' code readable executable

start:
lea rax,[testmsg]
call onLog
xor rax,rax
call [ExitProcess]
int3

onLog:
; fix me
mov rsi,rax ; src str
lea rdi,[msgbuf] ; dst buff
mov rdx, 511 ; max chars
call strncpy ; copt string from [rax] to [msgbuf]
retn
int3

strncpy:
push rbp
mov rbp, rsp

xor rcx, rcx
jloop:
cmp BYTE [rsi + rcx], 0
je jend
cmp rcx, rdx
je jend
mov al, [rsi + rcx]
mov [rdi + rcx], al
inc rcx
jmp jloop

jend:
mov BYTE [rdi + rcx], 0
mov rax, rdi

mov rsp, rbp
pop rbp
ret

section '.data' data readable writeable
testmsg db "This is a test message!",0
msgbuf rb 512

section '.idata' import readable writeable
library kernel32,'KERNEL32.DLL'
include 'api/kernel32.inc'[/SRC]

fasm
Ugly Написал:msg db 32 ; это буфер в один байт со значением 0x20
msg db 32 dup(0) ; надо так. это буфер в 32 байта, заполненный нулями

и если правильно понял, то
mov rsi, [rcx] ; это копирует в rsi байты по адресу
mov rsi, rcx ; а надо так, чтобы поместить в rsi сам адрес
Спасибо ребят) все работает.
Мне тут кое где сказали что выделять память так(msg db 32 dup(0)) не совсем правильно..мол есть лучше способы. Можете по этому поводу подсказать?
Лучше взять и изобрести завтрашний день, чем переживать о том, что вчерашний был так себе.
Ответ
#20
Sojang Написал:Спасибо ребят) все работает.
Мне тут кое где сказали что выделять память так(msg db 32 dup(0)) не совсем правильно..мол есть лучше способы. Можете по этому поводу подсказать?

Нормально, можно еще msg rb 32, если речь про фасм
Ответ


Перейти к форуму:


Пользователи, просматривающие эту тему: 6 Гость(ей)