Poszukiwane programy

Poszukiwane programy:
- NFSMW music exTraktor v 1.02 by REFERI
- NFS Music Conversion Tools

Programy

Program
ReadMe FAQ ChangeLog Inne Inne Najnowsza wersja Artykuły W przyszłości
Car Tuner ReadMe Ulepszenia Wersja 1.3 Ku pamięci. VAG NFS Music Extractor
NFS MW Save Editor ReadMe ChangeLog Technical Details Wersja 1.21 Konwersja VP6 do AVI krok po kroku NFS MW Black Edition
BinTex ReadMe FAQ ChangeLog Wersja 0.5.030 Konwersja AVI do VP6 krok po kroku NFS MW Control Panel
NFS Multimedia Converter ReadMe FAQ ChangeLog Zawieszenie projektu Szczegóły konwersji Wersja 1.6.0 Błędy z plikami OCX NFS MW Graphic Optimizer
NFS MW - Video Converter ReadMe Brak wersji Zapis heksadecymalny samochodów Background Changer
VP6 Converter (VP6 Builder) ReadMe Wersja 0.08 Ku pamięci. GENiEBEN NFS MW Language Selector
Sound eXchange by Dave Mercier Ku pamięci. jTommy NFS MW Timer
Game Archiver UnPacker ReadMe ChangeLog Wersja 0.6.0.3 PRO NFS TexEd
NFS MW Movies Conversion Tools ReadMe Brak wersji NFS MW Shop Spezial
No Intro Mega Pack (NIMP) ReadMe ChangeLog 3.5.21 NFS MW Menu Tweak
NFS MW - Total Converter ReadMe
Brak wersji NFS MW CamHack

Rozszerzenia występujące w grze

Rozszerzenia występujące w grze:
.BIN - .DDS - .VP6 - .BUN - .LZC - .LOC - .ABK - .GIN - .CSI - .FX - .DYN - .MXB - .MPF - .MUS - .BIG - .CSI - .EVT - .IDX - .HOO

piątek, 31 sierpnia 2012

NFS Most Wanted Save Editor - Technical Details

NFS Most Wanted Save Editor - Technical Details
A nuż komuś się przyda ;)

Po angielsku:


Need For Speed Most Wanted Save Editor
--------------------------------------

          Technical Details

          =================

If you (probably) have a wish to crate some better tools for editing savegame files for NFS Most Wanted then here is some (maybe) useful info about it.


First, about the limitations of my save editor:



  • It will work only with files of 63 596 bytes in length 
  • as it seems that the game allocates all the structures directly after the alias is created but initialises them progressively during the gameplay
  • Block locations are assumed non-moveable, thus the program uses constant file offsets
  • Bounty can be changed for the first car only because there is no reliable way to verify that the internal structures were initialised properly and won't be overwritten later, besides the total bounty is calculated dynamically from the different locations, so there is an improvement vector ;-)



The savefile is protected aginst damage/hack with the custom variation of the CRC32 checksum and MD5 hash, however it seems the game does not make any use of CRC32 checksums, but that requires in fact a more detailed investigation.


This save editor updates all checksums anyway and besides allows you to make some changes to the save files by hand using any hex-editor and update the checksums only.


Savefile itself consists of the header, data block and MD5 hash of that data block. File layout is as follows (all fields are stored in little endian format):

offseet
field
lenght
value
------------------------------------------------------------------------------------------------------
0magic4 byte'MC02'
0x4file_length4 bytetotal file length in bytes
0x8unknown14 byteusually 8
0xCdata_length14 bytesaved data length (including MD5 hash) ?
0x10crc32_blk14 bytecrc32 of a 8-byte data block at offset 0x1C
0x14crc32_data4 bytecrc32 of a saved data (offset 0x24 till the end of the file)
0x18crc32_blk24 bytecrc32 of the above data (0x18 byte block from the file beginning)
0x1Cunknown24 byteusually 0x10D
0x20data_length24 bytefollowing block length ? usually equal to data_length1
0x24unk_31 bytezero (16-byte zero block)
....unk_nzero
0x34saved_databeginning of the saved data
..............data
0xF85CMD5_hash16 byteMD5-hash of the saved data (offset 0x34 till the end-16 bytes)


As you can see there are 4 checksums, but it seems that the game uses only the MD5 hash to make the conclusion that the file was not altered in any way.

MD5 implementation used in this save editor was taken from the OpenSSL project sources.

EA's CRC32 algo uses a table, the sample code is following:


DWORD EAcrc32(void *pData, DWORD cbData)
{
DWORD crc32 = 0;
BYTE *pbyData = (BYTE *)pData;

if ( cbData < 4 )
return 0;

crc32 |= (*pbyData++)<<24 font="font">
crc32 |= (*pbyData++)<<16 font="font">
crc32 |= (*pbyData++)<<8 font="font">
crc32 |= (*pbyData++);
cbData -= 4;
crc32 = ~crc32;

while ( cbData-- )
crc32 = ((crc32<<8 crc32="crc32" crc32tab="crc32tab" pbydata="pbydata">>24];

return ~crc32;
}

Here is the table:

DWORD EAcrc32tab[] = {
0x000000000x04C11DB70x09823B6E0x0D4326D9
0x130476DC0x17C56B6B0x1A864DB20x1E475005
0x2608EDB80x22C9F00F0x2F8AD6D60x2B4BCB61
0x350C9B640x31CD86D30x3C8EA00A0x384FBDBD
0x4C11DB700x48D0C6C70x4593E01E0x4152FDA9
0x5F15ADAC0x5BD4B01B0x569796C20x52568B75
0x6A1936C80x6ED82B7F0x639B0DA60x675A1011
0x791D40140x7DDC5DA30x709F7B7A0x745E66CD
0x9823B6E00x9CE2AB570x91A18D8E0x95609039
0x8B27C03C0x8FE6DD8B0x82A5FB520x8664E6E5
0xBE2B5B580xBAEA46EF0xB7A960360xB3687D81
0xAD2F2D840xA9EE30330xA4AD16EA0xA06C0B5D
0xD4326D900xD0F370270xDDB056FE0xD9714B49
0xC7361B4C0xC3F706FB0xCEB420220xCA753D95
0xF23A80280xF6FB9D9F0xFBB8BB460xFF79A6F1
0xE13EF6F40xE5FFEB430xE8BCCD9A0xEC7DD02D
0x348670770x30476DC00x3D044B190x39C556AE
0x278206AB0x23431B1C0x2E003DC50x2AC12072
0x128E9DCF0x164F80780x1B0CA6A10x1FCDBB16
0x018AEB130x054BF6A40x0808D07D0x0CC9CDCA
0x7897AB070x7C56B6B00x711590690x75D48DDE
0x6B93DDDB0x6F52C06C0x6211E6B50x66D0FB02
0x5E9F46BF0x5A5E5B080x571D7DD10x53DC6066
0x4D9B30630x495A2DD40x44190B0D0x40D816BA
0xACA5C6970xA864DB200xA527FDF90xA1E6E04E
0xBFA1B04B0xBB60ADFC0xB6238B250xB2E29692
0x8AAD2B2F0x8E6C36980x832F10410x87EE0DF6
0x99A95DF30x9D6840440x902B669D0x94EA7B2A
0xE0B41DE70xE47500500xE93626890xEDF73B3E
0xF3B06B3B0xF771768C0xFA3250550xFEF34DE2
0xC6BCF05F0xC27DEDE80xCF3ECB310xCBFFD686
0xD5B886830xD1799B340xDC3ABDED0xD8FBA05A
0x690CE0EE0x6DCDFD590x608EDB800x644FC637
0x7A0896320x7EC98B850x738AAD5C0x774BB0EB
0x4F040D560x4BC510E10x468636380x42472B8F
0x5C007B8A0x58C1663D0x558240E40x51435D53
0x251D3B9E0x21DC26290x2C9F00F00x285E1D47
0x36194D420x32D850F50x3F9B762C0x3B5A6B9B
0x0315D6260x07D4CB910x0A97ED480x0E56F0FF
0x1011A0FA0x14D0BD4D0x19939B940x1D528623
0xF12F560E0xF5EE4BB90xF8AD6D600xFC6C70D7
0xE22B20D20xE6EA3D650xEBA91BBC0xEF68060B
0xD727BBB60xD3E6A6010xDEA580D80xDA649D6F
0xC423CD6A0xC0E2D0DD0xCDA1F6040xC960EBB3
0xBD3E8D7E0xB9FF90C90xB4BCB6100xB07DABA7
0xAE3AFBA20xAAFBE6150xA7B8C0CC0xA379DD7B
0x9B3660C60x9FF77D710x92B45BA80x9675461F
0x8832161A0x8CF30BAD0x81B02D740x857130C3
0x5D8A90990x594B8D2E0x5408ABF70x50C9B640
0x4E8EE6450x4A4FFBF20x470CDD2B0x43CDC09C
0x7B827D210x7F4360960x7200464F0x76C15BF8
0x68860BFD0x6C47164A0x610430930x65C52D24
0x119B4BE90x155A565E0x181970870x1CD86D30
0x029F3D350x065E20820x0B1D065B0x0FDC1BEC
0x3793A6510x3352BBE60x3E119D3F0x3AD08088
0x2497D08D0x2056CD3A0x2D15EBE30x29D4F654
0xC5A926790xC1683BCE0xCC2B1D170xC8EA00A0
0xD6AD50A50xD26C4D120xDF2F6BCB0xDBEE767C
0xE3A1CBC10xE760D6760xEA23F0AF0xEEE2ED18
0xF0A5BD1D0xF464A0AA0xF92786730xFDE69BC4
0x89B8FD090x8D79E0BE0x803AC6670x84FBDBD0
0x9ABC8BD50x9E7D96620x933EB0BB0x97FFAD0C
0xAFB010B10xAB710D060xA6322BDF0xA2F33668
0xBCB4666D0xB8757BDA0xB5365D030xB1F740B4
};

Yep, that's all ;-)

Best regards,
     CoDe RiPPeR                    code_ripper@ukr.net



Po polsku


Need For Speed Most Wanted Save Editor
----------------------------------------------

Informacje techniczne
=======================
Jeśli chciałbyś stworzyć lepsze narzędzie do edytowania zapisów stanu gry w NFS Most Wanted, to mam dla Ciebie (najprawdopodobniej) użyteczne informacje o tym programie.

Po pierwsze, o limitach w moim edytorze:
  1. Program działa tylko z plikami o długości 63 596 bajtów. Gra tworzy alias o takim rozmiarze na początku rozgrywki i stopniowo wypełnia je, w miarę postępów poczynionych w grze.
  2. (*) Lokacje bloków są z założenia nieruchome, więc program wykorzystuje stałe przesunięcia plików
  3. (*) Notowania mogą być zmienione tylko dla pierwszego samochodu ponieważ nie ma niezawodnego sposobu na sprawdzenie, czy wewnętrzne struktury zostały zainicjowane prawidłowo i nie będą nadpisane później. Poza całkowitymi notowaniami oblicza się dynamicznie z różnych miejsc, więc jest ulepszenie wektora ;-)

Zapisy gry są chronione przeciwko znieszczeniom/zhakowaniu o dodatkową odmianę sum kontrolnych CRC32 i hash MD5. Wydaje mi się jednak, że gra nie używa sum kontrolnych CRC32, ale trzebaby było to dokładnie sprawdzić.

Ten program aktualizuje wszystkie sumy kontrolne. Poza tym pozwala dokonać pewnych zmian ręcznie używając dowolnego hex-edytora i aktualizując tylko sumy kontrolne.

Zapis składa się z nagłówka, bloku danych i hash'u MD5 tego bloku. Układ plików jest następujący (wszystkie pola są zapisywane w formacie "little endian" (cienkokońcowość)):
Przesunięcie
Pole
Długość
Wartość
--------------------------------------------------------------------------------------------------------
0magic4 bajty'MC02'
0x4file_length4 bajty Całkowita długość pliku w bajtach
0x8unknown14 bajty zazwyczaj 8
0xCdata_length14 bajty Zapisana długość danych (włączając hash MD5)?
0x10crc32_blk14 bajty Crc32 z 8-bajtowego bloku danych o przesunięciu 0x1C
0x14crc32_data4 bajty 
Crc32 z zapisanych danych (przesunięcie 0x24 aż do końca pliku)
0x18crc32_blk24 bajty Crc32 z powyższych danych (0x18 bajtów od początku pliku)
0x1Cunknown24 bajty Zazwyczaj 0x10D
0x20data_length24 bajty Po długości bloku? Zwykle równa się data_length1
0x24unk_31 bajty Zero (16-byte zero block)
....unk_nZero
0x34saved_dataPoczątek zapisywania danych
..............Dane
0xF85CMD5_hash16 bajtówMD5-hash z zapisanych danych (przesunięcie 0x34 do końca 16 bajtu)


Jak widać istnieją 4 sumy kontrolne, jednak wydaje się, że gra wykorzystuje tylko hash MD5 do sprawdzenia czy plik nie został zmodyfikowany w jakikolwiek sposób.

Implementacja MD5 została zaczerpnięta z projektu OpenSSL.

EA's CRC32 algorytm wykorzystuje tabelę, przykładowy kod jest następujący:


DWORD EAcrc32(void *pData, DWORD cbData)
{
DWORD crc32 = 0;
BYTE *pbyData = (BYTE *)pData;

if ( cbData < 4 )
return 0;

crc32 |= (*pbyData++)<<24 font="font">
crc32 |= (*pbyData++)<<16 font="font">
crc32 |= (*pbyData++)<<8 font="font">
crc32 |= (*pbyData++);
cbData -= 4;
crc32 = ~crc32;

while ( cbData-- )
crc32 = ((crc32<<8 crc32="crc32" crc32tab="crc32tab" pbydata="pbydata">>24];

return ~crc32;
}

Tu jest tabela:

DWORD EAcrc32tab[] = {
0x000000000x04C11DB70x09823B6E0x0D4326D9
0x130476DC0x17C56B6B0x1A864DB20x1E475005
0x2608EDB80x22C9F00F0x2F8AD6D60x2B4BCB61
0x350C9B640x31CD86D30x3C8EA00A0x384FBDBD
0x4C11DB700x48D0C6C70x4593E01E0x4152FDA9
0x5F15ADAC0x5BD4B01B0x569796C20x52568B75
0x6A1936C80x6ED82B7F0x639B0DA60x675A1011
0x791D40140x7DDC5DA30x709F7B7A0x745E66CD
0x9823B6E00x9CE2AB570x91A18D8E0x95609039
0x8B27C03C0x8FE6DD8B0x82A5FB520x8664E6E5
0xBE2B5B580xBAEA46EF0xB7A960360xB3687D81
0xAD2F2D840xA9EE30330xA4AD16EA0xA06C0B5D
0xD4326D900xD0F370270xDDB056FE0xD9714B49
0xC7361B4C0xC3F706FB0xCEB420220xCA753D95
0xF23A80280xF6FB9D9F0xFBB8BB460xFF79A6F1
0xE13EF6F40xE5FFEB430xE8BCCD9A0xEC7DD02D
0x348670770x30476DC00x3D044B190x39C556AE
0x278206AB0x23431B1C0x2E003DC50x2AC12072
0x128E9DCF0x164F80780x1B0CA6A10x1FCDBB16
0x018AEB130x054BF6A40x0808D07D0x0CC9CDCA
0x7897AB070x7C56B6B00x711590690x75D48DDE
0x6B93DDDB0x6F52C06C0x6211E6B50x66D0FB02
0x5E9F46BF0x5A5E5B080x571D7DD10x53DC6066
0x4D9B30630x495A2DD40x44190B0D0x40D816BA
0xACA5C6970xA864DB200xA527FDF90xA1E6E04E
0xBFA1B04B0xBB60ADFC0xB6238B250xB2E29692
0x8AAD2B2F0x8E6C36980x832F10410x87EE0DF6
0x99A95DF30x9D6840440x902B669D0x94EA7B2A
0xE0B41DE70xE47500500xE93626890xEDF73B3E
0xF3B06B3B0xF771768C0xFA3250550xFEF34DE2
0xC6BCF05F0xC27DEDE80xCF3ECB310xCBFFD686
0xD5B886830xD1799B340xDC3ABDED0xD8FBA05A
0x690CE0EE0x6DCDFD590x608EDB800x644FC637
0x7A0896320x7EC98B850x738AAD5C0x774BB0EB
0x4F040D560x4BC510E10x468636380x42472B8F
0x5C007B8A0x58C1663D0x558240E40x51435D53
0x251D3B9E0x21DC26290x2C9F00F00x285E1D47
0x36194D420x32D850F50x3F9B762C0x3B5A6B9B
0x0315D6260x07D4CB910x0A97ED480x0E56F0FF
0x1011A0FA0x14D0BD4D0x19939B940x1D528623
0xF12F560E0xF5EE4BB90xF8AD6D600xFC6C70D7
0xE22B20D20xE6EA3D650xEBA91BBC0xEF68060B
0xD727BBB60xD3E6A6010xDEA580D80xDA649D6F
0xC423CD6A0xC0E2D0DD0xCDA1F6040xC960EBB3
0xBD3E8D7E0xB9FF90C90xB4BCB6100xB07DABA7
0xAE3AFBA20xAAFBE6150xA7B8C0CC0xA379DD7B
0x9B3660C60x9FF77D710x92B45BA80x9675461F
0x8832161A0x8CF30BAD0x81B02D740x857130C3
0x5D8A90990x594B8D2E0x5408ABF70x50C9B640
0x4E8EE6450x4A4FFBF20x470CDD2B0x43CDC09C
0x7B827D210x7F4360960x7200464F0x76C15BF8
0x68860BFD0x6C47164A0x610430930x65C52D24
0x119B4BE90x155A565E0x181970870x1CD86D30
0x029F3D350x065E20820x0B1D065B0x0FDC1BEC
0x3793A6510x3352BBE60x3E119D3F0x3AD08088
0x2497D08D0x2056CD3A0x2D15EBE30x29D4F654
0xC5A926790xC1683BCE0xCC2B1D170xC8EA00A0
0xD6AD50A50xD26C4D120xDF2F6BCB0xDBEE767C
0xE3A1CBC10xE760D6760xEA23F0AF0xEEE2ED18
0xF0A5BD1D0xF464A0AA0xF92786730xFDE69BC4
0x89B8FD090x8D79E0BE0x803AC6670x84FBDBD0
0x9ABC8BD50x9E7D96620x933EB0BB0x97FFAD0C
0xAFB010B10xAB710D060xA6322BDF0xA2F33668
0xBCB4666D0xB8757BDA0xB5365D030xB1F740B4
};


Tak, to wszystko ;-)



Pozdrawiam,

     CoDe RiPPeR                    code_ripper@ukr.net



(*) - nie byłem pewien tłumaczenia


Brak komentarzy:

Tłumacz