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ú

Temas - ny0x

#1
ASM / [ASM]Algoritmo de Ordenacion Quicksort
24 Junio 2009, 04:04 AM
Bueno aqui les dejo una traduccion a ensamblador del algoritmo de QuickSort me costo algo de trabajo y estuve un buen depurando pero por fin salio.
Lo malo es que solo funciona con numeros de 32 bits positivos pero se puede arreglar para que funcionen con bytes y words (ahora lo de negativos no se intente cambiar jl y jg por jb y ja pero me los pone como mayores que cualquier positivo)

Si de casualidad alguien no entiende el codigo que me diga y le pongo comentarios   ;)

Código (asm) [Seleccionar]

format pe console
include '\fasm\include\win32ax.inc'
entry start
.data
vector          dd      32,9,11,5,99,3,1,2,5,12,100,4365
formato         db      '%i %i %i %i %i %i %i %i %i %i %i %i',13,10,0
.code
start:
       call Dump
       push 11
       push 0
       push vector
       call quicksort
       call Dump

ret

quicksort:
        push ebp
        mov ebp,esp
        push esi
        push ebx
        push ecx
        push edx
        mov ebx,dword[ebp + 12]
        mov ecx,dword[ebp + 16]
        cdq
        mov eax, ebx
        add eax, ecx
        push ecx
        mov ecx,2
        div ecx
        pop ecx
        xchg edx,eax
        mov esi, [ebp + 8]
        mov edx,dword[esi + edx * 4]
        qs@L1:
               qs@L1@L1:
                       cmp dword[esi + ebx * 4],edx
                       jge qs@L1@L1@out
                       inc ebx
                       jmp qs@L1@L1
               qs@L1@L1@out:
               qs@L1@L2:
                       cmp dword[esi + ecx * 4],edx
                       jle qs@L1@L2@out
                       dec ecx
                       jmp qs@L1@L2
               qs@L1@L2@out:
               qs@L1@IF1:
                       cmp ebx, ecx
                       jg qs@L1@IF1@out
                       mov eax, dword[esi + ebx * 4]
                       xchg eax, dword[esi + ecx * 4]
                       mov dword[esi + ebx * 4], eax
                       inc ebx
                       dec ecx
               qs@L1@IF1@out:
               cmp ebx,ecx
               jle qs@L1
        qs@L1@out:
        qs@IF1:
               cmp dword[ebp + 12],ecx
               jge qs@IF1@out
               push ecx
               push dword[ebp + 12]
               push esi
               call quicksort
        qs@IF1@out:
        qs@IF2:
               cmp ebx, dword[ebp + 16]
               jge qs@IF2@out
               push dword[ebp + 16]
               push ebx
               push esi
               call quicksort
        qs@IF2@out:
        pop edx
        pop ecx
        pop ebx
        pop esi
        pop ebp
retn 12

Dump:
       pushad
       mov edi,vector
       push dword[edi + 11 * 4]
       push dword[edi + 10 *4 ]
       push dword[edi + 9 * 4]
       push dword[edi + 8 * 4]
       push dword[edi + 7 * 4]
       push dword[edi + 6 * 4]
       push dword[edi + 5 * 4]
       push dword[edi + 4 * 4]
       push dword[edi + 3 * 4]
       push dword[edi + 2 * 4]
       push dword[edi + 1 * 4]
       push dword[edi]
       push formato
       call [printf]
       add esp,52
       popad
ret
section '.idata' import data readable
library msvc,'msvcrt.dll'
import msvc,printf,'printf'


los parametros se pasan por la pila
y son asi
quicksort(int *vector, int izq, int der)
#2
hola tengo un problema, estoy tratando de aprender algo de las syscalls de linux con asm pero tengo un problema, mi codigo no funciona, el comportamiento es el siguiente.

se supone que pide un texto e imprime su longitud pero sucede:
pide texto, falla de segmentacion
la consola toma lo que tecle y me dice como que si lo hubiera escrito como un comando ejemplo:
si en el programa pongo hola
no me imprime nada y despues la terminal me dice
bash: ola comando no encontrado

mi code es el siguiente

Código (asm) [Seleccionar]

include '/home/nyox/include/linux.inc'
format ELF executable
entry start
segment readable executable

start:
mov eax,SYS_READ
mov ebx, STDIN
mov ecx,texto
mov edx,size
int 0x80

push texto
call strlen
push eax
push numtexto
call itoa

push numtexto
call strlen

mov edx,eax
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, numtexto
int 0x80


mov eax, SYS_EXIT
xor ebx,ebx
int 0x80

strlen:
push edi
xor ecx,ecx
mov edi, [esp + 8]
not ecx
xor eax,eax
cld
repne scasb
not ecx
pop edi
add eax,ecx
dec eax
retn 4

strrev:
        push ebp
        mov ebp,esp
        push edi
        mov edi,[ebp + 8]
        push edi
        call strlen
        xor ecx,ecx
        dec eax
        jmp LL1
        LL0:
                dec eax
                inc ecx
                cmp ecx,eax
                jge LL2
        LL1:
                mov dl,byte[edi + ecx]
                xchg byte[edi + eax],dl
                mov byte[edi + ecx],dl
                jmp LL0

        LL2:
        pop edi
        pop ebp
retn 4

itoa:
      push ebp
      mov ebp,esp
      pushad
      mov edi,[ebp + 8]
      mov eax,[ebp + 12]
      mov ebx,10
      L@@1:
        xor edx,edx
        div ebx
        xchg eax,edx
        or eax,48
        stosb
        mov eax,edx
        cmp eax,0
        jnz L@@1
        inc edi
        mov byte[edi],al
        push dword[ebp + 8]
        call strrev
      popad
      pop ebp
retn 8

numtexto db 5 dup(0)
texto db 10 dup(0)
size dd 9


SYS_WRITE = 4
SYS_READ = 3
STDIN = 0
STDOUT = 1

el codigo rula perfectamente en win aunque no es lo mismo porque uso printf y scanf asi que supongo que mi error esta en el uso de las syscalls a ver si me pueden echar una mano

el code en win es

Código (asm) [Seleccionar]

format PE console
entry start
include 'c:\fasm\include\win32ax.inc'
.code

start:
        invoke scanf,"%s",texto
       
        push texto
        call strlen
        push eax
        push numtexto
        call itoa

        push numtexto
        call strlen
       
        invoke printf,numtexto
leave
ret

strlen:
        push edi
        xor ecx,ecx
        mov edi, [esp + 8]
        not ecx
        xor eax,eax
        cld
        repne scasb
        not ecx
        pop edi
        add eax,ecx
        dec eax
        retn 4

strrev:
        push ebp
        mov ebp,esp
        push edi
        mov edi,[ebp + 8]
        push edi
        call strlen
        xor ecx,ecx
        dec eax
        jmp LL1
        LL0:
                dec eax
                inc ecx
                cmp ecx,eax
                jge LL2
        LL1:
                mov dl,byte[edi + ecx]
                xchg byte[edi + eax],dl
                mov byte[edi + ecx],dl
                jmp LL0

        LL2:
        pop edi
        pop ebp
retn 4

itoa:
      push ebp
      mov ebp,esp
      pushad
      mov edi,[ebp + 8]
      mov eax,[ebp + 12]
      mov ebx,10
      L@@1:
        xor edx,edx
        div ebx
        xchg eax,edx
        or eax,48
        stosb
        mov eax,edx
        cmp eax,0
        jnz L@@1
        inc edi
        mov byte[edi],al
        push dword[ebp + 8]
        call strrev
      popad
      pop ebp
retn 8
section '.data' data readable writeable
numtexto        db      5 dup(0)
texto   db      10 dup(0)
size    dd      9

section '.idata' import data readable
library msvc,'msvcrt.dll'
import msvc,printf,'printf',scanf,'scanf'


no cambia mucho solo el uso de entrada y salida

gracias de antemano
#3
Ingeniería Inversa / mi primer crackme
21 Mayo 2009, 00:12 AM
Bueno me estuve dando una vuelta por este subforo y me parecio interesante el tema de los crackmes, asi que aqui les dejo mi primer crackme en C. La respuesta es un poco obvia, pero nunca habia intentado hacer un programa de estos.
http://www.megaupload.com/?d=M51KHACB

me estare leyendo los tutos porque no pude resolver el de  invisible y eso que todos dicen que esta facil. A ver si mis pocos conocimientos de asm me ayudan :P

espero les sirva aunque sea para distraerse un rato  ;D

P.D un user incorrecto o pass incorrecta provocan una exepcion. La unica manera de que no pase es poner el verdadero user y pass

1.-Høl¥   primero  ;-) ;-)
Arkangel_0x7C5 segundo   ;-) ;-)
#4
ASM / [ayuda]con un codigo asm,
19 Mayo 2009, 04:47 AM
Hola tengo un problema, este programa pide el nombre de un proceso y despues procede a terminarlo, pero no lo hace la funcion Process32First me devuelve nul y no se porque, yo creo que pase bien los parametros, por favor ayudenme a encontrar el error, esta un poco enredado porque soy novato, lo organize lo mejor que pude

Código (asm) [Seleccionar]

format pe console
entry main
include 'c:\fasm\include\win32ax.inc'
.data
;Data begin--------------------------------------------------\
struct PROCESSENTRY32                                        ;
       dwSize                    dd              ?           ;
       cntUsage                  dd              ?           ;
       th32ProcessID             dd              ?           ;
       th32DefaultHeapID         dw              ?           ;
       th32ModuleID              dd              ?           ;
       cntThreads                dd              ?           ;
       th32ParentProcessID       dd              ?           ;
       pcPriClassBase            dd              ?           ;
       dwFlags                   dd              ?           ;
       szExeFile                 rb              MAX_PATH    ;
ends                                                         ;
pInfo                   PROCESSENTRY32                       ;
hProcess                dd              ?                    ;
hProcesses              dd              ?                    ;
TH32CS_SNAPPROCESS      equ             0x00000002           ;
NORM_IGNORECASE         equ             0x00000001           ;
LOCALE_USER_DEFAULT     equ             0x0400               ;
CSTR_EQUAL              equ             0x2                  ;
PROCESS_TERMINATE       equ             0x0001               ;
lpExe                   db              256 dup(0)           ;
;Data ends---------------------------------------------------/
.code
;Code Begins-------------------------------------------------\
main:                                                        ;
        invoke printf,"Escriba el proceso a terminar: "      ;
        invoke scanf,"%s",addr lpExe                         ;
        xor eax,eax                                          ;
        push eax                                             ;
        push TH32CS_SNAPPROCESS                              ;
        call [CreateToolhelp32Snapshot]                      ;
        cmp eax,INVALID_HANDLE_VALUE                         ;
        jne NoE1                                             ;
        push 1                                               ;
        call ErrorReport                                     ;
        jmp main@Salir                                       ;
   NoE1:                                                     ;
        mov [hProcesses],eax                                 ;
        push pInfo                                           ;
        push [hProcesses]                                    ;
        call [Process32First]                                ;
        cmp eax,FALSE                                        ;
        jne NoE2                                             ;
        push 2                                               ;
        call ErrorReport                                     ;
        jmp main@Salir                                       ;
   NoE2:                                                     ;
        bucle1:                                              ;
                push 0xFFFFFFFF                              ;
                push lpExe                                   ;
                push 0xFFFFFFFF                              ;
                push pInfo.szExeFile                         ;
                push NORM_IGNORECASE                         ;
                push LOCALE_USER_DEFAULT                     ;
                call [CompareString]                         ;
                cmp eax,CSTR_EQUAL                           ;
                jne Next                                     ;
                push pInfo.th32ProcessID                     ;
                push FALSE                                   ;
                push PROCESS_TERMINATE                       ;
                call [OpenProcess]                           ;
                cmp eax,0                                    ;
                je Next                                      ;
                mov [hProcess],eax                           ;
                push 0                                       ;
                push [hProcess]                              ;
                call [TerminateProcess]                      ;
                push [hProcess]                              ;
                call [CloseHandle]                           ;
                                                             ;
           Next:                                             ;
                push pInfo                                   ;
                push [hProcesses]                            ;
                call [Process32Next]                         ;
                cmp eax,FALSE                                ;
                je FinBucle1                                 ;
        jmp bucle1                                           ;
        FinBucle1:                                           ;
        push [hProcesses]                                    ;
        call [CloseHandle]                                   ;
main@Salir:                                                  ;
                                                             ;
leave                                                        ;
ret                                                          ;
;Main Ends''''''''''''''''''''''''''''''''''''''''''''''''''';
;ErrorReport Begins'''''''''''''''''''''''''''''''''''''''''';                                                             ;
proc ErrorReport,raz                                         ;
call [GetLastError]                                          ;
cmp [raz],1                                                  ;
je @0                                                        ;
cmp [raz],2                                                  ;
je @1                                                        ;
cmp [raz],3                                                  ;
je @2                                                        ;
jmp @def                                                     ;
@0:                                                          ;
        invoke printf,"Error Handle Invalido code %d ",eax    ;
        jmp Error@Salir                                      ;
@1:                                                          ;
        invoke printf,"Error cannot open the process ",eax    ;
        jmp Error@Salir                                      ;
@2:                                                          ;
        jmp Error@Salir                                      ;
@def:                                                        ;
        invoke printf,"Error desconocido code %d ",eax        ;
Error@Salir:                                                 ;
call [GetLastError]                                          ;
invoke printf,"%d",eax                                       ;
leave                                                        ;
ret                                                          ;
endp                                                         ;
;ErrorReports ends''''''''''''''''''''''''''''''''''''''''''';
;.code ends--------------------------------------------------/
section '.idata' import data readable
library k32,'kernel32.dll',msv,'msvcrt.dll'
import k32,CreateToolhelp32Snapshot,'CreateToolhelp32Snapshot',\
GetLastError,'GetLastError',Process32First,'Process32First',\
       CompareString,'CompareStringA', OpenProcess,'OpenProcess',\
       TerminateProcess,'TerminateProcess', \
       CloseHandle,'CloseHandle',Process32Next,'Process32Next'
import msv,printf,'printf',scanf,'scanf'


saludos
#5
ASM / [Ayuda]con punteros en asm
12 Mayo 2009, 19:44 PM
Hola a todos quiero aprender a programar en asm, porque he oido que es el lenguaje mas rapido que hay, y tambien estoy enterado de todas sus desventajas. Pero bueno mi duda es esta como puedo usar punteros en asm.
Ya se que es un poco pronto porque estoy empezando. Pero esto de practicar mientras aprendo me ha servido, antes mi idea es hacer una funcion para sacar la longitud de una cadena usando el caracter nulo. Para esto necesito hacer un puntero que apunte al principio de una cadena para irlo incrementndo pero no se nada estoy en cero. Bueno se lo basico como los registros, algunas instrucciones pero hasta ahi nada mas.
No estoy pidiendo que me den una funcion hecha sino que me guien a como la puedo hacer yo.

gracias