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 - mr.blood

#111
ASM / Re: Ayuda con funcion "Split"
28 Marzo 2013, 15:56 PM
Por si te sirve lo hice en C. Si te da una idea o si quieres usarla en tu codigo de ASM.

http://foro.elhacker.net/programacion_cc/c_funcion_split-t386651.0.html

Sa1uDoS
#112
Programación C/C++ / [C] Funcion Split
28 Marzo 2013, 14:46 PM
Espero que a alguien le sirva. Yo no he visto fallos, si los encontrais, comentadlos por favor.

#include <stdio.h>
#include <malloc.h>
#include <string.h>

int len_palabra(char *cadena, int inicio, char separador);
char **split(char *cadena, char separador);

int main()
{
char cadena[]="MrBlood.split.crea.funcion";
int i;
char **retorno=split(cadena, '.');
for(i=0;retorno[i]!=NULL;i++)
{
printf("%s\n", retorno[i]);
free(retorno[i]);
}
free(retorno);
return 0;
}

int len_palabra(char *cadena, int inicio, char separador)
{
int len=0, i=inicio;
while(cadena[i]!=separador&&cadena[i]!='\0')
{
len++;
i++;
}
return len;
}

char **split(char *cadena, char separador)
{
int num_palabras=1, len_cadena=strlen(cadena), i, j=1, *inicios;
for(i=0;i<len_cadena;i++)
{
if(cadena[i]==separador)
{
num_palabras++;
}
}
inicios=malloc(sizeof(int)*num_palabras);
inicios[0]=0;
for(i=1;i<len_cadena;i++)
{
if(cadena[i]==separador)
{
inicios[j]=i+1;
j++;
}
}
char **retorno=malloc(sizeof(char *)*num_palabras+1);
retorno[num_palabras]=NULL;
for(i=0;i<num_palabras;i++)
{
j=len_palabra(cadena, inicios[i], separador);
retorno[i]=(char *)malloc(sizeof(char)*j);
strncpy(retorno[i], &cadena[inicios[i]], j);
retorno[i][j]='\0';
}
free(inicios);
return retorno;
}


Sa1uDoS

EDITO: Ahora se libera la memoria reservada con malloc.
#113
Y no hay mensaje de Felicidades?

Sa1uDoS
#114
O crea tu propia libreria, si se compila en Win las funciones son de un modo, y en Linux funcionan de otra forma.

Sa1uDoS
#115
Si he entendido bien el problema no es que no pueda hacerlo con arrays, es que aun no los han dado.




Como que no es posible sin arrays? No es eficiente ni limpio, pero posible es.

#include <stdio.h>

int main()
{
   int num;
   char num0=0, num1=0, num2=0, num3=0, num4=0, num5=0, num6=0, num7=0, num8=0, num9=0, i;
   puts("Introduce 10 numeros\n");
   for(i=0;i<10;i++)
   {
       scanf("%i",&num);
       fflush(stdin);
       switch(num)
       {
           case 0:
               num0++;
               break;
           case 1:
               num1++;
               break;
           case 2:
               num2++;
               break;
           case 3:
               num3++;
               break;
           case 4:
               num4++;
               break;
           case 5:
               num5++;
               break;
           case 6:
               num6++;
               break;
           case 7:
               num7++;
               break;
           case 8:
               num8++;
               break;
           case 9:
               num9++;
               break;
       }
   }
   if(num0>0)
   {
       printf("El 0 se repite %i veces\n", num0);
   }
   if(num1>0)
   {
       printf("El 1 se repite %i veces\n", num1);
   }
   if(num2>0)
   {
       printf("El 2 se repite %i veces\n", num2);
   }
   if(num3>0)
   {
       printf("El 3 se repite %i veces\n", num3);
   }
   if(num4>0)
   {
       printf("El 4 se repite %i veces\n", num4);
   }
   if(num5>0)
   {
       printf("El 5 se repite %i veces\n", num5);
   }
   if(num6>0)
   {
       printf("El 6 se repite %i veces\n", num6);
   }
   if(num7>0)
   {
       printf("El 7 se repite %i veces\n", num7);
   }
   if(num8>0)
   {
       printf("El 8 se repite %i veces\n", num8);
   }
   if(num9>0)
   {
       printf("El 9 se repite %i veces\n", num9);
   }
   getchar();
   return 0;
}


Otro modo mas eficiente seria algo como:

#include <stdio.h>
#include <string.h>

int main()
{
   int num, i;
   char repes[10];
   memset(repes, 0, 10);
   puts("Introduce 10 numeros\n");
   for(i=0;i<10;i++)
   {
       scanf("%i",&num);
       fflush(stdin);
       repes[num]++;
   }
   for(i=0;i<10;i++)
   {
       if(repes[i]>0)
       {
           printf("Numero %i repetido %i veces\n", i, repes[i]);
       }
   }
   getchar();
   return 0;
}


Aunque pueda mejorarse ;).

Sa1uDoS
#116
Ingeniería Inversa / Re: [Keygenme] Aspid
21 Marzo 2013, 16:40 PM
Bueno, como nadie mas se anima posteo el codigo.
Tuve que retocar la PE Section y cifrar la funcion felicita().

Para compilar
Código (consola) [Seleccionar]
fasm funcion.asm
gcc crackme.c funcion.obj -o crackme.exe


Código (asm) [Seleccionar]
format coff

public _asm_comp

       _asm_comp:
               push ebp
               mov ebp, esp

               xor eax, eax ;Limpiamos los registros
               xor ecx, ecx

               mov ebx, dword[esp+8] ;Movemos a ebx la direccion de felicita
               mov ebx, dword[ebx]
               mov edx, dword[esp+12] ;Movemos a edx la pass
               bucle:
                       xor dword[edx+ecx], ebx ;desciframos felicita
                       add ecx, 4 ;Sumamos al contador un DWORD
                       cmp ecx, 0x18 ;Comparamos el contador con 24
                       jne bucle ;Si no es igual salta a bucle
               cmp word[edx+5], 0xC718 ;Comparamos la firma (edx+5) para ver si la clave fue correcta
               je exit ;Si es igual salimos (eax=0)
               inc eax ;Incrementamos eax

               exit:
               leave
               ret



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int comp(char *cadena);
void felicita();
int asm_comp(void *buff, void *func);

int main()
{
       srand(time(NULL));
       unsigned int ID=rand()%(9999-1000)+1000, i;
       char buffer[100];
       unsigned int pass;
       printf("ID> %i\nPass> ", ID);
       scanf("%8x%s", &pass, buffer);
       if(comp(buffer)==1)
       {
               printf("Wrong pass\n");
               getchar();
               return 1;
       }

       for(i=2;i<strlen(buffer);i++)
       {
               ID-=buffer[0]+buffer[i];
       }
       if(ID==0)
       {
               if(asm_comp(&pass, felicita)==0)
               {
                               felicita();
                               return 0;
               }
               printf("Wrong pass\n");
               getchar();
               return 1;
       }
       printf("Wrong pass\n");
       getchar();
       return 1;
}

int comp(char *cadena)
{
       int i;
       for(i=0;i<strlen(cadena);i++)
       {
               if(!((cadena[i]>='0' && cadena[i]<='9') || (cadena[i]>='A' && cadena[i]<='F')))
               {
                       return 1;
               }
       }
       return 0;
}

void felicita()
{
       printf("Registered\n");
       getchar();
}


Gracias a los que participaron! Que les parecio? Muy simple?

Sa1uDoS

P.D.: Se me complico un poco la semana, siento no haberlo publicado el Domingo.
#117
Ingeniería Inversa / Re: [Keygenme] Aspid
14 Marzo 2013, 19:25 PM
Era por que durara mas el reto xD. En unos dias (sobre el Domingo) publico el codigo en este mismo post.

Sa1uDoS
#118
Ingeniería Inversa / Re: [Keygenme] Aspid
14 Marzo 2013, 18:53 PM
Espero que os haya gustado!




MCKSys Argentina Para entrar a la funcion de registrar deberias hacer una shellcode inyectarla, descifrar esa sección y cambiar la RET_Addr por la Addr de la funcion.

Por privado significa por Mensaje Privado ;).

Sa1uDoS
#119
Ingeniería Inversa / [Keygenme] Aspid
13 Marzo 2013, 15:04 PM
Bueno, aqui les traigo un Keygenme nuevo.

Dificultad: [3/10] Me parece a mi...
Compilador: GCC
Objetivo: Hacer un Keygen.

Los Keygen por privado por favor.

Crackme

Espero que os guste y no lo reventeis en menos de 10 min jaja.




Hall of Fame

  • MCKSys Argentina
  • tincopasan
Sa1uDoS
#120
Programación General / Re: Video Ejecutable
24 Febrero 2013, 10:48 AM
Si quieres algo sencillo, el autorun ejecuta el .exe. El .exe tiene una ventana en la que se reproduce el video, cuando pulses cualquier tecla se abre por X segundos una ventana para escribir una contraseña.

Te recomiendo hacerlo en Visual Basic o algun lenguaje de alto nivel para que no te compliques mucho.

Sa1uDoS