class CPacketCoder
{
BYTE UNKNOWN[1053];
BYTE Key[unknownSize];
};
struct UnknownStruct
{
WORD BytesCrypted;
BYTE UNKNOWN[4];
WORD BodySize;
};
int CPacketCoder::Encrypt(BYTE *Data,UnknownStruct *UKS, DWORD UNKNOWN,WORD size)
{
if(UKS->BodySize +8 == size)
{
for(int i = 0; i < size; i++)
{
int tmp = i&3;
Data[i] ^= this->Key[tmp];
}
UKS->BytesCrypted = size;
return 1;
}
//Fehlerbehandlungscode...
return -2;
}
Hierzu muss ich aber sagen:
Ich bin mir nicht sicher, ob der 2. Parameter wirklich die Unknown Struct ist.
Das vermute ich, wegen dem Stackzugriff auf ESP+0C am Anfang, was ja eigentlich Parameter 2 sein müsste.
Mich wundert eben nur, dass Olly es nicht als diesen Anzeigt.
Evtl hast du nicht die ganze Funktion eingefügt?
Naja eigentlich auch wayne, so habe ich eben ein wenig geholfen, ohne es gleich zu copypasta zu machen.
Schon alleine, weil es so niemals gehen wird, dafür fehlt noch der Fehlerbehandlungscode und für die weitere Verarbeitung sicher noch mehr Member in den beiden Klassen/Structs.
Aber wie gesagt, es war ein kleiner Denkanstoß und hoffentlich ein Ansporn, endlich ASM zu lernen.
Für die Kritiker wie SmackJew:
Euch steht frei, den Code zu kritisieren und/oder fehlerhafte Übersetzungen zu korrigieren.
Das habe ich eben schnell aus Langeweile gemacht und der beste im ASM->C(++) Übersetzen bin ich nicht.
cool danke aber ne andere frage wird das überhaupt mit nem hook gemaht ?
also as decrypten
mal ganz im ernst ich glaube ich bin noch nicht weit genug um mit soetwas zu arbeiten das über fordert mich echt mal.
Code:
class CPacketCoder
{
BYTE UNKNOWN[1053];
BYTE Key[unknownSize];
};
was das ist versteh ich gar nicht
Code:
struct UnknownStruct
{
WORD BytesCrypted;
BYTE UNKNOWN[4];
WORD BodySize;
};
ich weiss auch ehrlich gesagt kaum was das sein soll
Code:
int CPacketCoder::Encrypt(BYTE *Data,UnknownStruct *UKS, DWORD UNKNOWN,WORD size)
{
if(UKS->BodySize +8 == size)
{
for(int i = 0; i < size; i++)
{
int tmp = i&3;
Data[i] ^= this->Key[tmp];
}
UKS->BytesCrypted = size;
return 1;
}
//Fehlerbehandlungscode...
return -2;
}
wieso wird die size denn plus 8 genommen ich hab in olly schon gesehen das die size um 8 addiert wird jedoch wenn ich von der gehooken send funktion lengh übergebe brauch ich doch nicht mehr plus 8.
ich glaube
AND ECX,00000003
das ist das int tmp = i&3; ist ja logisch
und hier
Data[i] ^= this->Key[tmp];
hat data glaube ich die stelle im packet und wird gesxored aber das versteh ich auch noch nicht richtig.
MOV DL,BYTE PTR DS:[EBX+ECX+1054]
das ist das glaub ich
Das problem sind ja nicht die c++ bfehle die versteh ich ja aber ich habe vorher noch nie was mit packets gemacht und ich versteh einfach komplett nicht wie man packet in c++ macht deswegen verstehe ich kaum dein source.
[quote=Lazeboy;6451668]cool danke aber ne andere frage wird das überhaupt mit nem hook gemaht ?
also as decrypten
[/code]
ja, aber hookt man send! und im send decryptet man es, schreibts auf und sendet dann trotzdem die verschlüsselten bytes
Quote:
mal ganz im ernst ich glaube ich bin noch nicht weit genug um mit soetwas zu arbeiten das über fordert mich echt mal.
sag ich ja, das ist noch ein bisschen zu hoch wenn du kein asm kannst
Quote:
Code:
class CPacketCoder
{
BYTE UNKNOWN[1053];
BYTE Key[unknownSize];
};
was das ist versteh ich gar nicht
das ist eine klasse.
solltest du kennen. im verschlüsselungscode wird auf einen pointer zugegriffen und dann wird an stelle 1054 der key verwendet.
durch analyse kommt man darauf, dass es der this pointer ist (solltest du auch kennen).
also muss dieser key in der eigenen klasse sein. dass es ne member funktion ist, sieht man sowieso am anfang; das register ecx wird als parameter genutzt, was, so wie das hier abläuft, auf eine member funktion und nicht auf eine fastcall funktion hinweist.
und aufgrund des strings der in der fehlerbehandlung ist, habe ich mal den namen gewählt, der ist aber egal.
wichtig ist, dass an offset 1054 der key ist und die funktion ne memberfunktion.
den rest vor dem key kenne ich nicht, also unknown.
Quote:
Code:
struct UnknownStruct
{
WORD BytesCrypted;
BYTE UNKNOWN[4];
WORD BodySize;
};
ich weiss auch ehrlich gesagt kaum was das sein soll
eben der zweite parameter.
an offset 0 wird am ende die größe geschrieben, die man angegeben hat.
ist wohl sowas wie der parameter LPDWORD BytesWritten bei WriteFile.
das passt allerdings nicht ganz, da nur die size reingeschrieben wird, egal wie viel nun eigentlich gecrypted wurde und im fehlerbehandlungscode sehe ich nix, was da dann ne 0 reinschreibt oder so.
aber um es genau zu identifizieren habe ich zu wenig material.
an offset 6 ist die größe des packet bodys. der packet header ist wohl 8 bytes groß.
also muss die bodysize + 8 genau so groß sein, wie die size, die man angegeben hat.
zwischen den beiden bekannten dingen liegen eben 4 unknown bytes
Quote:
Code:
int CPacketCoder::Encrypt(BYTE *Data,UnknownStruct *UKS, DWORD UNKNOWN,WORD size)
{
if(UKS->BodySize +8 == size)
{
for(int i = 0; i < size; i++)
{
int tmp = i&3;
Data[i] ^= this->Key[tmp];
}
UKS->BytesCrypted = size;
return 1;
}
//Fehlerbehandlungscode...
return -2;
}
wieso wird die size denn plus 8 genommen ich hab in olly schon gesehen das die size um 8 addiert wird jedoch wenn ich von der gehooken send funktion lengh übergebe brauch ich doch nicht mehr plus 8.
s.o.
Quote:
ich glaube
AND ECX,00000003
das ist das int tmp = i&3; ist ja logisch
fast, der befehl davor auch. das wäre nur das tmp &= 3; vorher wird ja noch i in tmp kopiert, was ich aber zu einem befehl gemacht habe.
Quote:
und hier
Data[i] ^= this->Key[tmp];
hat data glaube ich die stelle im packet und wird gesxored aber das versteh ich auch noch nicht richtig.
MOV DL,BYTE PTR DS:[EBX+ECX+1054]
das ist das glaub ich
[/code]
EBX ist der this pointer, ECX ist tmp und 1054 das offset vom key.
tmp wird als index für den key genutzt.
Quote:
Das problem sind ja nicht die c++ bfehle die versteh ich ja aber ich habe vorher noch nie was mit packets gemacht und ich versteh einfach komplett nicht wie man packet in c++ macht deswegen verstehe ich kaum dein source.
Danke trotzdem
das hat rein gar nichts damit zutun, dass du noch nie was mit packets gemacht hast.
packets sind nicht das einzige, was klassenanalyse voraussetzt.
das gehört generell zum reverse engineering und damit scheinst du nicht so vertraut zu sein.
also lern asm und mach am besten die tutorials von lena151 falls du sie noch nicht hast
ich wollte mal fragen wie du das findest ich habe nur 2 probleme ich weiß nicht wie ich die data stelle berechnen / benutzen soll und das EBX register enthält eine value die ich zum berechnen des xor key brauche wie ich darauf komme weiß ich auch nicht sry wenn es dich langsm nervt
1. du hast zu wenig parameter! es sind 4
2. du musst da nichts berechnen, die werden als parameter angegeben. EBX wird nicht benötigt, dafür ist ja die klasse, die du nicht angegeben hast
[How To]CShell.dll dumpen/decrypten 09/14/2010 - CrossFire - 9 Replies Hi,
nach meinem Tut wie man LT-Pointer findet noch wie man die gedumpte CShell.dll überhaupt bekommt. :D
Einfache Version:
Ladet euch die Dateien aus dem Anhang runterund verschiebt "DLLLoader.exe" in das Verzeichnis in dem CShell.dll liegt.
Und "pedumper.dll" kommt ins OllyDbg-Verzeichniss.
Dann startet ihr "DLLLoader.exe" (als Admin!) und wartet kurz bis es so aussieht:
http://img836.imageshack.us/img836/3816/35932622. png
Dann gebt ihr CShell.dll ein und drückt Enter.
Nun öffnet ihr...
decrypten und encrypten 05/11/2009 - Kal Online - 0 Replies ich brauche hilfe wie kan ich eine config.pk von einem server encrypten und wider decrypte ich hab in der sufu schon gegugt aber ich finde dort nix
danke schonmal
R3volutioN entcrypten ?? 10/08/2008 - Kal Online - 0 Replies hi leute hab mich mal hier schon drunter und drüber gesucht nach ner möglichkeit von R3volutioN da ne skill liste zu bekommen das pk paswort hab ich schon selbst rausbekommen aber wie les ich die jobsystem-e so das ich value von gewissen skills bekomme hab schon einige programme ausgeteste aber es heist ja es wurde ne neue wariante rausgebracht die was einfacher wäre es zu verschlüsseln wäre net wen mir einer bischen helfen könnte
danke schon mal jetzt