Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Usuario887

#201
Supuse que se trataba de algo asi. No entiendo el codigo que usa el set de instrucciones MMX, pero entiendo lo que esta haciendo.

Aunque sinceramente pense que hacia uso de un ciclo para guardar los datos byte a byte.

CitarAhora podes probar sacando data2 de la estructura, data1 sera devuelto en EAX y data3 en EDX.

Me parece impresionante lo exhaustiva que llega a ser la tecnologia.

Saludos y gracias por tu respuesta.
#202
Tengo una pequeña duda...

En C es posible hacer esto:

/*...*/
struct _hdr
char data1;
double data2;
char *data3;
};

/*...*/

struct _hdr foo (void)
{
    struct _hdr instance;
    /*...*/
    return instance;
}
/*...*/


¿Como es posible hacerlo segun la convencion de llamadas de C?

CitarInteger values and memory addresses are returned in the EAX register
https://en.wikipedia.org/wiki/X86_calling_conventions

Entiendo que una estructura no es un valor entero (a menos que sea una direccion de memoria). Entonces, ¿Como haciendo uso de cdecl se puede retornar una estructura entera? La citada en el codigo no cabe siquiera en EDX:EAX.

Saludos y gracias por su atencion.
#204
ASM / Re: Problema con CommandLineToArgvW
28 Febrero 2021, 22:21 PM
Cita de: Eternal Idol en 28 Febrero 2021, 22:12 PM
Estas llamando a CommandLineToArgvW por lo que te devuelve cadenas anchas donde cada caracter ocupa 16 bits. A printf le podes pasar %ws para comprobarlo.

https://docs.microsoft.com/en-us/windows/win32/learnwin32/working-with-strings

PD. Los moderadores locales no tienen permisos para unir temas.

M*erda... tiene sentido. Con razon los siguientes 8 bits accediendos a ellos linealmente estan vacios... accedi a ellos como una prueba de su contenido.

Muchisimas gracias por tu ayuda.
#205
ASM / Problema con CommandLineToArgvW
28 Febrero 2021, 20:59 PM
Si un moderador pudiese meter todas mis preguntas en un solo tema se lo agradeceria... mis preguntas las haria en ese tema.

Estoy intentando hacer un programa sencillo utilizando el cifrado XOR para mediante una clave cifrar un archivo.

Estoy intentando que el modificador -i especifique el archivo y que el modificador -k la clave. Sin embargo la funcion CommandLineArgvW aparentemente no me esta retornando un puntero a cadenas sino un puntero a caracteres. Especificamente el primer caracter de la cadena. ¿Como hago que retorne la cadena completa?

Código (asm) [Seleccionar]

.686p
.model flat, stdcall

includelib \masm32\lib\msvcrt.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\shell32.lib

printf proto C, :vararg
exit proto C, :dword
putchar proto C, :dword
strlen proto C, :dword
strcpy proto C, :dword, :dword
strcmp proto C, :dword, :dword
memset proto C, :dword, :dword, :dword

GetCommandLineW proto stdcall
CommandLineToArgvW proto stdcall, :dword, :dword

t macro i:vararg
local s
const segment
s db i, 0
const ends
exitm <offset s>
endm

halt macro
local s
s:
jmp s
endm

.data?
db ?

.data
db ?

.code

start:
call main
invoke exit, 0h

main proc

local szFileName[256]:byte, szKey[256]:byte, szCmdLine:dword, lpArgv:dword, dwArgc:dword

invoke memset, addr szFileName, 256, 0
invoke memset, addr szKey, 256, 0

invoke GetCommandLineW
mov szCmdLine, eax

invoke CommandLineToArgvW, szCmdLine, addr dwArgc
mov lpArgv, eax

test eax, eax
jnz @0

invoke printf, t(0ah, 0dh, "Error loading command line information.")
mov eax, -1
ret

@0:

xor ecx, ecx
mov ecx, 01h
mov ebx, lpArgv

.while ecx<dwArgc

mov ebx, lpArgv
mov eax, 4
mul ecx
add ebx, eax

mov ebx, [ebx]

push ecx
invoke printf, t(0ah, 0dh, "Argument %d is %s"), ecx, ebx
pop ecx

push ecx
invoke strcmp, ebx, t("-i")
pop ecx
test eax, eax
jnz @1

push ecx

inc ecx
mov eax, 4
mul ecx
add ebx, eax

mov ebx, [ebx]

invoke strcpy, addr szFileName, ebx

pop ecx

@1:
inc ecx
.endw

ret
main endp

end start


Citarmov ebx, lpArgv
mov eax, 4
mul ecx
add ebx, eax

mov ebx, [ebx]

push ecx
invoke printf, t(0ah, 0dh, "Argument %d is %s"), ecx, ebx
pop ecx

CitarC:\Users\Programming\Desktop>console abc def

Argument 1 is a
Argument 2 is d
C:\Users\Programming\Desktop>
#206
ASM / Re: Simbolo no resuelto por el linker.
28 Febrero 2021, 19:35 PM
Pues tienes razon... me estoy acordando de los tropiezos de aprender una nueva forma de programacion.

Gracias por tu ayuda y atencion.
Saludos.
#207
ASM / Re: Simbolo no resuelto por el linker.
28 Febrero 2021, 14:17 PM
No puede ser... eso habia intentado pero con proto e invoke. ¿Por que no funciona con proto e invoke?

Código (asm) [Seleccionar]
GetCommandLineA@0 proto stdcall

CitarPOLINK: error: Unresolved external symbol '_GetCommandLineA@0@0'.

#208
ASM / Simbolo no resuelto por el linker.
28 Febrero 2021, 01:03 AM
Hola.

Estaba buscando una forma de obtener la linea de comandos desde un programa escrito para MASM con la funcion GetCommandLineA de kernel32.lib, pero el linker no resuelve el simbolo:

CitarPOLINK: error: Unresolved external symbol '_GetCommandLineA'.

Lei sobre las convenciones de llamada en un articulo mencionado por @Eternal Idol: http://unixwiz.net/techtips/win32-callconv.html#decor pero la verdad no estoy seguro de en que esta afectando esto aqui.

El codigo:

Código (asm) [Seleccionar]
.686p
.model flat, stdcall

includelib \masm32\lib\msvcrt.lib
includelib \masm32\lib\kernel32.lib

printf proto C, :dword
exit proto C, :dword

extern stdcall GetCommandLineA: proc

t macro i:vararg
local s
const segment
s db i, 0
const ends
exitm <offset s>
endm

.data?
db ?

.data
db ?

.code

start:
call main
invoke exit, 0h

main proc

call GetCommandLineA

ret
main endp

end start
#209
Bueno, 20 minutos perdidos...
Me basada en la salida de esto:

Código (asm) [Seleccionar]

invoke printf, __txt ("%d", 0dh, 0ah), sizeof _struct


que producia 128 con dos arrays de 128 bytes, pero creo que habia escrito algo mal porque ahora si se ve 256...  :huh:
#210
Llevo googleandolo 20 minutos y no logro encontrar una forma de que esto:

Código (asm) [Seleccionar]
_struct struct
data0 db 64 dup (?)
data1 db 64 dup (?)
_struct ends


funcione correctamente. Cuando compruebo el tamaño de _struct es 64 (cuando deberia ser 128).

¿Como declaro un array dentro de una estructura correctamente en MASM?

Segun la MSDN:

Citarname STRUCT ⟦alignment⟧ ⟦, NONUNIQUE⟧
field-declarations
name ENDS
https://docs.microsoft.com/es-es/cpp/assembler/masm/struct-masm?view=msvc-160

¿Cual es exactamente la sintaxis de field-declarations cuando se trata de un array?

Gracias de antemano.
Saludos.