Rusty Hearts

Page 2 of 3 FirstFirst 123 LastLast
Results 16 to 30 of 44
  1. #16
    Mermaider tinkle is offline
    MemberRank
    Apr 2005 Join Date
    942Posts

    Re: Rusty Hearts

    hehe glad to see people playin it... my ign is ofc 'tinkle' that's my frantz ;> he's pretty much my main although Angela does rock too. I made one of each of course... but I wait for Natasha (4th char) since she'll be ranged (dual guns/rifle)... Frantz is pretty good at soloing VH but I think they all can... just takes some time to get used to it... Also it's super fun to play with a controller xD... I agree a PS would be nice though. :D

  2. #17
    Account Upgraded | Title Enabled! jonnybravo is offline
    MemberRank
    Sep 2006 Join Date
    773Posts

    Re: Rusty Hearts

    look thru the client and find out some information...

    is it packed what anticheat does it use etc... grab a packet sniffer look at the packets and see if there in fact encrypted...

  3. #18
    DRGunZ 2 Creator wesman2232 is offline
    MemberRank
    Jan 2007 Join Date
    Erie, PALocation
    4,872Posts

    Re: Rusty Hearts

    @tinkle, you make me really interested in Natasha. :)
    @jonnybravo: it uses X-Trap.

  4. #19
    We are Maverick! Dell Honne is offline
    MemberRank
    Feb 2009 Join Date
    ON, CanadaLocation
    3,271Posts

    Re: Rusty Hearts

    Seems like most of the configs are readable by notepad++

    Also the client uses pck files... just like JD and PW.

    I can't extract them using PW/JD's tools though so something must be different.

  5. #20
    Valued Member pushedx is offline
    MemberRank
    Oct 2008 Join Date
    100Posts

    Re: Rusty Hearts

    Quote Originally Posted by Dell Honne View Post
    Seems like most of the configs are readable by notepad++

    Also the client uses pck files... just like JD and PW.

    I can't extract them using PW/JD's tools though so something must be different.
    Here's a file extractor I just wrote. Their format is pretty simple, just XOR encrypted file headers that are compressed and uncompressed data entries. They also have a hash value for the data, but I haven't tracked that down yet. I'll look into it later maybe.

    Included is complete source + binary. Using is simple, just copy "RustyHeartsExtractor.exe" and "ZlibDll.dll" to the "Rusty Hearts" folder and run "RustyHeartsExtractor.exe". There's a ton of files, so it takes a long time to run (probably because it's single threaded, but oh well, it's just a quick tool). Any errors encountered will be output to the console (make sure RustyHearts is not running and files are not locked!)

    RustyHeartsExtractor.cs
    Spoiler:

    Code:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Runtime.InteropServices;
    using System.Security.Cryptography;
    
    namespace RustyHeartsExtractor
    {
        class Program
        {
            [DllImport("ZlibDll.dll", CallingConvention = CallingConvention.Cdecl)]
            public static extern int Decompress(byte[] compressed_buffer, int compressed_size, byte[] decompressed_buffer, ref int decompressed_size);
    
            static void Main(string[] args)
            {
                try
                {
                    byte[] DecryptTable1 = new byte[]
                    {
                          0x30, 0x22, 0x41, 0xA8, 0x5B, 0xA6, 0x6A, 0x49, 0xBF, 0x53, 0x35, 0xE5, 0x9E, 0x0E, 0xEC, 0xB8, 0x5E, 0x15, 0x1F, 0xC1, 0x4F, 0xEC, 0x77, 0xE8, 0xB7, 0x4E, 0x87, 0xE6, 0xF5, 0x3C, 0xB3, 0x43
                        , 0xCC, 0x53, 0x36, 0xAC, 0x5A, 0x77, 0xB8, 0xDD, 0x30, 0x74, 0x8C, 0x4A, 0x9A, 0x9B, 0xBC, 0x0A, 0xA4, 0xAD, 0xBB, 0x13, 0x4B, 0x8C, 0xD4, 0x80, 0xCE, 0x65, 0x1D, 0x08, 0x5A, 0x6A, 0x6F, 0x25
                        , 0xF9, 0x3F, 0xEF, 0x1B, 0xA4, 0x72, 0x14, 0xED, 0x97, 0x22, 0x4A, 0x2E, 0xB8, 0x96, 0x4B, 0x8E, 0x96, 0x93, 0xF1, 0x28, 0xB2, 0x0B, 0x3C, 0xF8, 0x5D, 0xAA, 0xA9, 0x82, 0x13, 0x6E, 0xC1, 0xA9
                        , 0x20, 0x57, 0xB2, 0x5B, 0x16, 0xCF, 0x9E, 0x5F, 0xD4, 0xCC, 0x2E, 0xF5, 0xC9, 0x4C, 0x1C, 0xEE, 0xE3, 0x3F, 0x29, 0xB3, 0x06, 0x70, 0x43, 0x3D, 0xF5, 0x90, 0xA2, 0x42, 0x02, 0x98, 0x50, 0xFD
                        , 0x5D, 0x4E, 0x92, 0xAD, 0xAD, 0x7F, 0xAB, 0x60, 0x2C, 0xB8, 0x43, 0x76, 0x8F, 0x5F, 0xE6, 0xA7, 0x19, 0xE0, 0xB9, 0xB5, 0x62, 0x6B, 0xD4, 0x47, 0x69, 0x34, 0x0E, 0x6D, 0xA4, 0x52, 0xE3, 0x64
                        , 0x4A, 0x65, 0x47, 0xF5, 0x3F, 0x53, 0x5E, 0x8B, 0x1B, 0xFD, 0x21, 0xF7, 0xBA, 0x68, 0xF9, 0xDF, 0x68, 0xA8, 0x96, 0x0F, 0x8B, 0x01, 0x97, 0x58, 0x8C, 0x1E, 0xEF, 0xB3, 0x41, 0x44, 0x21, 0xDA
                        , 0xE0, 0xF4, 0xE0, 0x2D, 0xCD, 0x0B, 0xF0, 0x5C, 0x59, 0xD6, 0x99, 0xE7, 0x01, 0x15, 0x67, 0x32, 0xE0, 0x12, 0x2F, 0xCD, 0xA2, 0xDE, 0x52, 0xCE, 0xEC, 0xEF, 0x77, 0x0E, 0xBC, 0x38, 0x64, 0x8D
                        , 0xB4, 0xDB, 0x67, 0xFF, 0xC8, 0x66, 0x0C, 0x8A, 0x60, 0xE1, 0x2E, 0x00, 0x43, 0xA9, 0x37, 0x9C, 0x11, 0xAA, 0xB9, 0x98, 0xED, 0x21, 0x35, 0xD4, 0xC3, 0xDE, 0x65, 0x54, 0x9D, 0x1C, 0xB0, 0xA9
                    };
    
                    byte[] compressed_bytes = null;
    
                    using (FileStream fs = new FileStream("f00X.dat", FileMode.Open, FileAccess.Read))
                    {
                        using (BinaryReader br = new BinaryReader(fs))
                        {
                            compressed_bytes = br.ReadBytes((int)br.BaseStream.Length);
                        }
                    }
    
                    for (int x = 0; x < compressed_bytes.Length; ++x)
                    {
                        compressed_bytes[x] ^= DecryptTable1[x & 0xFF];
                    }
    
                    int decompressed_size = (compressed_bytes.Length << 4) - compressed_bytes.Length;
                    byte[] decompressed_bytes = new byte[decompressed_size];
    
                    int result = Decompress(compressed_bytes, compressed_bytes.Length, decompressed_bytes, ref decompressed_size);
                    if (result != 0)
                    {
                        Console.WriteLine("Error: Decompress returned error code {0}.", result);
                        return;
                    }
    
                    Dictionary<int, FileStream> archives = new Dictionary<int, FileStream>();
                    Dictionary<int, BinaryReader> readers = new Dictionary<int, BinaryReader>();
                    String[] files = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.pck");
                    foreach (String file in files)
                    {
                        FileStream ofs = new FileStream(file, FileMode.Open, FileAccess.Read);
                        BinaryReader obr = new BinaryReader(ofs);
                        Int32 key = Int32.Parse(Path.GetFileNameWithoutExtension(file));
                        archives.Add(key, ofs);
                        readers.Add(key, obr); 
                    }
    
                    using (MemoryStream ms = new MemoryStream(decompressed_bytes, 0, decompressed_size, false))
                    {
                        using (BinaryReader br = new BinaryReader(ms))
                        {
                            while (br.BaseStream.Position != br.BaseStream.Length)
                            {
                                try
                                {
                                    UInt16 len = br.ReadUInt16();
                                    String name = Encoding.Unicode.GetString(br.ReadBytes(len * 2));
                                    byte archive = br.ReadByte(); // Which archive is it in
                                    Int32 size = br.ReadInt32(); // Size of the file
                                    UInt32 hash = br.ReadUInt32(); // Guessing the hash of the data, might check it out later
                                    long offset = br.ReadInt64(); // Offset in the file
    
                                    BinaryReader br2 = readers[archive];
                                    br2.BaseStream.Position = offset;
                                    byte[] bytes = br2.ReadBytes(size);
    
                                    Directory.CreateDirectory(Path.GetDirectoryName(Directory.GetCurrentDirectory() + "\\output\\" + name));
                                    using (FileStream ofs = new FileStream(Directory.GetCurrentDirectory() + "\\output\\" + name, FileMode.Create, FileAccess.Write))
                                    {
                                        using (BinaryWriter bw = new BinaryWriter(ofs))
                                        {
                                            bw.Write(bytes);
                                            bw.Flush();
                                        }
                                    }
                                }
                                catch (Exception ex)
                                {
                                    Console.WriteLine("Error: {0}", ex);
                                }
                            }
                        }
                    }
    
                    foreach (var kvp in archives)
                    {
                        kvp.Value.Close();
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Error: {0}", ex);
                }
            }
        }
    }


    zlibdll.cpp (zlib can be downloaded from its home page if needed.)
    Spoiler:

    Code:
    #include <windows.h>
    #include "zlib/zlib.h"
    #include <stdio.h>
    
    extern "C" __declspec(dllexport) int Decompress(unsigned char * compressed, unsigned int compressed_size, unsigned char * decompressed, unsigned int * decompressed_size )
    {
    	unsigned int est_size = *decompressed_size * 5;
    	if( est_size < 4096 ) est_size = 4096;
    	unsigned char * workspace = (unsigned char *)malloc( est_size );
    	int result = Z_OK;
    	do 
    	{
    		result = uncompress((Bytef*)workspace, (uLongf *)&est_size, (Bytef*)compressed, compressed_size);
    		if( result == Z_OK )
    		{
    			if( *decompressed_size >= est_size )
    			{
    				*decompressed_size = est_size;
    				memcpy( decompressed, workspace, est_size );
    			}
    			else
    			{
    				result = -10; // decompression size mismatch
    			}
    		}
    		else if( result == Z_BUF_ERROR )
    		{
    			est_size *= 2;
    			workspace = (unsigned char *)realloc(workspace, est_size);
    		}
    	} while( result == Z_BUF_ERROR );
    	free( workspace );
    	return result;
    }
    
    extern "C" __declspec(dllexport) int Compress(unsigned char * decompressed, unsigned int decompressed_size, unsigned char * compressed, unsigned int * compressed_size )
    {
    	unsigned int est_size = decompressed_size * 5;
    	if( est_size < 4096 ) est_size = 4096;
    	unsigned char * workspace = (unsigned char *)malloc( est_size );
    	int result = Z_OK;
    	do 
    	{
    		result = compress((Bytef*)workspace, (uLongf *)&est_size, (Bytef*)decompressed, decompressed_size);
    		if( result == Z_OK )
    		{
    			*compressed_size = est_size;
    			memcpy( compressed, workspace, est_size );
    		}
    		else if( result == Z_BUF_ERROR )
    		{
    			est_size *= 2;
    			workspace = (unsigned char *)realloc(workspace, est_size);
    		}
    	} while( result == Z_BUF_ERROR );
    	free( workspace );
    	return result;
    }


    Some screens:


    This game has some pretty nice music! Everyone one is free to extend the code to make it threaded, add guis, or allow specific extraction capabilities. Packing shouldn't be too hard once the last field is worked out and any file headers in the data files. If you post anywhere else, please refer back to ragezone.

    Download: Attached w/ Full Source (VirusTotal)
    Attached Files Attached Files

  6. #21
    DRGunZ 2 Creator wesman2232 is offline
    MemberRank
    Jan 2007 Join Date
    Erie, PALocation
    4,872Posts

    Re: Rusty Hearts

    You can use this extractor, filter out what you want, etc.
    I'll try your program out too pushedx, but there is just too many .txt files.
    Attached Files Attached Files

  7. #22
    Apprentice Redor is offline
    MemberRank
    Dec 2010 Join Date
    15Posts

    Re: Rusty Hearts

    The game itself is pretty great . Just take some time to level up , grind required ^^

  8. #23
    I am n00b. baothai is offline
    MemberRank
    Apr 2011 Join Date
    USALocation
    481Posts

    Re: Rusty Hearts

    Wow you guys found out alot 0-0
    Well I hope it would be enough for a PS :D

  9. #24
    We are Maverick! Dell Honne is offline
    MemberRank
    Feb 2009 Join Date
    ON, CanadaLocation
    3,271Posts

    Re: Rusty Hearts

    Quote Originally Posted by baothai View Post
    Wow you guys found out alot 0-0
    Well I hope it would be enough for a PS :D
    Creating a private server of a game takes more than just screwing with the client :P

  10. #25
    I am n00b. baothai is offline
    MemberRank
    Apr 2011 Join Date
    USALocation
    481Posts

    Re: Rusty Hearts

    Quote Originally Posted by Dell Honne View Post
    Creating a private server of a game takes more than just screwing with the client :P
    Yeah I notice :D
    but dont you need like database and all those stuff right? :D
    also one question
    could u guys explain this in simpler terms 0-0 for new peeps

    Spoiler:
    Installing sql 2005 or more, then attack 2 is Db_Logs and Db_Tank db (1 db is not there anymore but the ldf file, but the db is not important) place sa 123,456 pass
    - In the source directory server releasePatch the section runs
    - By creating a folder d drive D: \ dandantang, then the Herman-PC \ workspace \ Servercopy out what's in it to D: \ dandantang
    - At the Drive E: \ create directory E: \ ddtserver (PvE) and also copy everything that the Herman-PC \ workspace \ Server on
    If there is to drive E releasePatch \ ... find the file of the form. Exe.config reconfiguration.
    - Set the iis to run asp web
    - Find the correct ip machine config file (many files)
    - Temporary such as DC running server without being dis those still in the server error message.
    - The most important but the file copy to C: \ Inetpub \ wwwroot to run the web host (still looking)
    Last edited by baothai; 05-08-11 at 02:00 AM.

  11. #26
    Valued Member StarNet is offline
    MemberRank
    May 2005 Join Date
    localhostLocation
    134Posts

    Re: Rusty Hearts

    Quote Originally Posted by baothai View Post
    Spoiler:
    Installing sql 2005 or more, then attack 2 is Db_Logs and Db_Tank db (1 db is not there anymore but the ldf file, but the db is not important) place sa 123,456 pass
    - In the source directory server releasePatch the section runs
    - By creating a folder d drive D: \ dandantang, then the Herman-PC \ workspace \ Servercopy out what's in it to D: \ dandantang
    - At the Drive E: \ create directory E: \ ddtserver (PvE) and also copy everything that the Herman-PC \ workspace \ Server on
    If there is to drive E releasePatch \ ... find the file of the form. Exe.config reconfiguration.
    - Set the iis to run asp web
    - Find the correct ip machine config file (many files)
    - Temporary such as DC running server without being dis those still in the server error message.
    - The most important but the file copy to C: \ Inetpub \ wwwroot to run the web host (still looking)
    please do it in someplace else like... here

  12. #27
    Member greedlt is offline
    MemberRank
    Dec 2008 Join Date
    Irvine, CaliforLocation
    75Posts

    Re: Rusty Hearts

    if anybody needs a beta key lemme know with a pm or quote to this post and i will be more than happy to give mine out.

    i got it in my email a while ago, so dont know if it is needed anymore

  13. #28
    Gamma nzrock is offline
    MemberRank
    Mar 2006 Join Date
    Auckland, NZLocation
    3,354Posts

    Re: Rusty Hearts

    I'm still waiting for my Sash- I mean Natasha :P

    &#x202a;Rusty Hearts (KR) - Natasha teaser trailer&#x202c;&rlm; - YouTube

  14. #29
    DRGunZ 2 Creator wesman2232 is offline
    MemberRank
    Jan 2007 Join Date
    Erie, PALocation
    4,872Posts

    Re: Rusty Hearts

    Haha, yeah. Natasha is going to rule. I love gunslingers.

    There was some news about the state of the game and what is coming up in upcoming patches.
    Topics include: Stamina, Level of Difficulty, PvP Changes, Quest and Dungeon Changes, and Item and Gear Changes.
    RH – State of the Game Volume 1 | Perfect World Community Blog

    There is also the Rusty Hearts Dev Diary #3:
    Rusty Hearts Video Game, Exclusive Art Style Diary HD | Video Clip | Game Trailers & Videos | GameTrailers.com

  15. #30
    We are Maverick! Dell Honne is offline
    MemberRank
    Feb 2009 Join Date
    ON, CanadaLocation
    3,271Posts

    Re: Rusty Hearts

    Removal of stamina = good
    Increase difficulty = great (Solo'ing VH shouldn't be possible imo)
    PvP = sounds good
    New items and gear = yay
    Quests and dungeons = maybe they will yeild more EXP now.



Page 2 of 3 FirstFirst 123 LastLast

Advertisement