SRCs de YST.

Iniciado por YST, 2 Abril 2009, 09:07 AM

0 Miembros y 3 Visitantes están viendo este tema.

Arkangel_0x7C5

Cita de: YST en  4 Abril 2009, 00:28 AM
Cita de: Arcangel_0x7C5 en  4 Abril 2009, 00:12 AM
A y no entiendo el porque de tanto "push" y "pop"
No es mas facil hacer mov a un registro

La razón principal es que quise que se explicara un poco el code mediante las variables  y no se puede hacer un "mov  [AddressOfNames].dword[ebx+20h] " esa es la razón , aunque facilmente se pueden eliminar todas las variables.
y no se puede hacer mov de mem a mem pero creo que era mas rapido de mem a reg que hacer push mem y ala inbersa. ya te digo que yo no mido la velocidad, pero como de todas maneras tienes que pasarlo a un registro para usarlo
tengo ese code con una sola variable.

Y para explicar el code puedes poner comentarios diciendo lo que haces y a donde apunta.

En esa comunidad no somos muchos los que siempre escribimos, por eso suele haber buen nivel en lo que se postea

Saludos

YST

#21
Arregle un poco el coidigo ( lo que se puede arreglar estnado cansado ) , mañana si gustan lo termino de arreglar.
salu2


Código (asm) [Seleccionar]
proc GetAddressFunction,LibHandle,Api
locals
AddressOfNames dd ?
AddressOfFunctions dd ?
endl
push ebx  edx  edi  ecx    esi
mov eax,[LibHandle]
cmp eax,NULL
je .Error
mov ebx, dword[eax + 03Ch]
add ebx,eax
cmp word[ebx],"PE"
jne .Error
mov esi,dword[ebx+078h]
mov ebx,esi
add ebx,eax
push dword[ebx+20h]
pop [AddressOfNames]
add    [AddressOfNames] ,eax
mov ecx,dword[ebx+018h]
mov edi,0
mov ebx,esi
add  eax ,ebx
push   dword[eax+1ch]
pop [AddressOfFunctions]

.encontrar:
dec ecx
mov eax, 0x4
 mul edi
mov ebx,eax
add ebx,[AddressOfNames]
 mov eax, [ebx]
add eax, [LibHandle]
inc edi
 stdcall comparar, [Api], eax
 cmp ecx,NULL
 je .Error
 cmp eax, 0
jne .encontrar
dec edi
rol edi,2
mov eax,edi
add eax, [AddressOfFunctions]
add eax,[LibHandle]
mov eax, dword[eax]
add eax,[LibHandle]
pop  esi ecx edi edx ebx
ret
.Error:
xor eax,eax   ; xor eax,eax = NULL
pop  esi ecx edi edx ebx
ret
ret
endp
proc comparar ,SRC,DST
push edi ecx esi
stdcall Len,[SRC]
inc eax
mov ecx,eax
mov esi,[SRC]
mov edi,[DST]
repz cmpsb
mov eax,1
jnz Next
dec eax
Next:
pop esi ecx edi
ret
endp

proc Len , SRC
push ecx edi
mov ecx,-1
mov edi,[SRC]
mov al,0
repnz scasb
mov eax,ecx
not eax
dec eax
pop edi ecx
ret
endp


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

Arkangel_0x7C5

mi code es este, es masm pero tanpoco cambia tanto.

Código (asm) [Seleccionar]

Getproadress proc PBaseDll:dword, PNombreFun:dword
LOCAL NumFun
push edx
push ecx
push esi
push edi


mov edx,[PBaseDll] ;Encontrar funcion pedida en la dll especificada
cmp word ptr[edx],'ZM'
je MZ
cmp word ptr[edx],'MZ'
je MZ
NoPE:
xor eax,eax
jmp NoEncontre
MZ:
xor ecx,ecx
add edx,[edx+3ch]
cmp word ptr[edx],'EP'
jne NoPE                           ;Cabecera PE
mov edx,[edx+78h]

;Tabla de Exportaciones
mov edi,[18h+edx]
mov [NumFun],edi
add edx,[PBaseDll]     
mov edi,[edx+20h]                  ;AddressOfNames
add edi,[PBaseDll]
jmp busca
NoEs:
cmp ecx,[NumFun]
je NoEncontre
inc ecx
add edi,4
busca:
mov esi,[edi]
add esi,[PBaseDll]
push esi
push [PNombreFun]
call cmpsrt
cmp eax,0
jne NoEs
;                                AddressOfNameOrdinals
mov edi,[edx+24h]
add edi,[PBaseDll]
rol ecx,1h
add edi,ecx
movzx ecx,word ptr [edi]

;                                AddressOfFunctions
rol ecx,2h
mov esi,dword ptr [edx+1ch]
add ecx,[PBaseDll]
add ecx, esi
mov eax,[ecx]
add eax,[PBaseDll]
jmp bien
NoEncontre:
xor eax,eax
bien:
pop edi
pop esi
pop ecx
pop edx

ret 8

Getproadress endp




YST

#23
Le corregi algunas cosas inutiles , no son muchas modificaciones las que le hice a mis source pero creo que lo debo postear igual

Código (asm) [Seleccionar]
include 'win32ax.inc'
.code
start:
invoke LoadLibrary,"user32.dll"
stdcall  GetAddressFunction,eax,"MessageBoxA"
stdcall eax,0,0,0,0
invoke ExitProcess,0
proc GetAddressFunction,LibHandle,Api
locals
AddressOfNames dd ?
AddressOfFunctions dd ?
endl
push ebx  edx  edi  ecx    esi
mov eax,[LibHandle]
cmp eax,NULL
je .Error
mov ebx, dword[eax + 03Ch]
add ebx,eax
cmp word[ebx],"PE"
jne .Error
mov esi,dword[ebx+078h]
mov ebx,esi
add ebx,eax
push dword[ebx+20h]
pop [AddressOfNames]
add    [AddressOfNames] ,eax
mov ecx,dword[ebx+018h]
xor edi,edi
add  eax ,esi
push   dword[eax+1ch]
pop [AddressOfFunctions]
sub eax,esi
add [AddressOfFunctions] ,eax
.encontrar:
dec ecx
mov eax,edi
rol eax,2
add eax,[AddressOfNames]
  mov eax, dword[eax]
add eax, [LibHandle]
inc edi
  stdcall comparar, [Api], eax
  cmp ecx,NULL
  je .Error
  cmp eax, 0
jne .encontrar
dec edi
rol edi,2
mov eax,edi
add eax, [AddressOfFunctions]
mov eax, dword[eax]
add eax,[LibHandle]
pop  esi ecx edi edx ebx
ret
.Error:
xor eax,eax   ; xor eax,eax = NULL
pop  esi ecx edi edx ebx
ret
endp
proc comparar ,SRC,DST
push edi ecx esi
mov ecx,-1
mov edi,[SRC]
mov al,0
repnz scasb
mov eax,ecx
not eax
mov ecx,eax
mov esi,[SRC]
mov edi,[DST]
repz cmpsb
mov eax,1
jnz Next
dec eax
Next:
pop esi ecx edi
ret
endp
.end start


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

YST

#24
Hola ,  decidi pasar la función AntiEmulaters desarrollada por ChainCoder en el lenguaje de programación delphi a ASM , espero que les sirva

Codigo original:

Código (delphi) [Seleccionar]

Function AntiEmulaters:Boolean;
Var
UpTime            :DWORD;
UpTimeAfterSleep  :Dword;
Begin
   UpTime  := GetTickCount;
   Sleep(Strtoint('5'+'0'+'0'));
   UpTimeAfterSleep := GetTickCount;
   if ( UpTimeAfterSleep - UpTime ) < 500 Then
   Result:= True Else Result:= False;
end;


Codigo traducido:

Código (asm) [Seleccionar]

antiemulator:
push ebx ecx
invoke GetTickCount
mov ebx,eax
mov eax,2
mov ecx,250
mul ecx
invoke SleepEx,eax,FALSE ; 250 * 2= 500 ( para confundir un poco el antivirus )
invoke GetTickCount
sub eax,ebx
cmp eax,500
jl .si
mov eax,FALSE
pop ecx ebx
ret
.si:
pop ecx ebx
mov eax,TRUE
ret


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

Karcrack

Creo que al poner:
125*2*2
No confundes a ningun AV... ya que el FASM ya te lo calcula y pone el 500, talvez haciendo otras cosas, como por ejemplo esto, si que marees mas al AV:
Código (asm) [Seleccionar]
    xor ebx, ebx
    mov ecx, 500
@@: inc ebx
    loop @B


Creo que tendrias que explicar que la mayoria de Emuladores de los AVs se saltan algunas APIs... como esta... asi que, los AVs no duermen :xD

Saludos ;)

YST

#26
Cita de:  Karcrack en 04 Abril 2009, 14:11
Creo que al poner:

125*2*2

No confundes a ningun AV... ya que el FASM ya te lo calcula y pone el 500, talvez haciendo
Cierto , no me habia fijado .


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

BEATMASTER

oorale que bien suena esto recientemente empeze a tener curiosidad de como sacar las funciones de una dll :P y mira con lo que me vengo a encontrar jaja servira de mucho sobre todo apra darme una idea de como lo ahces mm una pregunta :p te devulve el nombre de las funciones y tambien que parametros y valores devuelve? por cierto muy buenos codigos   ;-)

YST

#28
Los parametros de las api's sera imposible de sacar y los valores que devuelve , no no lo toma ya que hay la unica manera que encuentro es ahcel algo como un debugger y ver que manda a eax .


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

Arkangel_0x7C5

el peso de los parámetros se podría sacar mirando los mov X ,[ebp + X], pero el tipo de valor debuelto no, porque en asm esencialmente solo hay unos pocos tipos, según el tamaño y punteros.

saludos