- Joined
- Jun 29, 2008
- Messages
- 5,028
- Reaction score
- 999
Try patch < ./zpipe-enc.patch. It would probably be easier to use the version in phantom's post on page 2 as you just paste into a textfile and compile.
Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature currently requires accessing the site using the built-in Safari browser.
It's likely everyone is using different clients and I don't want to deal with unpacking or Xtrap removal. So I've decided to explain everything with theseYou must be registered to see linksI found via ragezone and posted by cyber37, apparently from chumpywumpy's v2.5 server files. All clients employ the same logic.
The client uses the popular inflation/deflation algorithms found inYou must be registered to see linkswith a suppressed header (negative windowBits). Albeit they use an older public domain code base from the same author, Mark Adler, it can be foundYou must be registered to see links. The code was compiled without the PKZIP_BUG_WORKAROUND definition at line 172 and uses a custom FLUSH and NEXTBYTE definition at lines 214 and 206. Otherwise, everything else is exactly alike. The custom NEXTBYTE instructions contain XOR encryption for only the first 4 inflated bytes while the rest pass through without modification.
Client offsets of the functions are (look at your keyboard to replace back the missing digits):
inflate = ))$@D#B^XOR:
inflate_block = ))$@D#@$
inflate_dynamic = ))$@CF(#
inflate_stored = ))$@CDAA
inflate_fixed = ))$@CEB$
inflate_codes = ))$@CAE^
huft_build = ))$@C&@)
huft_free = ))$@CACA
NEEDBYTE = ))$@D$$*
byte 1 xor 0x92The first 4 bytes of the files contain the uncompressed data size which is used to allocate the correct amount of memory. The next 4 bytes are encrypted. With this and the above knowledge you can now program your own application. I've thrown together a quick hack job sample using the zpipe example from
byte 2 xor 0x65
byte 3 xor 0x67
byte 4 xor 0x57
You must be registered to see links. You can download and apply thisYou must be registered to see linksor get theYou must be registered to see links. Be warned my development platform is Linux and it won't compile for Windows. For Windows you would need to remove the code that retrieves the file size in the def function and replace it with the Win32 equivalent, eg.
Code:HANDLE hFile; hFile = GetStdHandle(STD_INPUT_HANDLE); if (GetFileSizeEx(hFile, &dest_size) == 0) return Z_ERRNO;
Apply Patch:
patch < zpipe-enc.patchCompile ZPipe:
gcc -o zpipe zpipe.c -lzCompress Usage:
zpipe < phantom.txt > phantom.encDecompress Usage:
zpipe -d < phantom.enc > phantom.txtNote: Newer clients have a list of 128bit checksums to deter modification. It's far easier to remove the corrupt file check than it is to replace the list. Both require modifying the client.
Code:/* zpipe.c: example of proper use of zlib's inflate() and deflate() Not copyrighted -- provided to the public domain Version 1.2 9 November 2004 Mark Adler */ /* Version history: 1.0 30 Oct 2004 First version 1.1 8 Nov 2004 Add void casting for unused return values Use switch statement for inflate() return values 1.2 9 Nov 2004 Add assertions to document zlib guarantees 1.3 6 Apr 2005 Remove incorrect assertion in inf() */ #include <stdio.h> #include <string.h> #include <assert.h> #include "zlib.h" #include <sys/types.h> #include <sys/stat.h> #define CHUNK 16384 /* Compress from file source to file dest until EOF on source. def() returns Z_OK on success, Z_MEM_ERROR if memory could not be allocated for processing, Z_STREAM_ERROR if an invalid compression level is supplied, Z_VERSION_ERROR if the version of zlib.h and the version of the library linked do not match, or Z_ERRNO if there is an error reading or writing the files. */ int def(FILE *source, FILE *dest, int level) { int ret, flush; unsigned have; z_stream strm; char in[CHUNK]; char out[CHUNK]; char *buf; unsigned long dest_size; unsigned long indx = 0; struct stat sb; have = fileno(source); if (fstat(have, &sb) < 0) return Z_ERRNO; if (!S_ISREG(sb.st_mode)) return Z_ERRNO; if ((dest_size = (unsigned long)sb.st_size) <= 0) return Z_ERRNO; if (fwrite(&dest_size, 4, 1, dest) != 1 || ferror(dest)) return Z_ERRNO; /* allocate deflate state */ strm.zalloc = Z_NULL; strm.zfree = Z_NULL; strm.opaque = Z_NULL; ret = deflateInit2(&strm, level, Z_DEFLATED, -MAX_WBITS, 8, Z_DEFAULT_STRATEGY); if (ret != Z_OK) return ret; /* compress until end of file */ do { strm.avail_in = fread(in, 1, CHUNK, source); if (ferror(source)) { (void)deflateEnd(&strm); return Z_ERRNO; } flush = feof(source) ? Z_FINISH : Z_NO_FLUSH; strm.next_in = in; /* run deflate() on input until output buffer not full, finish compression if all of source has been read in */ do { strm.avail_out = CHUNK; strm.next_out = out; ret = deflate(&strm, flush); /* no bad return value */ assert(ret != Z_STREAM_ERROR); /* state not clobbered */ have = CHUNK - strm.avail_out; if (have > 0) { buf = out; do { if (dest_size > indx++) { switch (indx) { case 1: *buf ^= 0x92; break; case 2: *buf ^= 0x65; break; case 3: *buf ^= 0x67; break; case 4: *buf ^= 0x57; } } } while (*buf++); if (fwrite(out, 1, have, dest) != have || ferror(dest)) { (void)deflateEnd(&strm); return Z_ERRNO; } } } while (strm.avail_out == 0); assert(strm.avail_in == 0); /* all input will be used */ /* done when last data in file processed */ } while (flush != Z_FINISH); assert(ret == Z_STREAM_END); /* stream will be complete */ /* clean up and return */ (void)deflateEnd(&strm); return Z_OK; } /* Decompress from file source to file dest until stream ends or EOF. inf() returns Z_OK on success, Z_MEM_ERROR if memory could not be allocated for processing, Z_DATA_ERROR if the deflate data is invalid or incomplete, Z_VERSION_ERROR if the version of zlib.h and the version of the library linked do not match, or Z_ERRNO if there is an error reading or writing the files. */ int inf(FILE *source, FILE *dest) { int ret; unsigned have; z_stream strm; char in[CHUNK]; char out[CHUNK]; char *buf; unsigned long dest_size; unsigned long indx = 0; have = fread(in, 1, 4, source); if (have != 4 || ferror(source)) { return Z_ERRNO; } dest_size = ((unsigned long)in[0]) | ((unsigned long)in[1] << 8) | ((unsigned long)in[2] << 16) | ((unsigned long)in[3] << 24); /* allocate inflate state */ strm.zalloc = Z_NULL; strm.zfree = Z_NULL; strm.opaque = Z_NULL; strm.avail_in = 0; strm.next_in = Z_NULL; ret = inflateInit2(&strm, -MAX_WBITS); if (ret != Z_OK) return ret; /* decompress until deflate stream ends or end of file */ do { strm.avail_in = fread(in, 1, CHUNK, source); if (ferror(source)) { (void)inflateEnd(&strm); return Z_ERRNO; } if (strm.avail_in == 0) break; buf = in; do { if (dest_size > indx++) { switch (indx) { case 1: *buf ^= 0x92; break; case 2: *buf ^= 0x65; break; case 3: *buf ^= 0x67; break; case 4: *buf ^= 0x57; } } } while (*buf++); strm.next_in = in; /* run inflate() on input until output buffer not full */ do { strm.avail_out = CHUNK; strm.next_out = out; ret = inflate(&strm, Z_NO_FLUSH); assert(ret != Z_STREAM_ERROR); /* state not clobbered */ switch (ret) { case Z_NEED_DICT: ret = Z_DATA_ERROR; /* and fall through */ case Z_DATA_ERROR: case Z_MEM_ERROR: (void)inflateEnd(&strm); return ret; } have = CHUNK - strm.avail_out; if (fwrite(out, 1, have, dest) != have || ferror(dest)) { (void)inflateEnd(&strm); return Z_ERRNO; } } while (strm.avail_out == 0); /* done when inflate() says it's done */ } while (ret != Z_STREAM_END); /* clean up and return */ (void)inflateEnd(&strm); return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR; } /* report a zlib or i/o error */ void zerr(int ret) { fputs("zpipe: ", stderr); switch (ret) { case Z_ERRNO: if (ferror(stdin)) fputs("error reading stdin\n", stderr); if (ferror(stdout)) fputs("error writing stdout\n", stderr); break; case Z_STREAM_ERROR: fputs("invalid compression level\n", stderr); break; case Z_DATA_ERROR: fputs("invalid or incomplete deflate data\n", stderr); break; case Z_MEM_ERROR: fputs("out of memory\n", stderr); break; case Z_VERSION_ERROR: fputs("zlib version mismatch!\n", stderr); } } /* compress or decompress from stdin to stdout */ int main(int argc, char **argv) { int ret; /* do compression if no arguments */ if (argc == 1) { ret = def(stdin, stdout, Z_DEFAULT_COMPRESSION); if (ret != Z_OK) zerr(ret); return ret; } /* do decompression if -d specified */ else if (argc == 2 && strcmp(argv[1], "-d") == 0) { ret = inf(stdin, stdout); if (ret != Z_OK) zerr(ret); return ret; } /* otherwise, report usage */ else { fputs("zpipe usage: zpipe [-d] < source > dest\n", stderr); return 1; } }
an much easier way than compress with zippe is modify the balq gm tools for enc repack.....its much easier....
i don't think you can add more xor keys,as cabalmain have only 4!
Actually, if done right, cabalmain.exe hiding using a launcher would be somewhat helpful.
Do it like this...
Have your cabalmain.exe renamed to cabal.inf or something like that... something unknown that people wouldn't think to edit.
Using your launcher, rename cabal.inf to cabalmain.exe when launching, then, in less then a second, rename it back to cabal.inf. Game launches, and people will almost never see the change.
If you want, you can even have the renamed cabalmain.exe in another random folder... then when you want to use it, copy it to the main cabal folder, rename it to cabalmain.exe, and run it... then delete it.
Another trick to add onto all this would be, while trying to rename, if there is already a cabalmain.exe there [meaning it is not your main one.. someone put it there], then delete that cabalmain.exe right before renaming your cabal.inf [hidden cabalmain.exe] to cabalmain.exe.
To supercharge this idea: Change the xor codes on all your encs and your [hidden] cabalmain.exe.
Change the version of your [hidden] cabalmain.exe serverside... and of course, clientside.
This enables even more security.
These few ideas are just to get you started. I have already taken other precautions to prevent hackers
// src and dest are the path for the source and destination files
// exemple "data/source.enc" "data/source.dest"
CabalEncPacker packer = new CabalEncPacker(src,dest);
// use as many keys as you want when u call the method
packer.deflate(new int[]{0x92,0x65,0x67,0x57});
Link works now. If you every get "temporarily unvailable" at megaupload just wait a while as the link WILL come back, it just means that they need to fix something