Dobrý den,
jsem absolutní začátecník. Potřebuji kus kódu v Assembleru, který mi spustí externí EXE (winNT/2000/Xp binárka), pokud možno co nejjednodušším způsobem a kód by měl být co nejmenší (myslím v řádkách čitelného kódu).
Děkuji
Fórum › Assembler
Spuštění externího EXE z Assembleru
Bude to chtít trochu té snahy, abys to vytesal do zprovoznitelné podoby. (nebo si zaplatit)
Samo se ti to nenapíše.
Použij API ShellExecute a pomocí série Push předej parametry.
Je otázka kam to píšeš, jestli přímo do .C souboru (pod příkaz __asm) nebo
souboru .asm a použiješ to jako Objektový soubor, nebo to chceš taky jako Exe
z překladače asm jako je Masm32,..
WINAPI je:
HINSTANCE ShellExecute(
HWND hwnd, // handle to parent window
LPCTSTR lpOperation, // pointer to string that specifies operation to perform
LPCTSTR lpFile, // pointer to filename string
LPTSTR lpParameters, // pointer to string that specifies executable-file parameters
LPCTSTR lpDirectory, // pointer to string that specifies default directory
INT nShowCmd // whether file is shown when opened
);
PUSH se provádí (u stdcall) odzadu, je potřeba např. nezapomenout Includovat .inc
Umět instrukci MOV a CALL. Pak další (příjem parametrů ze Stacku-zásobníku) podle toho zda hodláš spouštět stále ten samý
program nebo program proměnný.
Nějaké příklady programů .asm v balíku s překladači ať už masm,tasm,nasm, ti pomůžou.
To o-lox :
Mohlo by fungovat toto? Zjednodušeně napsáno:
FILENAME DB "cmd.exe",0
PUSH 0 ;hwnd
PUSH 0 ;lpOperation (???)
PUSH OFFSET FILENAME ;cmd.exe
PUSH 0 ;lpParameters
PUSH 0 ;Měl by vzít defaultdir z proměnné %windir% ?
PUSH 0 ;nShowCmd (???)
CALL ShellExecute
To radek :
Tak jsem to napsal v masm32:
.386
.model flat, stdcall
option casemap :none ; case sensitive
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.code
FILENAME DB "cmd.exe",0
start:
.data
PUSH 0 ;hwnd
PUSH 0 ;lpOperation (???)
PUSH OFFSET FILENAME ;cmd.exe
PUSH 0 ;lpParameters
PUSH 0 ;Měl by vzít defaultdir z proměnné %windir% ?
PUSH 0 ;nShowCmd (???)
CALL ShellExecute
CALL ExitProcess
end start
Ale assembler mi při buildu hlásí:
Assembling: C:\masm32\examples\exampl01\minimum\minimum.asm
C:\masm32\examples\exampl01\minimum\minimum.asm(30) : error A2006: undefined symbol : ShellExecute
C:\masm32\examples\exampl01\minimum\minimum.asm(31) : error A2107: cannot have implicit far jump or call to near label
_
Assembly Error
Až tak jednoduchý to zřejmě nebude...
To radek :
Heh v ollydbg jsem otevřel jeden program a ten obsahuje tento disassemblovaný kód:
0053187C /. 55 PUSH EBP
0053187D |. 8BEC MOV EBP,ESP
0053187F |. 6A 05 PUSH 5 ; /IsShown = 5
00531881 |. 68 A0185300 PUSH SystemEx.005318A0 ; |DefDir = ""
00531886 |. 68 A0185300 PUSH SystemEx.005318A0 ; |Parameters = ""
0053188B |. 68 A4185300 PUSH SystemEx.005318A4 ; |FileName = "abcdefg.exe"
00531890 |. 68 B0185300 PUSH SystemEx.005318B0 ; |Operation = "open"
00531895 |. 6A 00 PUSH 0 ; |hWnd = NULL
00531897 |. E8 D87CF0FF CALL <JMP.&shell32.ShellExecuteA> ; \ShellExecuteA
0053189C |. 5D POP EBP
0053189D \. C3 RETN
to by mohl být klíč :-)
To radek :
Tak jsem si hrál s injectem do putty (do 00 00 00 00...) a funguje to:
.
.
.
0044F4D1 00 DB 00
0044F4D2 00 DB 00
0044F4D3 . 63 6D 64 2E 65>ASCII "cmd.exe",0
0044F4DB . 6F 70 65 6E 00>ASCII "open",0
0044F4E3 . 6A 05 PUSH 5 ; /IsShown = 5
0044F4E5 . 68 D1F44400 PUSH puttyexe.0044F4D1 ; |DefDir = ""
0044F4EA . 68 D2F44400 PUSH puttyexe.0044F4D2 ; |Parameters = ""
0044F4EF . 68 D3F44400 PUSH puttyexe.0044F4D3 ; |FileName = "cmd.exe"
0044F4F4 . 68 DBF44400 PUSH puttyexe.0044F4DB ; |Operation = "open"
0044F4F9 . 6A 00 PUSH 0 ; |hWnd = NULL
0044F4FB . E8 401A5F7C CALL SHELL32.ShellExecuteA ; \ShellExecuteA
.
.
.
Teďka to jen přepíšu do MASM32 a vlastně to bude vyřešeno...
Dám si šlofíka, až ti poběží Softice a budeš crackovat něco velkýho, mě ale rozhodně vzbuď..
Jak jsem psal zapomněl jsi na include shell32.inc, shell32.lib.
Masm používá pro volání APIn invoke příkaz
použij invoke ExitProcess, 0 ; tj. exitcode
invoke ShellExecute, 1.parametr, 2.parametr, zde ve správném pořadí.
dál bych tě vyvedl z případného omylu, že se ti povede jen tak injektovat
kód volání ShellExecute do jakéhokoliv programu si zamaneš.
Používají se odskoky na adresy knihoven DLL, SHELL32.DLL, to je ten
převod Call něco na Call adresa, takže když nebude mít program linkovanou
tuto knihovnu dll,
skončíš runtime pádem. A když bude mít linkovanou, skončíš
runtime errorem na jakémkoliv odlišném systému Windows, kde
se adresy APIn s časem bohužel mění.
Řešením je lokalizace import table v PE hlavičce, vytažení Base Kernelu,
který je používán vesměs vždy a použití LoadLibrary,GetProcAddress. Nebo testovat všechny známé Base kernelu, nevim jak je to nejlíp s verzema Visty nebo teda Win7 a jejich prolomenym relokačnim enginem pro umisťování na random místa svých dll.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Spuštění externího programu — založil Colpik
Spuštění externího scriptu — založil Vlasta
Spouštění externího exe souboru — založil TB
Spusteni .exe — založil belze
C# spuštění programu *.EXE — založil ospaly.stanislav