Autor
|
Tema: ya logre obtener PEB de kernel32.. y ahora como continuo? (Leído 7,457 veces)
|
Belial & Grimoire
Desconectado
Mensajes: 559
Tea_Madhatter
|
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
|
|
|
En línea
|
.
|
|
|
_Enko
|
En cuanto a la parte de fasm: [fs:0x30] cinvoke printf, szStrFrmt, [kerbel]
Saludos.
|
|
|
En línea
|
|
|
|
Belial & Grimoire
Desconectado
Mensajes: 559
Tea_Madhatter
|
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 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 stdcall [pGetProcAddress],[BaseKernel32],"LoadLibraryA"
pero no entiendo donde o como hizo una llamada a la Api GetProcAddress, solo tiene esto 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 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? 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
|
|
|
En línea
|
.
|
|
|
x64core
Desconectado
Mensajes: 1.908
|
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... crees 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.
|
|
|
En línea
|
|
|
|
fary
|
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
_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.
|
|
|
En línea
|
|
|
|
Иōҳ
Desconectado
Mensajes: 563
|
Tienes que estudiar el Formato PE.
Saludos, Nox.
|
|
|
En línea
|
|
|
|
MCKSys 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.. 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
|
|
« Última modificación: 15 Junio 2012, 22:36 pm por MCKSys Argentina »
|
En línea
|
MCKSys Argentina "Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."
|
|
|
Belial & Grimoire
Desconectado
Mensajes: 559
Tea_Madhatter
|
RHL
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 gracias, de aqui encontre la explicacion de la estructura PEB y esta parte no la habia visto _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 #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 Иōҳ
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 MCKSys 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
|
|
|
En línea
|
.
|
|
|
_Enko
|
Si quieres un MessageBox haces esto: ; 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....
|
|
« Última modificación: 16 Junio 2012, 16:13 pm por _Enko »
|
En línea
|
|
|
|
|
|