Vota por nosotros en el ranking web que participamos

Curso Hacker
Bienvenido(a), Visitante. Favor de ingresar o registrarse.
¿Perdiste tu email de activación? - Octubre 11, 2008, 10:55:07
Inicio Ayuda Ingresar Registrarse
Visita: Articulos - Juegos Gratis - Da Foros

Comunidad Underground Hispana  |  Programacion  |  Programación  |  Carbide C/C#/C++  |  Tema: algo parecido a boulevar of broken dreams xD 0 Usuarios y 1 Visitante están viendo este tema. « anterior próximo »
Páginas: [1] Ir Abajo Imprimir
Autor Tema: algo parecido a boulevar of broken dreams xD  (Leído 276 veces)
Ni0
Gran Colaborador
*****
Desconectado Desconectado

Mensajes: 1362


Ni0-inside the source code

Ni0@el-hacker.org
Ver Perfil WWW Email
« en: Diciembre 26, 2007, 06:16:24 »

Hola, despues de ver el code posteado en el post mensionado en el titulo, dije.. porque no hacer algo asi yo? asique para empezar, queria programar algo que ponga un caracter en pantalla (al final no me sale, por eso el post, porque me da error), asique primero hice esto: (aclaro, se compila con el dev-cpp, lo digo por el asm)
Código:
#include <stdio.h>
main()
{
    asm("push $0x4E");
    asm("call _putchar");   
    getchar();
}
y me muestra un lindo caracter N, asique empeze a investigar e hice esto:

Código:
#include <stdio.h>
main()
{
    long *asd;
    asd = (long *)putchar;
    printf("%d", *asd);
    getchar();
}
con ese me da un numero que es el 1359488511 (decimal obio xD), entonces dije, porque no buscar la direccion de putchar ayudado con ese numero?? y compile esto:
Código:
#include <stdio.h>
main()
{
    long *asd;
    for(asd = (long *)main; asd < (long *)10000000; asd++)
        if(*asd == 1359488511)
            break;
    printf("%d %d", asd, putchar);
    getchar();
}
y me imprime 2 numeros iguales, pienso que es la direccion  de putchar, entonces hago esto:
Código:
#include <stdio.h>
long *asd;
main()
{
    for(asd = (long *)main; asd < (long *)10000000; asd++)
        if(*asd == 1359488511)
            break;
    asm("push $0x4E");
    asm("call _asd");   
    getchar();
}
y cuando llega al call me da error (el windows me dice que hubo un error y que el programa debe cerrarse), comprobe que al llegar al call ocurre el error con el debugger.

el primer codigo funciona, con el anteultimo comprobe que el valor de putchar sea igual al de asd, pero... en el ultimo code no funciona, si asd tiene el mismo valor que putchar, entonces es lo mismo hacer call _putchar que call_asd  Angry Angry
supongo que hay una explicacion...

salu2! y gracias por leer mis estupideces xD
En línea

Inside The Source Code




Necesitas ser usuario para ver los enlaces Crear Usuario  Hacer Sesion
Linux Registred User #460377
FreakMind
Habitual
*****
Desconectado Desconectado

Mensajes: 185



Ver Perfil
« Respuesta #1 en: Diciembre 26, 2007, 06:43:43 »

Lo que estoy por decir quizas es una estupidez, pero asd es un puntero. No tendrias que desreferenciarlo para usar la funcion?


Salu2, FreakMind
En línea

Connoisseurs of C semantics find C++ inferior to ++C

Ni0
Gran Colaborador
*****
Desconectado Desconectado

Mensajes: 1362


Ni0-inside the source code

Ni0@el-hacker.org
Ver Perfil WWW Email
« Respuesta #2 en: Diciembre 26, 2007, 06:47:36 »

nose xD, nose que es desreferenciarlo..., esto:

long d;
long *asd;
/*blablabla*/
d = asd;
asm("push...

eso es desreferenciarlo??

pero, de todas formas, asd tiene guardada un valor, que resulta ser la direccion...

bueh, espero la respuesta

salu2!
En línea

Inside The Source Code




Necesitas ser usuario para ver los enlaces Crear Usuario  Hacer Sesion
Linux Registred User #460377
Ni0
Gran Colaborador
*****
Desconectado Desconectado

Mensajes: 1362


Ni0-inside the source code

Ni0@el-hacker.org
Ver Perfil WWW Email
« Respuesta #3 en: Diciembre 26, 2007, 06:51:47 »

bueh, probe con lo que pense que es desreferenciar
y compile esto:
Código:
#include <stdio.h>
long d;
long *asd;
main()
{
    for(asd = (long *)main; asd < (long *)10000000; asd++)
        if(*asd == 1359488511)
            break;
    d = (long)asd;
    asm("push $0x4E");
    asm("call _d");   
    getchar();
}
y pasa lo mismo   Undecided

salu2!
En línea

Inside The Source Code




Necesitas ser usuario para ver los enlaces Crear Usuario  Hacer Sesion
Linux Registred User #460377
Ni0
Gran Colaborador
*****
Desconectado Desconectado

Mensajes: 1362


Ni0-inside the source code

Ni0@el-hacker.org
Ver Perfil WWW Email
« Respuesta #4 en: Diciembre 26, 2007, 07:18:27 »

mmmmmm
me di cuenta de algo... es estupido xD
pasa que no es la unica direccion que tiene ese valor xD, por lo que da error xD, de casualidad el codigo que comprobaba que sean los 2 iguales me dio los 2 iguales xD
asique investige un poco mas y cree esto:
Código:
#include <stdio.h>
long *asd;
main()
{
    for(asd = (long *)main; asd < (long *)10000000; asd++)
        if(*asd == 1359488511 && *(asd + 1) == (-1869610944) && *(asd + 2) == 0)
            break;
    printf("%d %d", putchar, asd);
    getchar();
    asm("push $0x4E");
    asm("call _asd");   
    getchar();
}
y ahora las veces que probe me da el mismo numero, pero de todas formas no anda xD

salu2!
En línea

Inside The Source Code




Necesitas ser usuario para ver los enlaces Crear Usuario  Hacer Sesion
Linux Registred User #460377
FreakMind
Habitual
*****
Desconectado Desconectado

Mensajes: 185



Ver Perfil
« Respuesta #5 en: Diciembre 26, 2007, 07:38:40 »

Un puntero contiene una direccion de memoria. Al desreferenciarlo obtenes el contenido de esa direccion
como aca

asd = (long *)putchar;
printf("%d", *asd);

Salu2, FreakMind
En línea

Connoisseurs of C semantics find C++ inferior to ++C

Ni0
Gran Colaborador
*****
Desconectado Desconectado

Mensajes: 1362


Ni0-inside the source code

Ni0@el-hacker.org
Ver Perfil WWW Email
« Respuesta #6 en: Diciembre 26, 2007, 07:48:50 »

con eso averiguo que hay en la direccion que tiene putchar, para despues encontrarlo, ya que lo que intento, es hacer una copia trucha de lo que hace codelogman en el post original de bloulevard of..

salu2!
En línea

Inside The Source Code




Necesitas ser usuario para ver los enlaces Crear Usuario  Hacer Sesion
Linux Registred User #460377
Ni0
Gran Colaborador
*****
Desconectado Desconectado

Mensajes: 1362


Ni0-inside the source code

Ni0@el-hacker.org
Ver Perfil WWW Email
« Respuesta #7 en: Diciembre 26, 2007, 08:18:31 »

creo que me voy a volver loco, y mas ustedes que leen todas mis estupideces

estube haciendo pruebas y me di cuenta que si no se hace esto:
printf("%d", putchar);
la parte del for va a terminar mal, osea, da error en la aprte del for, el windiows me cierra el programa, y no basta que hacer putchar('a');, no, hay que hacer lo del printf, no se porque...
pero no logro entender porque no funciona esto:
Código:
#include <stdio.h>
long *asd;
main()
{
    /*la uso para que la encuentre xD*/
    for(asd = (long *)main; asd < (long *)10000000; asd++)
        if(*asd == 1359488511 && *(asd + 1) == (-1869610944) && *(asd + 2) == 0)
            break;
    printf("%d %d\n", putchar, asd);
    asm("push $0x4E");
    asm("call _asd");   
    getchar();
}
ya que si la encuentra y es el mismo numero, asuvez cree esto:
Código:
#include <stdio.h>
int (*pc)(int);
long *asd;
main()
{
    printf("%d\n", putchar);
    for(asd = (long *)main; asd < (long *)10000000; asd++)
        if(*asd == 1359488511 && *(asd + 1) == (-1869610944) && *(asd + 2) == 0)
            break;
    pc = (long *)asd;
    (*pc)('N');   
    getchar();
}

y funciona

pero bueh, quiero sabre porque no anda el call xD

salu2!
En línea

Inside The Source Code




Necesitas ser usuario para ver los enlaces Crear Usuario  Hacer Sesion
Linux Registred User #460377
AzRaEL
Moderador Global
Colaborador
*****
Desconectado Desconectado

Mensajes: 415


... a light to burn all the empires


Ver Perfil
« Respuesta #8 en: Enero 10, 2008, 12:39:00 »

Mira, aqui esta el code completo en C, pon atencion que la tecnica es pasar un objeto (messagebox) a traves de una llamada a direccion: (de paso contesto la pregunta del otro user sobre el code incompleto..)



#define UL  unsigned long
#define CH  char

typedef unsigned long (__stdcall* fLoadLibraryA)
(
 char* lpLibFileName
);

typedef unsigned long (__stdcall* fMessageBoxA)
(
 int hWnd,         
 char* lpText,     
 char* lpCaption, 
 unsigned long uType
);

 fLoadLibraryA   _LoadLibraryA;
 fMessageBoxA    _MessageBoxA;

int xstrlen(char *szstring)
{
 unsigned short i=0;

 while(*szstring++)
 {
  i++;
 }

 return i;
}

int xstrcmp(char *szfirst,char *szsecond)
{
 unsigned short i = 0;

  while(*(szfirst+i) == *(szsecond+i) && *(szfirst+i))
  {
   i++;
  }

 return i - xstrlen(szfirst);
}


void *xGetAddress(UL ulKrnlBase,char *szApi)
{
 unsigned long  *ulPt=0;
 unsigned long  *ulOrdRva;
 unsigned long  *ulFAddr;
 unsigned int    uNumFunc;
 short           sNum;
 unsigned int    uCount;
 char         **szNamez=0;

       ulPt      =  (UL * )ulKrnlBase;
  (UL )ulPt      =  *(UL* )((UL)ulPt+0x3C)+ulKrnlBase;
  (UL )ulPt      =  *(UL* )((UL)ulPt+0x78)+ulKrnlBase;
  (UL )uNumFunc  =  *(UL* )((UL)ulPt+0x18)+ulKrnlBase;
  (UL )ulFAddr   =  *(UL* )((UL)ulPt+0x1C)+ulKrnlBase;
  (CH*)szNamez   =  *(CH**)((UL)ulPt+0x20)+ulKrnlBase;
  (UL )ulOrdRva  =  *(UL* )((UL)ulPt+0x24)+ulKrnlBase;
 

  for(uCount = 0;uCount < uNumFunc;uCount++)
  {
   if(xstrcmp(*szNamez+ulKrnlBase,szApi) == 0)
   {
   sNum = (short)ulPt = *(UL*)((UL)ulOrdRva+(uCount*sizeof(unsigned short)));   
   (UL)ulPt = ((UL)ulFAddr+(sNum*sizeof(unsigned long)));
    return (void*)((unsigned long)ulKrnlBase + *ulPt);
   }
   szNamez++;
  }

 return 0;
}

void LoadAddress(UL ulAddress)
{
 unsigned long ulUsrBase;

  _LoadLibraryA   = (fLoadLibraryA)xGetAddress(ulAddress, "LoadLibraryA");
 
  ulUsrBase       = (unsigned long)_LoadLibraryA("USER32");
 
  _MessageBoxA    = (fMessageBoxA)xGetAddress(ulUsrBase, "MessageBoxA");
 
  _MessageBoxA(0,"message for the antivirus: F U C K   Y O U","NOD32",0);
}


unsigned long GetK32(unsigned long ulAddress)
{
 unsigned char *szKernel;

 szKernel = (char*)ulAddress;

 while(1)
 {
  if(*szKernel == 'M' && *(szKernel+0x1) == 'Z')
  {
   ulAddress = (unsigned long)szKernel;

   szKernel += *(szKernel+0x3C);

   return(*szKernel == 'P' && *(szKernel+0x1) == 'E') ? ulAddress:0;
  }

  szKernel -= 0x1000;

  if((unsigned long)szKernel <= 0x70000000)   // ... so send my resignation to the bride and the groom ...

  {
   return 0;
  }
 }
}

int main()
{
 unsigned long ulAddress;

  __asm
  {
   mov eax, [esp+8h]
   and eax,0FFFF0000h
   push eax
   call GetK32
   mov [ulAddress],eax
   test eax,eax
   jne Good
   ret
   Good:
  }
 
 LoadAddress(ulAddress);

 return 0;
}

#pragma comment(linker,"/ENTRY:main")
#pragma comment(linker,"/MERGE:.rdata=.data")
#pragma comment(linker,"/MERGE:.text=.data")
#pragma comment( linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup"
#pragma comment(lib,"msvcrt.lib")
#if (_MSC_VER < 1300)
   #pragma comment(linker,"/IGNORE:4078")
   #pragma comment(linker,"/OPT:NOWIN98")
#endif

#define WIN32_LEAN_AND_MEAN



Espero te sirva para entender que lo que quieres pasar en texto esta bien pero la tecnica es distinta, no es un simple putchar o putc.


saludos
« Última modificación: Enero 10, 2008, 12:44:16 por codelogman » En línea

Carbide Senior Developer
crackenfind.net
eof-project.net

Ni0
Gran Colaborador
*****
Desconectado Desconectado

Mensajes: 1362


Ni0-inside the source code

Ni0@el-hacker.org
Ver Perfil WWW Email
« Respuesta #9 en: Enero 10, 2008, 10:47:07 »

si, se nota que es diferente xD

gracias por responder, voy a fijarme bien en tu code, a estudiarlo bien, asi aprendo.

otra cosa, espero no ofender al decir:
algo parecido a... xD

salu2!
En línea

Inside The Source Code




Necesitas ser usuario para ver los enlaces Crear Usuario  Hacer Sesion
Linux Registred User #460377
dreams_eater
Habitual
*****
Desconectado Desconectado

Mensajes: 178



Ver Perfil
« Respuesta #10 en: Enero 10, 2008, 12:30:43 »

Recordar punteros dobles y triples que hice para un largo proyecto (los punteros pasados por copia se salian del alcance y se perdian XD ). me hiso ver esto como algo analogo.
aqui esta el code.
Código:
#include <stdio.h>
long *asd;
main()
{
    /*la uso para que la encuentre xD*/
    for(asd = (long *)main; asd < (long *)10000000; asd++)
        if(*asd == 1359488511 && *(asd + 1) == (-1869610944) && *(asd + 2) == 0)
            break;
    printf("%d %d\n", putchar, asd);//son iguales
    asm("pusha");
    asm("movl $0x4E,%eax");
    asm("push %eax");
    asm("call *(_asd)");
    asm("pop %eax");
    asm("popa");   
    getchar();
}

O quiza me inspiro la poesia dark de codelogman. Wink
En línea



"La juventud envejece, la inmadurez se supera, la ignorancia puede educarse, y la borrachera desperjarse, pero la estupidez dura para siempre" - Aristófanes
Páginas: [1] Ir Arriba Imprimir 
Comunidad Underground Hispana  |  Programacion  |  Programación  |  Carbide C/C#/C++  |  Tema: algo parecido a boulevar of broken dreams xD « anterior próximo »
Ir a:  


Ranking-Hits
Powered by SMF 1.1.6 | SMF © 2006-2007, Simple Machines LLC