OldSchoolHack

Register / Login English

Hilfe benötigt - Reverse Engineering


icon Hilfe benötigt - Reverse Engineering #1

Join Date: May 2009

Posts: 2

Ich möchte ein Teil eines Programms modifizieren um so die Key Abfrage zu umgehen. Habe schon mehrere Stunden rumprobiert und rumgesucht aber hab es einfach nicht hinbekommen.
Das Problem ist wahrscheinlich dass meine Programmiererfahrungen einfach nicht dafür ausreichen    - habe etwas  C++ , C# und Ada  kenntnisse...

So sieht jedenfalls das Programm aus wenn man es ausführt:
http://img714.imageshack.us/img714/4791/botss.jpg

Oben muss der "License Key:" eingegeben werden.
Unter "Path" kann eine bestimmte route ausgewählt werden.
Und wenn man auf "Start" klickt sollte das Programm die Route dann ausführen.
Eine Route kann man sich als großes Makro vorstellen, in dem Mausklicks / Mausbewegungen gespeichert sind.

Wenn man also auf Start klickt wird der Key überprüft, den man eingegeben hat. Ziemlich wahrscheinlich verbindet sich das Programm dazu mit einem Server, denn wenn man die Internetverbindung kappt kommt diese Fehlermeldung:
http://img820.imageshack.us/img820/8079/bot3mi.jpg

Bei aktivem Internet aber falschem Key kommt hingegen diese Fehlermeldung:
http://img809.imageshack.us/img809/9881/bot2.jpg

Das merkwürdige dabei ist aber, dass ich den String „Invalid or inactive license key.“ Nirgends wo im Programmcode finden kann! Ich erkenne also nicht wo im Code der Key überprüft wird und wo, bzw. wie diese Meldung ersteht…

Ich benutze folgende Programme zum Decompilen / Debuggen der .exe:
Dile
Hex-Rays IDA
OllyDbg
Reflector
ILSpy
Dis# .NET decompiler

Programm benutzt .NET Framework 3.5



Allerdings kann ich den Decompilierten Code nicht 1:1 übernehmen… So zum Beispiel spuckt mir ILSpy und Reflector zwei unterschiedliche Teile an Code aus – Was das Recompilieren nach einer erfolgreichen „modifizierung“ des Programmes nur noch erschwert…  Bsp. hier:
http://img585.imageshack.us/img585/6886/bot4.jpg


Hier der Code des StartButton:
TEXT Code:
  1. private void StartButton_Click(object sender, RoutedEventArgs e)
  2. {
  3. try
  4. {
  5. if (this.Overlay != null)
  6. {
  7. this.Overlay.Close();
  8. }
  9. ShipAutomation.LicenseKey = this.LicenseTextBox.Text;
  10. if (ShipAutomation.IsActive || !(this.RecordingCheckBox.IsChecked == false) || ShipAutomation.GetPath())
  11. {
  12. if (this.RecordingCheckBox.IsChecked == true && !ShipAutomation.IsActive)
  13. {
  14. if (System.Windows.MessageBox.Show("Are you sure you want to start a new recording?", "Path Recording", MessageBoxButton.YesNo) == MessageBoxResult.No)
  15. {
  16. return;
  17. }
  18. }
  19. ShipAutomation.IsActive = !ShipAutomation.IsActive;
  20. if (ShipAutomation.IsActive)
  21. {
  22. this.StartButton.Content = "Stop";
  23. if (this.RecordingCheckBox.IsChecked == true)
  24. {
  25. if (this.MouseListener == null)
  26. {
  27. this.MouseListener = new MouseHookListener(new GlobalHooker());
  28. this.MouseListener.Enabled = true;
  29. this.MouseListener.MouseDownExt += new EventHandler<MouseEventExtArgs>(this.MouseListener_MouseDownExt);
  30. }
  31. Threads.LaunchThread(new Action(ShipRecorder.StartRecording));
  32. }
  33. else
  34. {
  35. if (ShipAutomation.IsInhouse())
  36. {
  37. this.Overlay = new Overlay();
  38. MainWindow.ToTransparentWindow(this.Overlay);
  39. this.Overlay.Show();
  40. }
  41. try
  42. {
  43. string value = File.ReadAllText(Environment.CurrentDirectory + "\\Paths\\" + ShipAutomation.CurrentRoute.ToString() + ".json");
  44. ShipAutomation.CoordinateList = JsonConvert.DeserializeObject<MouseCoordinateList>(value);
  45. }
  46. catch
  47. {
  48. this.StartButton.Content = "Start";
  49. ShipAutomation.IsActive = !ShipAutomation.IsActive;
  50. System.Windows.Forms.MessageBox.Show("You have not recorded a path for this ship route yet.");
  51. return;
  52. }
  53. Threads.LaunchThread(new Action(ShipPlayback.StartPlayback));
  54. }
  55. }
  56. else
  57. {
  58. this.StartButton.Content = "Start";
  59. }
  60. }
  61. }
  62. catch (Exception ex)
  63. {
  64. System.Windows.Forms.MessageBox.Show(ex.ToString());
  65. }
  66. }


Wenn also jemand mal etwas Zeit und lange weile hat bitte mal anschauen - macht teilweise richtig spaß Code von jemand anders zu verstehen zu suchen    
Das Ding ist - ich bin nur popeliger Wirtschaftsinformatiker im 1. Semester – wenn also hier jemand Ahnung hat bitte melden ^^

Hier das Programm: Only registered and activated users can see links.
Virustotal:Only registered and activated users can see links.

icon #2

Join Date: Jan 2009

Posts: 454

User-Rating:

10 positive
0 negative
Moin,
Ich hoffe du ließt das noch =P


Hab das Teil für die 64Bit Version gecrackt, daher wirds bei dir nicht laufen. Ich geb dir einfach mal kurz nen Tutorial.

Du  brauchst den .NET Reflector mit dem Zusatzplugin Reflexil.

Danach gehst du zu SWTORBot => SWTORBot.Automation und navigierst zur GetPath funktion.


Spoiler
TEXT Code:
  1. public static bool GetPath()
  2. {
  3. PathData = string.Empty;
  4. string text = MainWindow.Instance.LicenseTextBox.Text;
  5. string str2 = MainWindow.Instance.RouteComboBox.SelectedItem.ToString();
  6. using (WebClient client = new WebClient())
  7. {
  8. try
  9. {
  10. string str3 = client.DownloadString("http://" + Host + "/CreditSlicer/Authenticate?id=" + text + "&pathName=" + str2);
  11. if (client.DownloadString("http://" + Host + "/CreditSlicer/CheckVersion?version=" + CurrentVersion) == "0")
  12. {
  13. MessageBox.Show("You are using an outdated version of bot. Please go to www.gamebotter.com and download the latest version.");
  14. return false;
  15. }
  16. string[] strArray = str3.Split(new char[] { '|' });
  17. MessageBox.Show(strArray[1]);
  18. if (strArray[0] == "0")
  19. {
  20. return false;
  21. }
  22. return true;
  23. }
  24. catch (Exception exception)
  25. {
  26. DebugProcessor.Write(exception.ToString());
  27. }
  28. if (string.IsNullOrEmpty(PathData))
  29. {
  30. MessageBox.Show("GameBotter is down for maintenance, please go to www.gamebotter.com if you have any questions.", "Game Botter");
  31. return false;
  32. }
  33. }
  34. return true;
  35. }
  36.  
  37.  

Interessante Stelle für uns:
Spoiler
TEXT Code:
  1. if (client.DownloadString("http://" + Host + "/CreditSlicer/CheckVersion?version=" + CurrentVersion) == "0")
  2. {
  3. MessageBox.Show("You are using an outdated version of bot. Please go to www.gamebotter.com and download the latest version.");
  4. return false;
  5. }
  6. string[] strArray = str3.Split(new char[] { '|' });
  7. MessageBox.Show(strArray[1]);
  8. if (strArray[0] == "0")
  9. {
  10. return false;
  11. }
  12.  


TEXT Code:
  1. http://" + Host + "/CreditSlicer/CheckVersion?version=" + CurrentVersion) == "0"
Einmal auf den Link http://68.55.37.228/CreditSlicer/Authenticate?id=123&pathName=TestRou432423te verrät uns schon einiges. Die Dortige Txt wird gedownloadet und in 2 Strings gesplittet.
TEXT Code:
  1. string[] strArray = str3.Split(new char[] { '|' });
  2.  

TEXT Code:
  1. MessageBox.Show(strArray[1]);
Egal was passiert, der 2 Teil wird uns immer ausgegeben. (In dem Fall der invalid Key). Hier auch der Grund warum du es nicht im Programmcode gefunden hast. Der "Satz" wird aus dem Internet geladen =P


TEXT Code:
  1. if (strArray[0] == "0")
  2. {
  3. return false;
  4. }

Hier wird der erste Teil geprüft. Bei einem richtigen Key würde dort 1 stehen. Bei uns leider 0, da der Key nicht stimmt. Also wird verglichen an der Stelle und da wir leide einen falschen Key haben, wird uns false zurückgegeben und es klappt leider nicht .

Wäre da nicht Reflexil: Wir ändern einfach an der gegeben stelle das return false in return true und voilà, es klappt (:
Nun nurnoch die änderungen Speichern und abjetzt die Patched exe ausführen.

Falls noch fragen bestehen, frag ruhig ^^


Arbeitsaufwand: ca 5-10 Min =P

__________________

Quote

[16:44:40] * sMp (sMp[at]osh-B065CA09.pools.arcor-ip.net) has joined #Oldschoolhack
[16:44:47] <Cycode> ich könnt so abreiern ey echt..
[16:44:58] <sMp> oh neine
[16:45:07] <sMp> wenn ich sowas schon höre
[16:45:11] <sMp> instaleave
[16:45:14] * sMp (sMp[at]osh-B065CA09.pools.arcor-ip.net) has left #Oldschoolhack
icon #3

Join Date: May 2009

Posts: 2

wow! ich versuchs gleich mal - danke!

--------------------------------------

Edit: Also bin jetzt schon bestimmt ne Stunde dran am rumfummeln. Das Ding ist ja, dass alles auf IL (MSIL) ist... Ich bin mir jetzt aber sicher die richtige Stelle gefunden zu haben (hab nen Teil des codes nachgeschrieben auf C# - einmal mit return false und einmal mit return true um mir auch absolut sicher zu sein...) es muss ja "ldc.i4.0" auf "ldc.i4.1" geändert werden - und zwar befindet sich die Stelle zwischen


CPP Code:
  1.  
  2. 180 ldstr You are using an outdated version of bot. Please go to www.gamebotter.com and download the latest version.
  3. .
  4. ...
  5. .
  6. 276 call System.Void MetaLibrary.Utility.Debug.DebugProcessor::Write(System.String)


Jetzt speicher ich die patched.exe und führe sie aus.

Ich trage einen fake key ein (12345) und klick auf start - die meldung kommt das der Key nicht stimmen würde aber das ist ja auch ok - soll ja danach weitergehen als ob der key doch stimmen würde...

Wenn ich dann also auf OK klick zeigt er mir meinen eingegebenen code als große pinke ziffern auf meinem Bildschirm an und 2 sec später kommt eine fehlermeldung "...hat ein problem festgestell bla..."

Wenn ich die meldung nun debugge zeigt er mir folgendes an:
ImageConverter cannot convert from (null).


? Hab ich etwas falsch gemacht ?
Das Programm sollte doch eigentlich nun funktionieren...


Da es ja vielleicht doch nicht die richtige Stelle war an der ich das "ldc.i4.0" geändert hatte, hab ich auch mal das andere "ldc.i4.0", das sich in der Nähe befindet geändert - funkt aber auch dort nicht...
icon #4

Join Date: Jan 2009

Posts: 454

User-Rating:

10 positive
0 negative
Only registered and activated users can see links.

Kanns leider nicht weiter testen, da ich swtor nicht besitze..

__________________

Quote

[16:44:40] * sMp (sMp[at]osh-B065CA09.pools.arcor-ip.net) has joined #Oldschoolhack
[16:44:47] <Cycode> ich könnt so abreiern ey echt..
[16:44:58] <sMp> oh neine
[16:45:07] <sMp> wenn ich sowas schon höre
[16:45:11] <sMp> instaleave
[16:45:14] * sMp (sMp[at]osh-B065CA09.pools.arcor-ip.net) has left #Oldschoolhack