Patched Client + Some Information.

08/01/2010 16:09 floxy2#1
Habe mal aus Spass ein bisschen Mit odbg rumgespielt und ein par interessante Sachen herausgefunden.
Also erstmal sind die Dateien metin2client.bin und devil.dll mit upx gepackt.

(UPX 0.89.6 - 1.02 / 1.05 - 2.90 -> Markus & Laszlo) (PEID)

Die Unpacked Versionen findet ihr im Anhang.

Um zu verhindern das der Client diese gleich wieder aufs Orginal zurück patcht müssen wir den Client selbst etwas modifizieren.


Der Patcher funktioniert so:


1)Lese vom Patch Server die aktuelle crclist
2)Suche jede auf der crc List enthaltene Datei und überprüfe die gleichheit der Checksumme mit der in der crclist enthaltenen Checksummme.
3)Sollten sich diese unterscheiden, lade die Korrekte Datei vom Server.



In Assembly ist das folgende Stelle:

Code:
0040E4D9    .  50                PUSH EAX
0040E4DA    .  8B4424 34         MOV EAX,DWORD PTR SS:[ESP+34]
0040E4DE    .  51                PUSH ECX //ECX=checksumme
0040E4DF    .  8B4C24 40         MOV ECX,DWORD PTR SS:[ESP+40]
0040E4E3    .  52                PUSH EDX
0040E4E4    .  50                PUSH EAX
0040E4E5    .  51                PUSH ECX//ECX=checksumme
0040E4E6    .  E8 E54A0000       CALL metin2.00412FD0
0040E4EB    .  83C4 14           ADD ESP,14
0040E4EE    .  84C0              TEST AL,AL//AL = 1 Checksumme stimmt.
0040E4F0    .  0F85 48010000     JNZ metin2.0040E63E
Nun könnte man entweder die gecallte Funktion modifizieren das AL = 1 immer zutrifft, oder man patcht einfach den Jump damit man den Patch Teil überspringt.
Code:
JNZ -> JMP
Der Gepatche Client sowie ein par interessante Files wie die aktuelle Checksumlist befinden sich im Archiv re.rar.

Es sollte euch nun leichter fallen folgende Files ungehindert zu modifizieren oder zu überschreiben:

Code:
724857a9 110592 30072960 2380483840 artpclnt.dll
a1b116a2 8 30092662 217018048 channel.inf
471c7e8a 35328 30072960 2381283840 dsetup.dll
5e97d387 15 30072959 2374051136 locale.cfg
c6d6e5c6 2631640 30063269 2481349376 metin2.bin
8ccc0df1 914944 30084628 753674112 metin2client.bin
cab6c049 131072 30072960 2381083840 mscoree.dll
6c5812e3 349696 30072960 2380483840 mss32.dll
7f386569 401462 30072960 2381083840 msvcp60.dll
192baed0 434252 30072960 2380583840 msvcrtd.dll
60c762a2 13368 30092111 367398144 pack\locale_de.addr
ac0bcd2 5620 30091258 947101632 pack\locale_de.eix
3200b426 2017024 30091258 937301632 pack\locale_de.epk
6e92f4c5 17 30072959 2373851136 patch.add
249261c1 9 30072959 2373851136 patch.ver
224b3e35 3682 30072959 2372751136 patchskin\btn_hwreport_up.bmp
4dafbcba 10388 30072959 2372951136 patchskin\btn_idpwd_dn.bmp
b6bb774c 10388 30072959 2371951136 patchskin\btn_idpwd_fs.bmp
b8e1c6a 10388 30072959 2372651136 patchskin\btn_idpwd_up.bmp
c02b913f 7868 30072959 2372951136 patchskin\btn_newaccount_dn.bmp
ef554bca 7868 30072959 2373251136 patchskin\btn_newaccount_fs.bmp
9402681a 7868 30072959 2372651136 patchskin\btn_newaccount_up.bmp
6ff6fd46 7868 30072959 2372151136 patchskin\btn_quit_dn.bmp
70310ae4 7868 30072959 2372651136 patchskin\btn_quit_fs.bmp
39ae26a0 7868 30072959 2372951136 patchskin\btn_quit_up.bmp
99e459cb 10388 30072959 2372951136 patchskin\btn_settings_dn.bmp
48353f31 10388 30072959 2372951136 patchskin\btn_settings_fs.bmp
2811ae8 10388 30072959 2372351136 patchskin\btn_settings_up.bmp
38f07686 13448 30072959 2372651136 patchskin\btn_startgame_dn.bmp
233048e5 13448 30072959 2372751136 patchskin\btn_startgame_fs.bmp
18598d10 13448 30072959 2372951136 patchskin\btn_startgame_up.bmp
35ee14cc 720056 30072959 2372951136 patchskin\main.bmp
e176a4ae 131072 30072960 2380883840 patchupdater.exe
a4a5e8de 202240 30072960 2380883840 patchw32.dll
1816d4f4 258352 30072960 2380583840 unicows.dll
Ihr könnt auch den metin2client.bin mit der unpacked Version überschreiben um das Debugging etwas leichter zu haben :)

Patched Client:
[Only registered and activated users can see links. Click Here To Register...]
Unpacked Client:
[Only registered and activated users can see links. Click Here To Register...]
08/01/2010 18:45 floxy2#2
Update:

Andere Möglichkeit das Patchen zu umgehen: Metin Prozess direkt laden

Code:
void *__cdecl sub_412E60(LPCSTR Args, LPSTR lpCommandLine)
{
  void *result; // eax@2
  struct _PROCESS_INFORMATION ProcessInformation; // [sp+8h] [bp-54h]@1
  struct _STARTUPINFOA StartupInfo; // [sp+18h] [bp-44h]@1

  memset(&StartupInfo, 0, sizeof(StartupInfo));
  ProcessInformation.hProcess = 0;
  ProcessInformation.hThread = 0;
  ProcessInformation.dwProcessId = 0;
  ProcessInformation.dwThreadId = 0;
  StartupInfo.cb = 68;
  StartupInfo.dwFlags = 1;
  StartupInfo.wShowWindow = 5;
  if ( CreateProcessA(Args, lpCommandLine, 0, 0, 0, 0, 0, 0, &StartupInfo, &ProcessInformation) )
  {
    if ( (DWORD)ProcessInformation.hProcess )
      CloseHandle(ProcessInformation.hProcess);
    result = ProcessInformation.hThread;
    if ( ProcessInformation.hThread )
      result = (void *)CloseHandle(ProcessInformation.hThread);
  }
  else
  {
    GetLastError();
    //result = (void *)sub_412E10("ERROR", "could not execute %s %d", (char)Args);
    printf("ERROR", "could not execute %s %d", (char)Args);
  }
  return result;
}
Usage:

Code:
	if(sub_412E60("metin2client.bin","metin2client.bin"))
		printf("Success!\n");
08/01/2010 18:57 Mi4uric3#3
Find ich voll gut ^.^
danke :)
Wie bist du an den Loop in OllyDBG gekommen?
Ich kann sowas nicht so gut, wüsste aber gerne, wie sowas geht
Ich kenn nur das mit "Find all referenced text strings", aber ich glaub, das hilft da nicht weiter, oder?
08/01/2010 19:03 floxy2#4
Eigtl relativ simpel :)

Such einfach nach alle "intermodular calls" dann setzt du auf jedes CreateFileA einen breakpoint. Dann stepst du halt solange durch bis dus findest. Halt immer auf die Call Parameter achten.
08/01/2010 19:12 Mi4uric3#5
CreateFileA gibt es bei mir nicht..

#edit
Maan.. ich such die ganze Zeit in der metin2.bin..
-.-
fail
Ich probiers mal in der metin2.exe ;D

#edit2
bei mir gibts aber nur "CreateFileMappingA".. o.O
08/01/2010 19:38 floxy2#6
Found intermodular calls, item 109
Address=00401918
Disassembly=CALL DWORD PTR DS:[<&KERNEL32.CreateFileA>]
Destination=kernel32.CreateFileA

Sollte eigtl öfters vorkommen.