|
You last visited: Today at 03:27
Advertisement
Decompiling von C++
Discussion on Decompiling von C++ within the C/C++ forum part of the Coders Den category.
05/11/2013, 22:44
|
#1
|
elite*gold: 3570
Join Date: Dec 2012
Posts: 13,044
Received Thanks: 8,252
|
Decompiling von C++
Hey Leute,
Ich wollte mich mal erkundigen ob man C++ zum nahezu Ursprungscode decompilen kann.
Ich habe per Google nichts hübsches gefunden ^^
Vllt kann mir einer der Experten was sagen.
Ich möchte aber keine Debugger nutzen 
Also OllyDBG oder IDA
|
|
|
05/11/2013, 22:47
|
#2
|
elite*gold: 966
Join Date: Apr 2010
Posts: 1,105
Received Thanks: 681
|
Nein, das ist soweit ich weiß nicht möglich. Mir ist lediglich das IDA-Plugin "HexRays Decompiler" bekannt, womit sich (Pseudo-)C-Code aus den ASM-Codes erzeugen lässt. Mehr geht aber auch nicht.
Hoffe, dass das hilfreich war, auch wenn es vielleicht nicht das ist, was du erwartet hast.
Mit freundlichen Grüßen
Jeoni
|
|
|
05/11/2013, 22:49
|
#3
|
elite*gold: 3570
Join Date: Dec 2012
Posts: 13,044
Received Thanks: 8,252
|
Wieso ist es bei einer nativen Sprache nicht so einfach wie bei einer Objekt orientierten wie C# oder Java?
|
|
|
05/11/2013, 22:53
|
#4
|
elite*gold: 966
Join Date: Apr 2010
Posts: 1,105
Received Thanks: 681
|
Das hat nichts mit der Objektorientierung zu tun, sondern mit dem System von Java und .net (C#, VB.net, F#). Beide Sprachen (ich zähle .net jetzt mal als EINE Sprache) kompilieren nicht direkt in ASM-Codes, sondern in Bytecode, der zur Laufzeit interpretiert wird. Dieser ist in den Dateien enthalten und dieser kann wesentlich besser in für den Menschen lesbaren Code (.net, Java) übersetzt werden, als ASM. C/C++ und andere native Sprachen kompilieren direkt in ASM und das ist eben nicht rückübersetzbar (zu allgemein?).
|
|
|
05/11/2013, 22:56
|
#5
|
elite*gold: 3570
Join Date: Dec 2012
Posts: 13,044
Received Thanks: 8,252
|
Und von ASM kann man das nicht einfach "übersetzen" lassen?
Also like OllyDBG den ASM Code sehen und der wird dann einfach übersetzt.
|
|
|
05/11/2013, 22:59
|
#6
|
elite*gold: 966
Join Date: Apr 2010
Posts: 1,105
Received Thanks: 681
|
Man kann zwar den ASM Code (der steht ja quasi direkt in den Anwendungen drinne) sehen, aber eben nicht rückübersetzen. Das liegt vermutlich daran, dass die ASM-Codes zu kleinschrittig, zu allgemein sind.
Sollte das irgendwann doch möglich sein, so wird dieser "Decompiler" Compiler-Abhängig sein. Jeder Compiler übersetzt die Anweisungen etwas anders in ASM-Codes und anhand dieser Übersetzungsweise könnte man _VIELLEICHT_ einen Decompiler schreiben (der ist dann aber logischerweise nur für diesen einen Compiler gültig). Allgemein denke ich nicht, dass es möglich ist, ASM-Codes zurück in eine Hochsprache zu übersetzen.
Allgemein in eine tiefere Sprache (näher an den ASM-Codes) zu übersetzen (z.B. C), funktioniert aber schon ziemlich gut (HexRays).
|
|
|
05/11/2013, 23:00
|
#7
|
elite*gold: 3570
Join Date: Dec 2012
Posts: 13,044
Received Thanks: 8,252
|
Dann danke ich dir mal für die Antworten. Schicke mal nen closerequest raus.
|
|
|
05/11/2013, 23:22
|
#8
|
elite*gold: 100
Join Date: Aug 2005
Posts: 595
Received Thanks: 208
|
Jeoni hats ja schon ganz gut erklärt.
Das Problem liegt hier darin das durch die Compilierung Informationen unwiederbringlich verloren gehen. Hexray ist ganz ordentlich wenn es darum geht den Code als Psydo-C dazustellen, aber denk das ist auch so ziemlich das Maximum was man rausholen kann und dieser Code ist auch nur sehr Bedingt dem UrsprungsCode ähnlich.
@Jeoni
Ja, hast Recht man kann daran wie der jeweilige Asm Code aussieht auf den Compilere und auch die eingestellten Optimierungen schliessen, allerdings wird auch das nicht helfen wenn es um eine Decompilierung geht, die Informationen sind verloren und einfach nichtmehr da, also kann man sie auchnicht wieder hervorholen 
Oder meinteste was anderes ?
|
|
|
05/11/2013, 23:31
|
#9
|
elite*gold: 966
Join Date: Apr 2010
Posts: 1,105
Received Thanks: 681
|
@dready
Die verloren gegangenen Informationen beziehen sich hier aber 'nur' auf Variablen- und Funktionsnamen, oder (was geht sonst noch so beim Kompilieren verloren)? Dieser Teil ist ohne Zweifel vorhanden, aber den meinte ich nicht.
Der 'wichtige' Teil, also wie wann was ausgeführt wird, muss ja erhalten geblieben sein. Was ich meinte ist aber, dass dieser 'wichtige' Teil in ASM-Code so allgemein und kleinschrittig ist, dass er sich eben nicht zurückübersetzen lässt. Ich kann das nicht genau erklären. Vielleicht wie, als ob die ASM-Codes stark reduzierter Text sind, den man detallierter haben will (wieder in eine Hochsprache). Doofe Metapher, aber mehr fällt mir nicht ein.
Mit freundlichen Grüßen
Jeoni
P.S. @TE: Tut mir Leid, dass ich nichts weiter zu deiner Eingangsfrage beitragen kann, aber vielleicht können du oder andere (ggf später) auch Informationen aus dieser Diskussion ziehen. Keine Ahnung
|
|
|
05/11/2013, 23:46
|
#10
|
elite*gold: 0
Join Date: Feb 2013
Posts: 1,137
Received Thanks: 869
|
Quote:
|
Die verloren gegangenen Informationen beziehen sich hier aber 'nur' auf Variablen- und Funktionsnamen, oder (was geht sonst noch so beim Kompilieren verloren)? Dieser Teil ist ohne Zweifel vorhanden, aber den meinte ich nicht.
|
Nein, die verlorenen gegangen Informationen beziehen sich auf wesentlich mehr. Nehmen wir mal C++ als Beispiel: Hier ist der Standard so allgemein formuliert, dass es dem Compiler möglich ist, radikale Optimierungen vorzunehmen. Der Compiler kann sogar komplette Klassen wegoptimieren. Denk auch mal an das inlinen von Funktionen, auch da geht ne Menge an Informationen verloren. Anderes Beispiel sind Templates, die ja auch schon direkt zur Compilezeit aufgelöst werden.
|
|
|
05/11/2013, 23:54
|
#11
|
elite*gold: 100
Join Date: Aug 2005
Posts: 595
Received Thanks: 208
|
@Jeoni, jub alle Variablen und Funktionnamen sind erstmal weg, Komments logischerweise auch, aber der Wirklich schlimme Verlust kommt durch die Optimierung,
Bsp.
Du rufst eine Routine in einer Hochsprache an Verschiedenen Punkten auf.
Der Compilere jedoch findet das es sinnvoller ist diese zu inlinen und packt den Code also direkt an beiden Stellen dazu. Die nächste Optimierung verbackt den Code mit der Routine in der er liegt um ihn schneller zu machen.
Jetzt hast du im prinzip eine Routine im HighlevelCode die zu 2 Relativ verschiedenen Codeteilen führte.
Dazu kommen so Probleme wie z.b. Schleifen, ob While, For oder was auch immer, ist in Asm am ende prinzipiel erstmal das selbe. Die Information ist verloren und kann nur sehr bedingt wiederhergestellt werden. Dafür braucht man etwas mehr denkleistung +g+ Aka, den Armen Tropf der davorsitzt und sich überlegt was der Programmierer wohl sinnvollerweise genommen haben wird.
Über Verbesserungen würd ich mich freuen, ist ne weile her und bin mir nicht bei allem 100% sicher
Edit: unnnnd Schlüsselbein war wiedermal schneller +g+
|
|
|
05/11/2013, 23:56
|
#12
|
elite*gold: 0
Join Date: Feb 2013
Posts: 1,137
Received Thanks: 869
|
Mal ein Beispiel:
Code:
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
struct Person
{
Person(const std::string& pName) : mName(pName) { }
std::string mName;
};
struct PersonFindPred
{
explicit PersonFindPred(const std::string& pName) : mName(pName) {}
bool operator()(const Person& pPerson)
{
return pPerson.mName == mName;
}
std::string mName;
};
int main()
{
std::vector<Person> vec;
vec.emplace_back("Peter");
vec.emplace_back("Hans");
vec.emplace_back("Sascha");
vec.emplace_back("Jürgen");
auto it = std::find_if(vec.begin(), vec.end(), PersonFindPred("Sascha"));
if(it != vec.end())
{
std::cout << "Found " << it->mName << std::endl;
}
}
Schau dir hier mal vom Release Build den erzeugten Code an. Ich bin mir sicher, dass dieser nichtmehr viel mit dem ursprünglichen C++-Code gemein haben wird.
Quote:
|
Über Verbesserungen würd ich mich freuen, ist ne weile her und bin mir nicht bei allem 100% sicher
|
Korrekt soweit und danke für die Ergänzung.
|
|
|
05/12/2013, 00:00
|
#13
|
elite*gold: 966
Join Date: Apr 2010
Posts: 1,105
Received Thanks: 681
|
Danke euch beiden. Daran hatte ich gar nicht gedacht, ist aber völlig logisch.
Demnach ist das vollständige Dekompilieren in eine Hochsprache natürlich nicht möglich bzw nur unter Einsatz von viel Kreativität oder Ausprobieren.
|
|
|
05/12/2013, 23:27
|
#14
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,909
Received Thanks: 25,409
|
Noch als Ergänzung:
Virtuelle Sprachen wie Java oder .NET sind deshalb so einfach zu dekompilieren, weil in den Binaries sehr viele Highlevel-Informationen vorhanden bleiben, dazu zählen die Strukturen von Klassen und afaik sogar die Namen, was den Code um Einiges lesbarer macht.
#closed
|
|
|
 |
Similar Threads
|
Decompiling pyc files.
01/14/2013 - Metin2 Private Server - 3 Replies
Hey. You know how to decode compiled py? (pyc -> py). I searched in google but I hadn't it decompile. Sorry for my bad English. Thanks! :)
|
Help Decompiling .Dll files with IDA PRO 5.5?
07/13/2011 - Mabinogi - 20 Replies
Hello I am fairly new to this, and I've been trying my hardest to learn the language of the files, but sadly have hit a wall. So All I've been doing really is just looking inside them unsure of what to do exactly. With that said i'd appreciate some guidance from anyone who is experienced with this.
My goal is to:
De-compile and change Hackshield's v3pro32s.dll and any other dll that should be changed, so that they can't detect or find anything suspicious in my pc. Also I'm not sure but, is...
|
Progress on Map Decompiling
03/31/2010 - EO PServer Hosting - 25 Replies
ok So I have been having some fun playing with the map files from time to time and I have the DMap file down pat now. Although the app I made to turn them into a text file version runs EXTREMELY slow. To the point it will stop if the file is too big. Wont take much to make a new program but I am not going to be doing that until I have a small custom map made.
Here are some Text File conversions.
Prison Map
...
|
Decompiling ScriptProcess.dll
04/16/2009 - Dekaron Private Server - 8 Replies
Im trying to decompile the dll using boomerang and it keeps hanging during the decompile process. Any ideas anyone?
|
All times are GMT +1. The time now is 03:28.
|
|