• Lunes 23 de Diciembre de 2024, 17:28

Autor Tema:  Si Quisiera Mesclar Dos Programas  (Leído 1970 veces)

m3kanic0

  • Nuevo Miembro
  • *
  • Mensajes: 15
    • Ver Perfil
Si Quisiera Mesclar Dos Programas
« en: Martes 9 de Mayo de 2006, 20:59 »
0
Como debiese hacerlo ?  osea dos codigos fuentes

Un codigo realmente extenso onda un juego mesclado con un md5 para verificacion de archivos. ?


Citar
/*

  Calculate or Check MD5 Signature of File or Command Line Argument

       by John Walker
         http://www.fourmilab.ch/

  This program is in the public domain.

*/

#define VERSION     "2.0 (2003-04-15)"

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#ifdef _WIN32
#include <fcntl.h>
#include <io.h>
#endif

#include "md5.h"

#define FALSE   0
#define TRUE   1

#define EOS     '\0'

/*  Main program  */
int main (argc, argv)
  int argc; char *argv[];
{
    int i, j, opt, cdata = FALSE, docheck = FALSE, showfile = TRUE, f = 0;
    unsigned int bp;
    char *cp, *clabel, *ifname, *hexfmt = "%02X";
    FILE *in = stdin, *out = stdout;
    unsigned char buffer[16384], signature[16], csig[16];
    struct MD5Context md5c;

    for (i = 1; i < argc; i++) {
   cp = argv;
        if (*cp == '-') {
     if (strlen(cp) == 1) {
      i++;
      break;            /* -  --  Mark end of options; balance are files */
     }
     opt = *(++cp);
     if (islower(opt)) {
  opt = toupper(opt);
     }

     switch (opt) {

                case 'C':             /* -Csignature  --  Check signature, set return code */
      docheck = TRUE;
      if (strlen(cp + 1) != 32) {
   docheck = FALSE;
      }
      memset(csig, 0, 16);
      clabel = cp + 1;
      for (j = 0; j < 16; j++) {
   if (isxdigit((int) clabel[0]) && isxdigit((int) clabel[1]) &&
                            sscanf((cp + 1 + (j * 2)), hexfmt, &bp) == 1) {
       csig[j] = (unsigned char) bp;
   } else {
       docheck = FALSE;
       break;
   }
   clabel += 2;
      }
      if (!docheck) {
                        fprintf(stderr, "Error in signature specification.  Must be 32 hex digits.\n");
   return 2;
      }
      break;

                case 'D':             /* -Dtext  --  Compute signature of given text */
      MD5Init(&md5c);
      MD5Update(&md5c, (unsigned char *) (cp + 1), strlen(cp + 1));
      cdata = TRUE;
      f++;       /* Mark no infile argument needed */
      break;
     
  case 'L':          /* -L  --  Use lower case letters as hex digits */
      hexfmt = "%02x";
      break;
     
  case 'N':          /* -N  --  Don't show file name after sum */
      showfile = FALSE;
      break;
     
  case 'O':          /* -Ofname  --  Write output to fname (- = stdout) */
      cp++;
                    if (strcmp(cp, "-") != 0) {
       if (out != stdout) {
       fprintf(stderr, "Redundant output file specification.\n");
       return 2;
               }
                        if ((out = fopen(cp, "w")) == NULL) {
                            fprintf(stderr, "Cannot open output file %s\n", cp);
       return 2;
   }
      }
      break;

                case '?':             /* -U, -? -H  --  Print how to call information. */
                case 'H':
                case 'U':
    printf("\nMD5  --  Calculate MD5 signature of file.  Call");
    printf(
       "\n             with md5 [ options ] [file ...]");
    printf("\n");
    printf("\n         Options:");
    printf("\n              -csig   Check against sig, set exit status 0 = OK");
    printf("\n              -dtext  Compute signature of text argument");
    printf("\n              -l      Use lower case letters for hexadecimal digits");
    printf("\n              -n      Do not show file name after sum");
    printf("\n              -ofname Write output to fname (- = stdout)");
    printf("\n              -u      Print this message");
    printf("\n              -v      Print version information");
    printf("\n");
    printf("\nby John Walker  --  http://www.fourmilab.ch/");
    printf("\nVersion %s\n", VERSION);
    printf("\nThis program is in the public domain.\n");
    printf("\n");
      return 0;
     
  case 'V':          /* -V  --  Print version number */
      printf("%s\n", VERSION);
      return 0;
     }
   } else {
     break;
   }
    }
   
    if (cdata && (i < argc)) {
     fprintf(stderr, "Cannot specify both -d option and input file.\n");
   return 2;
    }
   
    if ((i >= argc) && (f == 0)) {
     f++;
    }
   
    for (; (f > 0) || (i < argc); i++) {
     if ((!cdata) && (f > 0)) {
     ifname = "-";
   } else {
         ifname = argv;
   }
   f = 0;

   if (!cdata) {
   
     /* If the data weren't supplied on the command line with
        the "-d" option, read it now from the input file. */
   
     if (strcmp(ifname, "-") != 0) {
  if ((in = fopen(ifname, "rb")) == NULL) {
          fprintf(stderr, "Cannot open input file %s\n", ifname);
      return 2;
  }
     } else {
  in = stdin;
     }
#ifdef _WIN32

     /** Warning!  On systems which distinguish text mode and
  binary I/O (MS-DOS, Macintosh, etc.) the modes in the open
         statement for "in" should have forced the input file into
         binary mode.  But what if we're reading from standard
  input?  Well, then we need to do a system-specific tweak
         to make sure it's in binary mode.  While we're at it,
         let's set the mode to binary regardless of however fopen
  set it.

  The following code, conditional on _WIN32, sets binary
  mode using the method prescribed by Microsoft Visual C 7.0
         ("Monkey C"); this may require modification if you're
  using a different compiler or release of Monkey C.   If
         you're porting this code to a different system which
         distinguishes text and binary files, you'll need to add
  the equivalent call for that system. */

     _setmode(_fileno(in), _O_BINARY);
#endif
   
         MD5Init(&md5c);
     while ((j = (int) fread(buffer, 1, sizeof buffer, in)) > 0) {
  MD5Update(&md5c, buffer, (unsigned) j);
     }
   }
   MD5Final(signature, &md5c);

   if (docheck) {
     docheck = 0;
     for (j = 0; j < sizeof signature; j++) {
  if (signature[j] != csig[j]) {
      docheck = 1;
      break;
  }
     }
     if (i < (argc - 1)) {
      fprintf(stderr, "Only one file may be tested with the -c option.\n");
  return 2;
     }
   } else {
     for (j = 0; j < sizeof signature; j++) {
         fprintf(out, hexfmt, signature[j]);
     }
     if ((!cdata) && showfile) {
  fprintf(out, "  %s", (in == stdin) ? "-" : ifname);
     }
            fprintf(out, "\n");
   }
    }

    return docheck;
}
/*
 * This code implements the MD5 message-digest algorithm.
 * The algorithm is due to Ron Rivest.   This code was
 * written by Colin Plumb in 1993, no copyright is claimed.
 * This code is in the public domain; do with it what you wish.
 *
 * Equivalent code is available from RSA Data Security, Inc.
 * This code has been tested against that, and is equivalent,
 * except that you don't need to include two pages of legalese
 * with every copy.
 *
 * To compute the message digest of a chunk of bytes, declare an
 * MD5Context structure, pass it to MD5Init, call MD5Update as
 * needed on buffers full of bytes, and then call MD5Final, which
 * will fill a supplied 16-byte array with the digest.
 */

/* Brutally hacked by John Walker back from ANSI C to K&R (no
   prototypes) to maintain the tradition that Netfone will compile
   with Sun's original "cc". */

#include <memory.h>   /* for memcpy() */
#include "md5.h"

#ifdef sgi
#define HIGHFIRST
#endif

#ifdef sun
#define HIGHFIRST
#endif

#ifndef HIGHFIRST
#define byteReverse(buf, len)   /* Nothing */
#else
/*
 * Note: this code is harmless on little-endian machines.
 */
void byteReverse(buf, longs)
    unsigned char *buf; unsigned longs;
{
    uint32 t;
    do {
   t = (uint32) ((unsigned) buf[3] << 8 | buf[2]) << 16 |
     ((unsigned) buf[1] << 8 | buf[0]);
   *(uint32 *) buf = t;
   buf += 4;
    } while (--longs);
}
#endif

/*
 * Start MD5 accumulation.  Set bit count to 0 and buffer to mysterious
 * initialization constants.
 */
void MD5Init(ctx)
    struct MD5Context *ctx;
{
    ctx->buf[0] = 0x67452301;
    ctx->buf[1] = 0xefcdab89;
    ctx->buf[2] = 0x98badcfe;
    ctx->buf[3] = 0x10325476;

    ctx->bits[0] = 0;
    ctx->bits[1] = 0;
}

/*
 * Update context to reflect the concatenation of another buffer full
 * of bytes.
 */
void MD5Update(ctx, buf, len)
    struct MD5Context *ctx; unsigned char *buf; unsigned len;
{
    uint32 t;

    /* Update bitcount */

    t = ctx->bits[0];
    if ((ctx->bits[0] = t + ((uint32) len << 3)) < t)
   ctx->bits[1]++;  /* Carry from low to high */
    ctx->bits[1] += len >> 29;

    t = (t >> 3) & 0x3f;   /* Bytes already in shsInfo->data */

    /* Handle any leading odd-sized chunks */

    if (t) {
   unsigned char *p = (unsigned char *) ctx->in + t;

   t = 64 - t;
   if (len < t) {
     memcpy(p, buf, len);
     return;
   }
   memcpy(p, buf, t);
   byteReverse(ctx->in, 16);
   MD5Transform(ctx->buf, (uint32 *) ctx->in);
   buf += t;
   len -= t;
    }
    /* Process data in 64-byte chunks */

    while (len >= 64) {
   memcpy(ctx->in, buf, 64);
   byteReverse(ctx->in, 16);
   MD5Transform(ctx->buf, (uint32 *) ctx->in);
   buf += 64;
   len -= 64;
    }

    /* Handle any remaining bytes of data. */

    memcpy(ctx->in, buf, len);
}

/*
 * Final wrapup - pad to 64-byte boundary with the bit pattern
 * 1 0* (64-bit count of bits processed, MSB-first)
 */
void MD5Final(digest, ctx)
    unsigned char digest[16]; struct MD5Context *ctx;
{
    unsigned count;
    unsigned char *p;

    /* Compute number of bytes mod 64 */
    count = (ctx->bits[0] >> 3) & 0x3F;

    /* Set the first char of padding to 0x80.  This is safe since there is
       always at least one byte free */
    p = ctx->in + count;
    *p++ = 0x80;

    /* Bytes of padding needed to make 64 bytes */
    count = 64 - 1 - count;

    /* Pad out to 56 mod 64 */
    if (count < 8) {
   /* Two lots of padding:  Pad the first block to 64 bytes */
   memset(p, 0, count);
   byteReverse(ctx->in, 16);
   MD5Transform(ctx->buf, (uint32 *) ctx->in);

   /* Now fill the next block with 56 bytes */
   memset(ctx->in, 0, 56);
    } else {
   /* Pad block to 56 bytes */
   memset(p, 0, count - 8);
    }
    byteReverse(ctx->in, 14);

    /* Append length in bits and transform */
    ((uint32 *) ctx->in)[14] = ctx->bits[0];
    ((uint32 *) ctx->in)[15] = ctx->bits[1];

    MD5Transform(ctx->buf, (uint32 *) ctx->in);
    byteReverse((unsigned char *) ctx->buf, 4);
    memcpy(digest, ctx->buf, 16);
    memset(ctx, 0, sizeof(ctx));        /* In case it's sensitive */
}


/* The four core functions - F1 is optimized somewhat */

/* #define F1(x, y, z) (x & y | ~x & z) */
#define F1(x, y, z) (z ^ (x & (y ^ z)))
#define F2(x, y, z) F1(z, x, y)
#define F3(x, y, z) (x ^ y ^ z)
#define F4(x, y, z) (y ^ (x | ~z))

/* This is the central step in the MD5 algorithm. */
#define MD5STEP(f, w, x, y, z, data, s) \
   ( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )

/*
 * The core of the MD5 algorithm, this alters an existing MD5 hash to
 * reflect the addition of 16 longwords of new data.  MD5Update blocks
 * the data and converts bytes into longwords for this routine.
 */
void MD5Transform(buf, in)
    uint32 buf[4]; uint32 in[16];
{
    register uint32 a, b, c, d;

    a = buf[0];
    b = buf[1];
    c = buf[2];
    d = buf[3];

    MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
    MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
    MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
    MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
    MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
    MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
    MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
    MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
    MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
    MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
    MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
    MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
    MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
    MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
    MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
    MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);

    MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
    MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
    MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
    MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
    MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
    MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
    MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
    MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
    MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
    MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
    MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
    MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
    MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
    MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
    MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
    MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);

    MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
    MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
    MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
    MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
    MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
    MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
    MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
    MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
    MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
    MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
    MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
    MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
    MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
    MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
    MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
    MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);

    MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
    MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
    MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
    MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
    MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
    MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
    MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
    MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
    MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
    MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
    MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
    MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
    MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
    MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
    MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
    MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);

    buf[0] += a;
    buf[1] += b;
    buf[2] += c;
    buf[3] += d;
}

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Si Quisiera Mesclar Dos Programas
« Respuesta #1 en: Miércoles 10 de Mayo de 2006, 06:17 »
0
Explica un poco mejor qué es lo que deseas hacer. Puedes usar los dos programas en secuencia, uno tras otro. ¿O quieres hacer uso en un programa de las funciones en el otro (entonces se hace así precisamente: con funciones)? ¿O qué?

Saludos,
José Jorge (Geo).
La imaginación es el límite.
Hardware & Software | Mexchip

x.cyclop

  • Miembro de PLATA
  • *****
  • Mensajes: 1039
  • Nacionalidad: mx
    • Ver Perfil
Re: Si Quisiera Mesclar Dos Programas
« Respuesta #2 en: Miércoles 10 de Mayo de 2006, 08:08 »
0
No entiendo. ¿Te refieres a CVS? :blink:

- Great works aren't produced on the first try. [Ernest Hemingway]
- Be ambitious, yet realistic in your dreams. Do something that makes a positive impact. Don’t let the nay-sayers get you down. [Bjarne Stroustrup]

m3kanic0

  • Nuevo Miembro
  • *
  • Mensajes: 15
    • Ver Perfil
Re: Si Quisiera Mesclar Dos Programas
« Respuesta #3 en: Jueves 11 de Mayo de 2006, 20:09 »
0
tengo el programa grande es un juego. q2 pa ser mas especifico. y el codigo que puse es de un programa de verficcacion md5 queria dentro del quake2 poder usar la verificacion md5.

no soy muy experimentado. :hola:

fuhrer

  • Miembro MUY activo
  • ***
  • Mensajes: 329
  • Nacionalidad: mx
    • Ver Perfil
    • http://admin.busquenoseninternet.com
Re: Si Quisiera Mesclar Dos Programas
« Respuesta #4 en: Jueves 11 de Mayo de 2006, 22:06 »
0
Hola, que tal.

Sólo debes de de tratar al código pequeño como una librería y en lugar de main() poner el nombre de una función, creo que es una de las formas más sencillas, pero no la única.

Lo que yo no entiendo es para que querrias validar algo del juego con el MD5, no entiendo tu objetivo, pero espero que lo que escribí te sirva.

Hasta luego

m3kanic0

  • Nuevo Miembro
  • *
  • Mensajes: 15
    • Ver Perfil
Re: Si Quisiera Mesclar Dos Programas
« Respuesta #5 en: Viernes 12 de Mayo de 2006, 17:41 »
0
como una funcion intentare eso ep. tendria que cambiar int main (argc, argv) ??

quiero validar en md5 pk juego online y muchos de los jugadores modifican partes del juego para jugar con algun tipo de ventaja asi obligo a que el juego lo mantengan intacto. y podria comprovar su  autenticidad.