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 cuanto a la parte de fasm:
[fs:0x30]
cinvoke printf, szStrFrmt, [kerbel]
Saludos.
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
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.
http://el-blog-de-thor.blogspot.com.es/2011/05/usando-getprocaddress-y-loadlibrary_07.html
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.
Tienes que estudiar el Formato PE.
Saludos,
Nox.
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
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
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....
@Belial & Grimoire: Creo que te has confundido. La forma en que estas obteniendo la base del Kernel es normalmente usada en shellcodes: http://en.wikipedia.org/wiki/Shellcode
En ASM "Normal", no es necesario hacer esto porque tienes todas las APIs de Windows a tu disposicion. Como si estuvieras programando en cualquier otro lenguaje.
Me refiero a que no necesitas acceder a la PEB para obtener la base del kernel, cuando puedes hacer LoadLibrary de la DLL.
Consulta los ejemplos basico del asm que estes viendo. Los tutoriales de iczelion tambien son un buen punto de partida.
Saludos!