[ayuda]con un codigo asm,

Iniciado por ny0x, 19 Mayo 2009, 04:47 AM

0 Miembros y 1 Visitante están viendo este tema.

ny0x

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

Hesp


dwSize

    The size of the structure, in bytes. Before calling the Process32First function, set this member to sizeof(PROCESSENTRY32). If you do not initialize dwSize, Process32First fails.

Creo k hay puede estar el error por k lo tienes sin inicializar, ami parecer xD

sldos.

YST

#2
.


Yo le enseñe a Kayser a usar objetos en ASM

ny0x

muchas gracias a los dos por responder, si era el problema de la estructura, el unico problema que tengo ahora es, que no termina el proceso, pero eso debe ser un error de logica (me perdi entre tantos saltos  :P ). De eso me encargo yo.

saludos y de nuevo gracias  ;D

YST

Cita de: ny0x en 19 Mayo 2009, 20:16 PM
muchas gracias a los dos por responder, si era el problema de la estructura, el unico problema que tengo ahora es, que no termina el proceso, pero eso debe ser un error de logica (me perdi entre tantos saltos  :P ). De eso me encargo yo.

saludos y de nuevo gracias  ;D

El codigo que yo te pase me termina perfectamente los procesos , aswegurate de escribirlo bien con mayusculas y todo.


Yo le enseñe a Kayser a usar objetos en ASM

ny0x

tienes razon, ya lo cheque es que tenia mal un salto  :-X , por fin termina bien los procesos, solo es cuestion que lo organize un poco para que no paresca espagueti, Y si aprendo un poco mas de asm :¬¬ a lo mejor lo convierto en un mini administrador de tareas en modo consola.
saludos