PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ich krieg die Stub nicht hin -.-



Deshoax
03.06.2009, 17:57
Hallo ich bins nochmal,
und hab ein Problem. Ich folge derzeit einem Tutorial, bzw mehreren wegen dem crypter. Bin jetzt endlich an der crypter und decrypter stub angekommen. Nur die Frage is jetz, wie mach ich in C den inline assembler an???

das soll die crypter stub sein und auch später die decrypter stub, is ja simples XOR:

|
| B9 XXXXXXXX MOV ECX,[Adresse zum Anfang der Section]
| --> 36:8031 0E XOR BYTE PTR SS:[ECX],0E
| | 41 INC ECX
| | 81F9 XXXXXXXX CMP ECX,[Anfang der Stub]
| |-- 75 F3 JNZ SHORT [zum XOR zurück]
|----- E9 XXXXXXXX JMP [Adresse zum OEP]

Aber wie zum Teufel krieg ich das hin???

AlterHacker
03.06.2009, 18:21
Hey,

Inline assembler, das kommt auf den compiler an.
Es gibt __asm("befehl bla,bla") oder asm{
befehl bla, bla
}

teste es mal aus, bzw nenn uns den Compiler :D

Deshoax
03.06.2009, 18:29
Dev-CPP^^ und was genau mach ich dann mit der Stub^^

Bozok
03.06.2009, 18:34
Ja ich frag mich ob du das TUT von Eddy hast.
Wenn ja musste das mit Copymemory machen.

Deshoax
03.06.2009, 18:38
Ja das is von Eddy, aber was meinst du mit copymemory?

Deshoax
03.06.2009, 18:42
Hä wieso das denn?
Ich bin lediglich einer Anleitung gefolgt.:confused:

Ich will nur wissen wie ich den Beispiel Assemblercode in einem C-Programm einsetzte damit ich wenigstens die Basis fürs selber ausdenken habe.;)

blackberry
03.06.2009, 19:15
Wenn du etwas mit ASM machen möchtest, dann solltest du ASM auch lernen und nicht nur kopieren.
Bei Dev-C++ (dh. MinGW32) wird dir der oben genannte Code nichts nützen, da von deinem Compiler die AT&T-Syntax benutzt wird und du das ganze erst umschreiben müsstest (noch ein Grund ASM zu lernen).

Außerdem wird das mit Inline-ASM nicht viel nützen, da du die Adressen für jedes Programm ändern musst (in "deinem" Code die XXXXXX) und du keinen Schreibzugriff auf den durch Inline-ASM erstellten Code bekommen wirst.

Schau dir doch einfach mal mein Tutorial an;
Das ist für C/C++ und benutzt die selbe Methode:
http://free-hack.com/showthread.php?t=38507

Bozok
03.06.2009, 19:18
Jo kann er anpassen, dass sollte nicht das problem sein.
Jedoch musst du die Funktion IN die Datei schreiben! Also crypt-krams -> Codecave suchen -> reinpasten (hier kommt copymem ins spiel) -> Datei speichern.

blackberry
03.06.2009, 19:27
Jo kann er anpassen, dass sollte nicht das problem sein.

Und wie?
asm(buffer)?
So klappt das nicht.
Mit dem asm-Schlüsselwort wird der Code beim Compilieren eingefügt und nicht wärend der Laufzeit erstellt.

Funktionen befinden sich in einer Section, auf die man keinen Schreibzugriff hat.
Ein nachträgliches Verändern des Codes und Anpassen der Adressen ist somit nicht möglich.

Also wieso ist das kein Problem?


Also crypt-krams -> Codecave suchen -> reinpasten (hier kommt copymem ins spiel) -> Datei speichern.

Darum geht es doch garnicht. (außerdem weiß er das doch)

Deshoax
03.06.2009, 19:35
Danke für die Posts, nochmal zur klarstellung:

Die Basics von ASM stellen für mich kein Problem da, hab das Tut von Snakebyte runtergerattert und auch selber schon en paar basic sachen in asm gemacht ;)

Ich guck mir jetz mal dein Tut an, wie du sagst sollst damit hinhauen :) Ich meine ich hätts mir sogar schon gezogen, muss ma nachgucken^^

Greetz

Deshoax

EDIT: Ich bin ein ehrlicher Mensch, deswegen sage ich dir: Gutes, sehr gutes und universelles Tut! ABER: Es ließt sich teilweise wie wenn einer aus der 9 ne Kurvendiskussion lernt ;)

Zum Inhalt selber: Ich hab schon ein paar neue Sachen jetzt gelernt, die ich mit in meinen Crypter einbauen und vereinfachen kann :)

Bin aber noch nicht durch :P

EDIT2: Bin jetzt durch, aber worums mir ging is irg wie auf der Strecke geblieben...
Was ist ^= für ein Ausdruck?
Muss ich im endeffekt nur die einzelnen Bytes der Codesection mit ^= 0xDE (irgendwas) verändern wenn ich einen XOR erreichen will?

Und bei dem decrypter Kapitel blick ich auch nicht ganz durch, was ist die ImageBase? meinste die Standardloadadresse 0x4000000?

*verzweiflung*

blackberry
05.06.2009, 11:58
Erstmal sorry für die späte Antwort... habs nicht gleich entdeckt :O


Was ist ^= für ein Ausdruck?

VariableA ^= VariableB;
Ist lediglich eine Abkürzung für:
VariableA = VariableA ^ VariableB;
(also sowas ähnliches wie: +=, -=, /=, %=, &=, |=, ...)


Muss ich im endeffekt nur die einzelnen Bytes der Codesection mit ^= 0xDE (irgendwas) verändern wenn ich einen XOR erreichen will?

Du kannst auch die längere Form benutzen, oder wie DiZZy_D empfohlen hat eine andere Verschlüsselung benutzen (diese muss aber selbstverständlich eindeutig sein - also wieder entschlüsselbar sein).


Und bei dem decrypter Kapitel blick ich auch nicht ganz durch, was ist die ImageBase? meinste die Standardloadadresse 0x4000000?

Du meinst wohl 0x400000 (eine 0 weniger ;) ).
Im Grunde ist das korrekt, jedoch werden uA. auch andere Adressen benutzt (kernel32.dll wäre ein Beispiel, das mir so spontan einfällt).
Demzufolge habe ich versucht das ganze universell aufzubauen und die Adresse für jedes einzelne Programm individuell einzufügen.

btw: Microsoft bezeichnet diese Adresse auch als ImageBase (siehe die beigelegte .DOCX-Datei). Das ist also keine Eigenerfindung von mir :)


mfG. BlackBerry

EBFE
05.06.2009, 14:24
Naja, bei C/C++ Compilern weiß man wegen der internen Optimierungen eher nie, was an Maschinencode herauskommt (Reihenfolge der Funktionen kann vertauscht werden, nicht erreichbarer Code wird wegoptimiert, es gibt keine globalen Labels usw).
Die Möglichkeiten für Low-Level Coding (Richtung Codeinjections) halte ich daher für relativ begrenzt und i.R sehr Compilerspezifisch (auch wenn mir einige C++ler das Gegenteil weiß machen wollten - aber außer den Sprüchen "du kannst halt kein C++!!!" und "in C++ ist es möglich, denn es kann alles, man muss es nur lernen!!!1" kam nichts :rolleyes: )

Jedenfalls zum Thema:
was hast du für eine GCC Version? Sofern es halbwegs aktuell ist (meine ist z.B 4.3.0), funktieren folgende Codes:
Variablenzugriff von Inlnineasm aus, Intelsyntax:


#include<iostream>
using namespace std;
int base=0x402000;
void outbase()
{
cout<<"vor der manipulation: "<<hex<<base<<"\n";
__asm volatile
(
".intel_syntax noprefix\n"
"mov ecx,%0\n"
"add ecx,0x1337\n"
"mov %0,ecx\n"
".att_syntax \n" :"=m"(base)
);
cout<<"nach der manipulation: "<<hex<<base<<"\n";
}

int main()
{
base=0xdeadbeaf;
outbase();
cin.get();
return 0;
}

%0 ist ein Argument,
"=m" steht für memory und (base) besagt, dass hier die variable Base verwendet werden soll.
Mehr muss man eigentlich für kleinere ASM inliner nicht wissen, aber du kannst gerne http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html lesen :)

Selbsmodifizierender code mit g++:


#include<iostream>
using namespace std;

int polyMe(void* adress)
{
if (adress!=0) goto label_end; //sonst wirds vom gcc auch bei -O0 wegoptimiert
label_start:
__asm volatile(
".intel_syntax noprefix\n"
"mov ecx,[ebp-4]\n"
"inc ecx\n"
"mov [ebp-4],ecx\n"
".att_syntax \n"
);
label_end:
memcpy(adress,&&label_start,(unsigned int)&&label_end-(unsigned int)&&label_start);

}

void polymorpher()
{
int i=0;

polyMe(&&label); //modifiziere den Code
label:
__asm
(
".intel_syntax noprefix\n"
"nop\n"
"nop\n"
"nop\n"
"nop\n"
"nop\n"
"nop\n"
"nop\n"
"nop\n"
"nop\n"
"nop\n"
"nop\n"
"nop\n"
"nop\n"
"nop\n"
"nop\n"
"nop\n"
"nop\n"
".att_syntax \n"
);
cout << "i="<<i<<"\n"; //na, wird hier 0 ausgegeben?
}

int main()
{
polymorpher();
cin.get();
return 0;
}

man sollte allerdings nach der Compilierung mit einem PE-Editor noch die ".text" Section auf "writeable,readable,executable" setzen (geht auch über Linkoptionen, ich habs allerdings nicht hinbekommen).