|
You last visited: Today at 19:32
Advertisement
Packete Decrypten und Entcrypten
Discussion on Packete Decrypten und Entcrypten within the General Coding forum part of the Coders Den category.
08/18/2010, 01:40
|
#16
|
elite*gold: 0
Join Date: Jun 2008
Posts: 451
Received Thanks: 410
|
Hey ich hab das mal mit inline versucht ;D bitte nicht lachen
Code:
DetourFunction((PBYTE)Crypt,(PBYTE)MyCrypt);
Code:
void MyCrypt()
{
DWORD PacketLength = 0;
BYTE XorCrypt = 0;
__asm
{
MOV PacketLength,ESI
MOV ECX,EAX
AND ECX,0x3
MOV DL,BYTE PTR DS:[EBX+ECX+0x1054]
MOV XorCrypt,DL
ADD EAX,0x1
CMP EAX,ESI
JL 0x00608220
}
char buffer[100];
sprintf(buffer,"%d %d",XorCrypt,PacketLength);
MessageBox(0,buffer,0,0);
}
was haltet ihr davon ?
packetLength stimmt aber das game schliesst direkt danach ka wieso 
aller anfang ist schwer
ich habs nochmal überarbeitet ^^
es zeig die länge an und die erst XOR encryption aber dan crashed es QQ
Code:
bool MyCrypt()
{
DWORD PacketLength = 0;
BYTE XorCrypt = 0;
DWORD Count = 0;
do
{
__asm
{
MOV PacketLength,ESI
MOV Count,EAX
MOV ECX,EAX
AND ECX,0x3
MOV DL,BYTE PTR DS:[EBX+ECX+0x1054]
MOV XorCrypt,DL
ADD EAX,0x1
CMP EAX,ESI
}
}while(PacketLength < Count);
char buffer[100];
sprintf(buffer,"%d %d",XorCrypt,PacketLength);
MessageBox(0,buffer,0,0);
return 1;
}
|
|
|
08/18/2010, 02:50
|
#17
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
da ich grad lust dazu habe und heute guter dinge bin:
Code:
CPU Disasm
Address Hex dump Command Comments
006081B0 |> /8B4424 0C MOV EAX,DWORD PTR SS:[ESP+0C]
006081B4 |. |53 PUSH EBX
006081B5 |. |55 PUSH EBP
006081B6 |. |66:8B6C24 18 MOV BP,WORD PTR SS:[ARG.4]
006081BB |. |8BD9 MOV EBX,ECX
006081BD |. |0FB748 06 MOVZX ECX,WORD PTR DS:[EAX+6]
006081C1 |. |56 PUSH ESI
006081C2 |. |57 PUSH EDI
006081C3 |. |0FBFF9 MOVSX EDI,CX
006081C6 |. |0FBFF5 MOVSX ESI,BP
006081C9 |. |8D4F 08 LEA ECX,[EDI+8]
006081CC |. |3BCE CMP ECX,ESI
006081CE |. |74 3B JE SHORT 0060820B
006081D0 |. |0FB770 04 MOVZX ESI,WORD PTR DS:[EAX+4]
006081D4 |. |68 A0CE6F00 PUSH OFFSET 006FCEA0 ; UNICODE "ERROR CPacketCoder::Encrypt Source Packet Not Match Body Size
"
006081D9 |. |E8 F2AEFFFF CALL 006030D0
006081DE |. |50 PUSH EAX
006081DF |. |E8 1CAFFFFF CALL 00603100
006081E4 |. |83C4 08 ADD ESP,8
006081E7 |. |0FBFD6 MOVSX EDX,SI
006081EA |. |57 PUSH EDI
006081EB |. |52 PUSH EDX
006081EC |. |68 70CE6F00 PUSH OFFSET 006FCE70 ; UNICODE "Command:%d BodySize:%d
"
006081F1 |. |E8 DAAEFFFF CALL 006030D0
006081F6 |. |50 PUSH EAX
006081F7 |. |E8 04AFFFFF CALL 00603100
006081FC |. |83C4 10 ADD ESP,10
006081FF |. |5F POP EDI
00608200 |. |5E POP ESI
00608201 |. |5D POP EBP
00608202 |. |B8 FEFFFFFF MOV EAX,-2
00608207 |. |5B POP EBX
00608208 |. |C2 1000 RETN 10
0060820B |> |8B7C24 14 MOV EDI,DWORD PTR SS:[ARG.1]
0060820F |. |56 PUSH ESI ; /Arg3
00608210 |. |50 PUSH EAX ; |Arg2
00608211 |. |57 PUSH EDI ; |Arg1
00608212 |. |E8 29FE0700 CALL 00688040 ; \FT_Client.00688040
00608217 |. |83C4 0C ADD ESP,0C
0060821A |. |33C0 XOR EAX,EAX
0060821C |. |85F6 TEST ESI,ESI
0060821E |. |7E 16 JLE SHORT 00608236
00608220 |> |8BC8 /MOV ECX,EAX
00608222 |. |83E1 03 |AND ECX,00000003
00608225 |. |8A9419 541000 |MOV DL,BYTE PTR DS:[EBX+ECX+1054]
0060822C |. |301438 |XOR BYTE PTR DS:[EDI+EAX],DL
0060822F |. |83C0 01 |ADD EAX,1
00608232 |. |3BC6 |CMP EAX,ESI
00608234 |.^|7C EA \JL SHORT 00608220
00608236 |> |8B4424 18 MOV EAX,DWORD PTR SS:[ARG.2]
0060823A |. |5F POP EDI
0060823B |. |5E POP ESI
0060823C |. |66:8928 MOV WORD PTR DS:[EAX],BP
0060823F |. |5D POP EBP
00608240 |. |B8 01000000 MOV EAX,1
00608245 |. |5B POP EBX
00608246 |. |C2 1000 RETN 10
|
v
Code:
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.
|
|
|
08/18/2010, 11:47
|
#18
|
elite*gold: 0
Join Date: Jun 2008
Posts: 451
Received Thanks: 410
|
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.
Danke trotzdem
|
|
|
08/18/2010, 15:49
|
#19
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
[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
|
|
|
08/18/2010, 23:08
|
#20
|
elite*gold: 0
Join Date: Jun 2008
Posts: 451
Received Thanks: 410
|
Hi Smith
also mit deinen 2 klassen/strukturen muss ihc mich noch näher veschäftigen
Code:
BYTE MyDecrypt(BYTE *Data,WORD size)
{
int tmp;
DWORD Pointer = EBX Register;
ofstream dec("Dec.txt");
char buffer[100];
for (int i = 0;i < size;i++)
{
tmp = i&3;
Pointer += tmp;
Pointer += 0x1054;
Pointer = *(DWORD*)Pointer;
Data[i] ^= (BYTE)Pointer;
dec << Data[i] << " ";
return Data[i];
}
return 1;
}
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
|
|
|
08/18/2010, 23:24
|
#21
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
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
lern asm bevor du weiter machst
|
|
|
 |
|
Similar Threads
|
[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
|
Wer ahnung hat vom decrypten
03/08/2005 - Off Topic - 6 Replies
....kthx ^^
|
All times are GMT +1. The time now is 19:33.
|
|