Projektowanie stron WWW od podszewki

Artykuły na każdy temat

[PHP] Konwerter plików KSC

Dodano 29.05.2011r. o 17:42
Jeżeli nie masz nic wspólnego z grą Knight Online (MMORPG) i/lub nie lubisz ciekawostek to możesz sobie darować czytanie tego wpisu. Na początku wyjaśnię czym jest format KSC. Owe rozszerzenie jest zakodowaną formą screenshota z gry. O ile się nie mylę, to jest on wykorzystywany w grach produkowanych przez korporacje MGame. Zasada działania tworzenia takiego ss'a jest banalnie prosta. Klikamy - czyli minus na klawiaturze numerycznej i w katalogu gdzie została uruchomiona gra pojawia się zrzut ekranu, który w nazwie ma datę i czas wykonania. W momencie wykonania screen capture klient gry pobiera aktualny obraz, dokonuje konwersji i zapisuje tam gdzie trzeba.

Jakiś czas temu wpadłem na pomysł, aby wszystkie swoje zrzuty ekranu z gry zapisać w formacie JPEG. Przed wykonaniem skryptu i programu, który zaprezentuje Wam poniżej nie wiedziałem, że z rąk deweloperów gry wyszedł nowszy KscViewer z funkcją zapisywania więcej niż jednego pliku KSC do postaci zwykłego obrazka. Dopiero po napisaniu aplikacji konwertera pewien znajomy z Egiptu uświadomił mnie, że takowy KscViewer został udostępniony. Kluczową sprawą tego formatu był fakt, że zrzut ekranu z rozszerzeniem KSC był wolny od manipulacji. No właśnie był wolny od manipulacji do czasu, kiedy K2Network zaczęło otrzymywać fake KSC. Od tego czasu korporacja przestała wymagać owych plików. Kolejne utrudnienie dla graczy, bo GM musiał od teraz złapać oszusta na gorącym uczynku. Nie było to takie łatwe, bo większość botów do tej gry automatycznie wylogowuje czitera, gdy ktoś z wyższą rangą wchodził na serwer. Z resztą nad polityką K2Network czy tam G1 jak to się teraz zwie nie będę się długo rozwodził, bo każdy, kto grał w tą grę wie jak traktuje się zwykłego gracza.

Na początku zaprezentuję Wam aplikacje, która została napisana w VC++ i posiada w sobie tylko implementacje metody konwersji plików KSC na JPEG. Program nazywa się KSC-Converter (skan) i przyjmuje tylko jeden parametr (ścieżkę do pliku KSC). Przykładowo można go odpalić z konsoli DOS'owej albo z samego Uruchom.
Kod:
C:\ścieżka\do\konwertera\KSC-Converter.exe "C:\ścieżka\do\pliku\KSC\losowy.ksc"
Wynikiem działania tego programu będzie plik losowy.JPEG, który pojawi się w folderze, w którym znajdował się plik KSC. Mogłem dać dwa parametry do programu (input i input) jednak nie chciało mi się. Nikt mi za to nie płaci i nie ma, co się użalać nad rozlanym mlekiem. Gdybyście chcieli przekonwertować cały folder to wsadzacie w niego KSC-Converter.exe i tworzycie plik BAT o następującej zawartości:
Kod:
@echo off

FOR %%i IN (*.ksc) DO KSC-Converter.exe "%%i"
Po jego zapisaniu odpalamy go i jeżeli nic nie popsuliście to w wyniku działania aplikacji w tym samym folderze, co pliki KSC powinny się pojawić pliki JPEG. Przy okazji powiem ciekawostkę. DOS nie akceptuje - albo _ w nazwie programu. Bardziej to drugie. Jeżeli będziecie chcieli to możecie samemu sprawdzić. Myślę, że taka forma jest łatwiejsza niż zaznaczanie dużej ilości plików KSC z okna KscViewer'a.

W ramach uzupełnienia stworzyłem wersje PHP tego cuda. Tym razem istnieje także metoda zapisu do formatu KSC. Nie ma, co się rozwodzić nad metodami i polami klasy, bo osoba, która choć trochę zna PHP i OOP będzie wiedzieć, co jest grane. Pod koniec chce tylko zauważyć, że m_r musi być "zerowane" do wartości 0x464 za każdym razem przed konwersją do JPEG czy KSC. Jeżeli chcecie zrobić tak samo jak z FOR w DOS'ie to wystarczy, że użyjecie funkcji glob() i przekażecie parametr do odpowiedniej metody, a następnie odpowiednio zmienicie ścieżkę.

Wywołanie metod z klasy wygląda następująco:
Kod:
<?php
include('./ksc.class.php');

$ksc = new ksc;

// KSC to JPG
$ksc -> open('./data/a.ksc');
$ksc -> decrypt_ksc();
$ksc -> save('./data/a.jpg');
// JPG to KSC
$ksc -> open('./data/b.jpg');
$ksc -> encrypt_jpg();
$ksc -> save('./data/b.ksc');
?>
Tak wygląda ksc.class.php:
Kod:
<?php
/**
 * @author CapaciousCore
 * @version 1.0
 */

class ksc
{
 private $m_r 0x464;
 private $m_c1 0xCE6D;
 private $m_c2 0x58BF;
 private $data;

 public function open($path)
 {
  $data = @file_get_contents($path);
  $length = @filesize($path);

  if($data && $length)
  {
   $this -> m_r 0x464;
   $this -> data['input'] = $data;
   $this -> data['length'] = $length;

   return true;
  }
  else
  {
   return false;
  }
 }

 public function save($path)
 {
  $result = (@file_put_contents($path$this -> data['output']) ? true false);
  unset($this -> data);

  return $result;
 }

 public function decrypt_ksc()
 {
  $destination_length $this -> data['length'] - 8;

  for($h 0$h 8; ++$h)
  {
   $this -> decrypt(ord($this -> data['input'][$h]));
  }

  for($h 8$h $destination_length; ++$h)
  {
   $this -> data['output'][] = chr($this -> decrypt(ord($this -> data['input'][$h])));
  }
 }

 public function encrypt_jpg()
 {
  $destination_length $this -> data['length'] + 8;

  // If PHP < 4.2.0 then use srand(floor(time() / (60*60*24))) or mt_srand(/* whatever you want */)
  for($h 0$h 4; ++$h)
  {
   $header[$h] = rand() & 0xFF;
  }

  $header[4] = 0x4B;
  $header[5] = 0x53;
  $header[6] = 0x43;
  $header[7] = 1;

  $header array_map('chr'$header);

  for($h 0$h 8; ++$h)
  {
   $this -> data['output'][$h] = chr($this -> encrypt(ord($header[$h])));
  }

  for($h 0$h $destination_length; ++$h)
  {
   $this -> data['output'][] = chr($this -> encrypt(ord($this -> data['input'][$h])));
  }
 }

 private function decrypt($cipher)
 {
  $plain = ($cipher ^ ($this -> m_r >> 8));
  $this -> m_r = (($cipher $this -> m_r) * $this -> m_c1 $this -> m_c2) & 0xFFFF;

  return $plain;
 }

 private function encrypt($plain)
 {
  $cipher = ($plain ^ ($this -> m_r >> 8));
  $this -> m_r = (($cipher $this -> m_r) * $this -> m_c1 $this -> m_c2) & 0xFFFF;

  return $cipher;
 }
}
?>
Przykładem zmodyfikowanego formatu KSC jest plik fake.ksc.

Cały gotowy example można ściągnąć stad ksc.source.rar.

KscViewer - rożne aplikacje

  • Nowszy KscViewer.exe (skan fałszywie pozytywny) z możliwością konwersji wielu plików KSC na raz
  • Starszy KscViewer.exe (o dziwo skan czysty) bez możliwości konwersji wielu plików KSC na raz
  • Wersja Debug KscViewer.exe (czysty skan) bez możliwości konwersji wielu plików KSC na raz ponieważ jest to aplikacja skompilowana z bardzo starych źródeł (zwróć uwagę na wielkość binarki - ile bajerów jest dodawanych do wersji debug)

Komentarze

Brak komentarzy

Dodaj komentarz

Zostaw komentarz jeżeli możesz! Nie bądź przysłowiowym botem! Nie bądź obojętny! Ciebie to nic nie kosztuje, a mi sprawi uśmiech na twarzy.
Zezwolono używać: BBCode
Zabroniono używać:
znaczników HTML

(Wymagany)

(Wymagany, niepublikowany)

(Nie wymagana)

Token:

Obrazek dla bota

(Przepisz tylko cyfry!)

(Wymagana)