ya logre obtener PEB de kernel32.. y ahora como continuo?

Iniciado por Belial & Grimoire, 14 Junio 2012, 06:00 AM

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

Belial & Grimoire

hola

bueno, estoy aprendiendo asm, acabo de entender como encontrar PEB de kernel32.dll

DWORD Kerbel;

__asm{

xor eax, eax
mov eax, fs:[0x30]
mov eax, [eax+0x0C]
mov eax, [eax+0x1C]
mov eax, [eax]
mov eax, [eax+0x08]
mov Kerbel, eax

}

printf("PEB asm: %8X", Kerbel );


estuve revisndo sobre la estructura PEB, apuntar a InLoadOrderModuleList de LDR, etc...

ya lo intente y si me funciono, pero despues que tengo que hacer para encontrar LoadLibraryA?, y como podria utilizarlo para obtener la direccion con GetProcAddress de MessageBoxA y poder ejecutar un MessageBox con un mensaje?

y porcierto, porque ese mismo codigo en asm no me funciona en fasm?, cual es la diferencia?

espero me puedan orientar, salu2

.                                 

_Enko

En cuanto a la parte de fasm:

[fs:0x30]
cinvoke printf, szStrFrmt, [kerbel]


Saludos.

Belial & Grimoire

hola

gracias por responder

asi pongo el codigo con [fs:0x30], pero me aparece un error al ejecutarlo, intente depurarlo pero la verdad no entendi cual seria el error  :(

Código (asm) [Seleccionar]
include 'C:\fasm\include\win32ax.inc'

.data
Kerbel dd ?

.code
start:
xor eax, eax
mov eax, [fs:0x30]
mov eax, [eax + 0x0C]
mov eax, [eax + 0x1C]
mov eax, [eax]
mov eax, [eax + 0x08]
mov [Kerbel], eax
invoke MessageBoxA, 0, [Kerbel],0
.end start     



y encontre esto

Código (asm) [Seleccionar]
stdcall [pGetProcAddress],[BaseKernel32],"LoadLibraryA"

pero no entiendo donde o como hizo una llamada a la Api GetProcAddress, solo tiene esto

Código (asm) [Seleccionar]
proc FuncionInyectada,pGetProcAddress
locals ; Definimos las variables locales
BaseKernel32 dd ?    ;MZ de la kernel32.dll
endl
;Leemos el PEB  para obtener la base del kernel
     xor  eax, eax
     add  eax,[fs:eax+30h]
     mov  eax, [eax + 0ch]
     mov  esi, [eax + 1ch]
     lodsd
     mov  eax, [eax + 08h]
     mov [BaseKernel32],eax ;Guardamos en BaseKernel32 el MZ de la kernel32.dll


y no veo como llamo  a la API, talvez es porque estoy acostumbrado a que en C se escribe que api necesitas porque aqui no lo veo

y tambien encontre

Código (asm) [Seleccionar]
include 'win32ax.inc'     ;Incluimos la libreria
.code                 ;Declaramos la sección de codigo .
start:  ;Entry point
invoke GetModuleHandle,"kernel32.dll"   ;Sacamos la posicion de la kernel32.dll
invoke GetProcAddress,eax,"lstrlenA"    ;Sacamos la dirección de lstrlenA de la libreria kernel32.dll
mov ebx,eax                             ;Guardamos la direccion de lstrlenA en ebx
ret ; salimos
.end start ;Establecemos el EntryPoint y el


crees que si hago algo asi funcione?
Código (asm) [Seleccionar]
include 'C:\fasm\include\win32ax.inc'

.data
Kerbel dd ?

.code
start:
xor eax, eax
mov eax, [fs:0x30]
mov eax, [eax + 0x0C]
mov eax, [eax + 0x1C]
mov eax, [eax]
mov eax, [eax + 0x08]
mov [Kerbel], eax
invoke GetProcAddress, [Kerbel], "LoadLibraryA"
invoke GetModuleHandle, "user32.dll"
invoke GetProcAddress, eax, "MessageBoxA"

mov ebx, eax

push 0
push "hola"
push 0
push ebx
.end start


XD... bueno la verdad no se que hice, espero me puedan ayudar, porke no se como mas podria empezar

salu2
.                                 

x64core

El problema es que solo estas haciendo copy - paste y quiza ni sabes lo basico de lenguaje ensamblador ( no lo digo de mal forma )
solo viendo tu codigo

y eso de...
Citarcrees que si hago algo asi funcione?
que es eso? crees que no seria mucho más seguro y rapido comprobarlo por vos mismo y tratar de ensamblar y depurar el codigo para ver si funciona?
si se obtiene lo que esperas es porque funciona no? sino hay que depurar.

para saber como usar la W32 esta la MSDN.


_Enko

Tampoco dices que es lo que quieres lograr.

No pudes utilizar win32ax.inc si no quieres tener una sección de imports. Porque ese conjunto de macros te agrega todos los imports automáticamente.

A ningún antivirus le gustan las ejecutables que no tengan una sección con imports.

Иōҳ

Eres adicto a la Ing. Inversa? -> www.noxsoft.net

MCKSys Argentina

#7
Esto esta en los ejemplos del paquete MASM: \masm32\examples\exampl06\mob\noimport

Aca se saca la base del Kernel del stack. Creo que sacarlo de la PEB es mejor.. :)

Espero te sirva


; =======================================
; NO_IMPORT by mob aka drcmda
; this program demonstrates how to write
; portable code... this code could be
; added to other executables with no prob.
; i'm over that virus shit so don't waste
; your time... i'm working on something
; like a executable patcher right now so
; portable code was very interesting for
; me...................................
; if you want to use other apis or other
; dll's then use this structure:
; 00      db ?? ;lenght of name
; 01 - ?? db ?? ;API name
; ??      dd ?? ;pointer
; then use 'GetApis' to find their
; pointers so you don't have to search
; the pointers with GetModuleHandle
; write to drcmda@gmx.de
; =======================================

; ---------------------------------------------------
; Build with MAKEIT.BAT to merge the .text and .data
; sections. Result is a 1024 byte length EXE file.
; ---------------------------------------------------

.486
.Model      Flat, Stdcall
Option      Casemap:None

.Data

; kernel32.dll api's
___Kernel32         db 14,"GetProcAddress"
_Getprocaddress     dd 0
                   db 11,"LoadLibrary"
_Loadlibrary        dd 0

; ntdll.dll api's
___ntdll           db 12,"ZwCreateFile"
_ZwCreateFile        dd 0

_Kernel             Dd 0
_Default            Dd 0
_ntdll db "ntdll.dll",0
 

.Code      
   
Start:
           Call    Delta
Delta:
           Pop     Ebp                                 ; get deltaofs    
           Sub     Ebp,Offset Delta                    ; for portability        
           
           Call    Get_Kernel                          ; get kernel base/set default
           
           Push    2                                   ; 3 api's in the kernel32 struc
           pop     Ecx
           Lea     Esi,[Ebp+Offset ___Kernel32]                                          
           Call    Get_Apis                            ; get kernel apis
                     
           Lea     Eax,[Ebp+Offset _ntdll]            ; load ntdll.dll
           Push    Eax
           Call    [Ebp+_Loadlibrary]            
           
           test    Eax,Eax
           jz      Error_Exit

           Mov     [Ebp+Offset _Default],Eax           ; store result in 'default'

           push    1                                   ; 4 api's in the user32 struc
           pop     Ecx
           Lea     Esi, [Ebp+Offset ___ntdll]                                          
           Call    Get_Apis                            ; get user32 apis          
                                 
           Push    -1
           Call    [Ebp+_Messagebeep]                  ; beep
           
           Push    0
           Call    _t02
           db      "little test",0
_t02:       Call    _t01
           db      "MessageBox without imports, funny eh?",0
_t01:       Push    0
           Call    [Ebp+_MessageBox]                   ; messagebox

Error_Exit:                                
           Push    0
           Call    [Ebp+_Exitprocess]                  ; get out


; ######################## get kernel ########################
; returns kernelbase and stores it in 'default' and 'kernel'
Get_Kernel:
           Mov     Ecx,[Esp+4] ; get kerneladdr from stack
           
Kernel_Loop:
           Xor     Edx,Edx
           Dec     Ecx
           Mov     Dx,[Ecx+3Ch]
           Test    Dx,0F800H
           Jnz     Kernel_Loop
           Cmp     Ecx,[Ecx+Edx+34H]
           Jnz     Kernel_Loop            
           Mov     [Ebp+Offset _Kernel],Ecx
           Mov     [Ebp+Offset _Default],Ecx                                            
           Ret

; ######################## get apis   ########################
; default   = dll base
; ecx       = number of api's in the structure
; esi       = pointer to structure
Get_Apis:  
           Xor     Ebx,Ebx
Api_Loop:
           Inc     Esi         ; scan through the api
           Push    Ecx         ; table and try to
           Movzx   ecx, byte ptr [Esi-1] ; addresses...                
           Push    Ecx
           Call    Get_Api
           Pop     Ebx
           Pop     Ecx
           Add     Esi,Ebx            
           Mov     [Esi],Eax
           Add     Esi,4
           Loop    Api_Loop
           Ret      

; ######################## get api    ########################
; default = dll base
; ecx     = structure entry
Get_Api:  
           Mov     Edx, [Ebp+Offset _Default]
           Add     Edx, [Edx+3Ch] ; get default module        
           Mov     Edx, [Edx+78H]
           Add     Edx, [Ebp+Offset _Default]

           Mov     Edi, [Edx+32] ;Get Addrofnames
           Add     Edi, [Ebp+Offset _Default]
           Mov     Edi, [Edi] ;Get Addrofnames
           Add     Edi, [Ebp+Offset _Default]
           Mov     Eax, [Edx+24] ;Get Numberofnames                                  
           Xor     Ebx,Ebx
Next_One:            
           Push    Ecx
           Inc     Ebx          
           Push    Esi
           Push    Edi
           Repz    Cmpsb ; compare api with export
           Pop     Edi
           Pop     Esi
           Jnz     Not_Found            
           Pop     Ecx
           Mov     Ecx, [Edx+36] ;Get Addrnameord
           Add     Ecx, [Ebp+Offset _Default]
           Dec     Ebx
           Movzx   eax, word ptr [Ecx+Ebx*2]                        
           Mov     Ebx, [Edx+28] ;Get Addroffunctions
           Add     Ebx, [Ebp+Offset _Default]
           Mov     Eax, [Ebx+Eax*4]                
           Add     Eax, [Ebp+Offset _Default]
           Ret
Not_Found:  
           Dec     Edi            
Loop_1:
           Inc     Edi
           Cmp     Byte Ptr [Edi],0
           Jnz     Loop_1

           Inc     Edi            
           Dec     Eax
           Jz      Exit_Search            
           Pop     Ecx
           Jmp     Next_One
Exit_Search:  
           Jmp     Error_Exit
           Ret                        
       
End         Start
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Belial & Grimoire

CitarRHL

El problema es que solo estas haciendo copy - paste y quiza ni sabes lo basico de lenguaje ensamblador ( no lo digo de mal forma )
solo viendo tu codigo

que es eso? crees que no seria mucho más seguro y rapido comprobarlo por vos mismo y tratar de ensamblar y depurar el codigo para ver si funciona?
si se obtiene lo que esperas es porque funciona no? sino hay que depurar.

jeje yo se que parece un copy - paste, pero si e investigado sobre la estructura PEB, incluso en el primer post describo que estudie el como encontrarlo, talvez hay formas mas optimas pero apenas estoy empezando con ASM por eso no puedo hacer todavia algo mas optimo

el problema tambien esta en que no encuentro tutoriales ASM con ejercicios, solo encuentro con 3 ejercicios, un "hola mundo", un MessageBoxA y una GUI

asi que pues decidi, hacer cosas que hago en C, pero en ensamblador para irme acostumbrando

Y si trate de comprobarlo pero no me funciono, y preferi poner un intento fallido, a no poner nada y que piensen que estoy esperando que alguien me haga todo


CitarmDrinky

http://el-blog-de-thor.blogspot.com.es/2011/05/usando-getprocaddress-y-loadlibrary_07.html

gracias, de aqui encontre la explicacion de la estructura PEB y esta parte no la habia visto

Citar_Enko
Tampoco dices que es lo que quieres lograr.

No pudes utilizar win32ax.inc si no quieres tener una sección de imports. Porque ese conjunto de macros te agrega todos los imports automáticamente.

A ningún antivirus le gustan las ejecutables que no tengan una sección con imports.

pues de hecho si lo hice, en el primer post comente que queria saber como encontrar las direcciones para ejecutar un messagebox con un mensaje

algo parecido a C

Este codigo sencillo es mio, no vayan a pensar que lo copie  ;D

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

typedef int (CALLBACK *MSBX)(HWND, LPCTSTR, LPCTSTR, UINT);

int main(int *argv, char *argc){

HMODULE han;
MSBX msgbox;

han = LoadLibrary(L"User32.dll");
msgbox = (MSBX)GetProcAddress(han, "MessageBoxA");

msgbox(NULL,"mensaje","exito!!", NULL);

}


a lo de win32ax solo lo puse porque me dijeron que si ponia eso, ya no era necesario imports, pero entonces creo mejor lo quitare y me acostumbrare a los imports  ;D

CitarИōҳ

Tienes que estudiar el Formato PE.

pues si los estuve estudiando, de hecho fui el que mas pregunto en el taller de "The Swash", la verdad me ayudo mucho su taller, logre aprender bastante

CitarMCKSys Argentina
Esto esta en los ejemplos del paquete MASM: \masm32\examples\exampl06\mob\noimport

Aca se saca la base del Kernel del stack. Creo que sacarlo de la PEB es mejor.. :)

gracias, pero eso es lo que estoy tratando de encontrar es despues de kernel32, que mas sigue, por eso pedia saber que mas necesito estudiar o entender para poder continuar, digo no busco que me pongan el codigo, sino que tengo que aprender o buscar para poder avanzar y si llegara a tener problemas, esperar que alguien aqui me pueda orientar, sobre que podria estar haciendo mal

bueno, espero me pudan ayudar

salu2
.                                 

_Enko

#9
Si quieres un MessageBox haces esto:
Citar
; example of simplified Windows programming using complex macro features

include '%fasminc%\win32ax.inc' ; you can simply switch between win32ax, win32wx, win64ax and win64wx here
.data
  msg db '..........',0
.code

 start:
   invoke   MessageBox,HWND_DESKTOP,msg,msg,MB_OK
   invoke   ExitProcess,0

.end start
Y todo el demás embrollo es innecesario.
Ahora, si quieres un Messagebox sin tener que usar el import de MessageBoxA ... no lo has dicho en su momento.

El codigo de C que pasaste en assembly se va a ver muy parecido. Importas LoadLibrary y la usas para conseguir el resto de las direcciones.



invoke LoadLibrary, szUSER32
invoke GetProcAddress, eax, szMessageBoxA
mov  [MsgBox], eax

stdcall [MsgBox], HWND_DESKTOP, msg, msg, MB_OK
invoke MsgBox, HWND_DESKTOP....