[Syntax] FASM in MASM konvertieren

Offizieller deutscher Support für das MASM32 SDK. Download FAQ

Moderatoren: crack, Krüsty, Marwin

Antworten
herman2k
Newbie
Beiträge: 2
Registriert: Freitag 14. April 2006, 23:51

[Syntax] FASM in MASM konvertieren

Beitrag von herman2k » Samstag 15. April 2006, 00:53

Hallo Forum Gemeinde,
ich habe mich noch nicht mit der MASM Syntax befasst, bräuchte allerdings Hilfe, da ich gerne den source von FASM in MASM konvertiert hätte. Ich hoffe jemand könnte mir dabei helfen :)

Code: Alles auswählen

IMAGE_BASE = 0x04000000 
                      
_LoadLibrary = 0x5929C + IMAGE_BASE
_GetProcAddress = 0x592E4 + IMAGE_BASE
_CopyFileA = 0x5936C


IMPORT_ENTRY_NAME_PANDA = 0x5B308
IMPORT_ENTRY_PANDA_FIRST_THUNK = 0x5977C
BACK_TO_EP = 0x55700 + IMAGE_BASE

use32

mov ebx,IMAGE_BASE

mov edx,IMPORT_ENTRY_NAME_PANDA
add edx,ebx

push edx
call dword [_LoadLibrary]

mov edx,IMPORT_ENTRY_PANDA_FIRST_THUNK
mov edi,IMPORT_ENTRY_PANDA_FIRST_THUNK

add edx,ebx
add edi,ebx

.load_api_addresses:

cmp dword [edx],0
jz .finished_api_loading

mov ecx,[edx]

inc ecx
inc ecx

add ecx,ebx

push edx
push eax

push ecx
push eax
call dword [_GetProcAddress]

stosd

pop eax
pop edx

add edx,4
jmp .load_api_addresses

.finished_api_loading:

push BACK_TO_EP
ret

In Ollydbg sieht es dann so aus...

Code: Alles auswählen

004556E6 > $ BB 00004000    MOV EBX,patch.00400000                   ;  ASCII "MZP"
004556EB   . BA 08B30500    MOV EDX,5B308
004556F0   . 01DA           ADD EDX,EBX
004556F2   . 52             PUSH EDX                                 ; /FileName => "wsock32.dll"
004556F3   . FF15 9C924500  CALL NEAR DWORD PTR DS:[<&kernel32.LoadL>; \LoadLibraryA
004556F9   . BA 7C970500    MOV EDX,5977C
004556FE   . BF 7C970500    MOV EDI,5977C
00455703   . 01DA           ADD EDX,EBX
00455705   . 01DF           ADD EDI,EBX
00455707   > 833A 00        CMP DWORD PTR DS:[EDX],0
0045570A   . 74 18          JE SHORT patch.00455724
0045570C   . 8B0A           MOV ECX,DWORD PTR DS:[EDX]
0045570E   . 41             INC ECX
0045570F   . 41             INC ECX
00455710   . 01D9           ADD ECX,EBX
00455712   . 52             PUSH EDX
00455713   . 50             PUSH EAX
00455714   . 51             PUSH ECX                                 ; /ProcNameOrOrdinal
00455715   . 50             PUSH EAX                                 ; |hModule
00455716   . FF15 E4924500  CALL NEAR DWORD PTR DS:[<&kernel32.GetPr>; \GetProcAddress
0045571C   . AB             STOS DWORD PTR ES:[EDI]
0045571D   . 58             POP EAX
0045571E   . 5A             POP EDX
0045571F   . 83C2 04        ADD EDX,4
00455722   .^EB E3          JMP SHORT patch.00455707
00455724   > 55             PUSH EBP
00455725   . 8BEC           MOV EBP,ESP
00455727   . 83C4 F4        ADD ESP,-0C
0045572A   . 53             PUSH EBX
0045572B   . B8 D8544500    MOV EAX,patch.004554D8
00455730   . 68 84564500    PUSH patch.00455684
00455735   . C3             RETN                                     ;  RET used as a jump to 00455684

Der Code bewirkt das er ein DLL zur laufzeit ladet. In FASM kann ich es einfach als Binär Datei compelieren und den Code anschließend mit nen Hexeditor einfügen. Also es sollte nicht als eigenständige Win32 Datei compeliert werden!

Gruß,
herman2k

Benutzeravatar
crack
Administrator
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf
Kontaktdaten:

Beitrag von crack » Samstag 15. April 2006, 17:01

hallo hermann,

mal ein paar Infos...

für welches Zielsystem du programmierst, teilst du dem Compiler durch die Direktiven im Header mit:

.model legt die zu Verwendende Speichernutzung fest
.386 bestimmt den zu verwendenden code

Ob eine exe, com oder bin Datei erzeugt wird bestimmst Du durch die Optionen des Linkers. dazu musst du dem linker einfach den Namen der Ausgabedatei als 'name.bin' vorschreiben.

So, wenn ich das richtig verstanden habe möchtest du mit dem Programm lediglich ein paar Funktionen aus einer DLL nachladen? Nun, da bietet die Windows Api dir entsprechende Procedure Calls für an:

.data
userdll db "meinedll",0
...
...

.code
...
invoke LoadLibrary, addr userdll
...


würde dann die benannte DLL in den Speicher laden, wie der Vorgang im einzelnen genau funktioniert lies doch bitte in den sehr guten Tutorial von Marilyn (Joachim Rohde) oder IceLion nach ...

greetz crack

[EDIT: Fehler im Layout berichtigt]
mit freundlichen grüssen,
with best regards,

crack

herman2k
Newbie
Beiträge: 2
Registriert: Freitag 14. April 2006, 23:51

Beitrag von herman2k » Sonntag 16. April 2006, 13:57

Erstmal Danke für deine Antwort Crack :)
ich bin jetzt das ganze mal durchgegangen aber ehrlich gesagt bin leider nicht großartig weitergekommen :(

Ok ich habe ein Programm was in verbindung mit MASM laufen soll, dort sieht die syntax so z.B. aus ...

Code: Alles auswählen

test proc dwParam:dword

label:	xor	eax,eax
label:xor edx,edx
label:
	push	dword ptr fs:[eax]
	pop	dword ptr fs:[eax]

	mov	edx,1024
	mov	eax,256
	mov	eax,0

	mov	edx,0ABCDEFh
	mov	ecx,123h
	mov	eax,123456789
	mov	eax,1
	mov	eax,-1

	mov	edx,2
	mov	edx,-2

	shl	eax,1
	shr	edx,16

	je	@f
	jmp	@f
@@:
	jz	@b
	jmp	@f
	je	@b
@@:
	jmp	@b

	jmp	@f

@@:
	mov	eax,0
	jmp	@b
	jne	@b
	jmp	@f
@@:
	mov	eax,dwParam
	xor	eax,eax
	sub	eax,eax
	mov	eax,100
	mov	edx,100
	mov	eax,0
	mov	edx,0
	mov	ecx,MB_ICONINFORMATION
	mov	edx,IDD_DIALOG1
	xor	eax,100h
	xor	edx,-100h
	add	eax,100h
	add	edx,-100h
	sub	eax,100h
	sub	eax,-100h
	and	eax,111b
	mov	eax,offset MessageBoxA
	mov	edx,offset MessageBoxA+1

	call	ExitProcess

	ret
test endp
nun habe ich dabei Schwierigkeiten das ganze mit meinen code kompatibel zu machen! Wo befinden sich bei mir die Label und wozu sind die "@" Zeichen ?

Frohe Ostern übrigens noch,
herman2k

Benutzeravatar
crack
Administrator
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf
Kontaktdaten:

Beitrag von crack » Montag 17. April 2006, 09:55

Ja, frohe Ostern :)

Hm, das ist ja nur eine einzelne Prozedur, und der Gesamte Header fehlt ...
Und diese Syntax ist mir im Zusammenhang mit MASM32 auch nicht bekannt, das sieht mir eher für Quellcode für den A386 von Eric Isaacson aus (oder vielleicht für den Originalen Assembler von Intel?). Nun, egal wie dem auch sei, ich werde mir den Thread mal in ein Word Doc kopieren und dann mal in aller Ruhe sehen was es da umzuschreiben gibt, ich muss allerdings sagen das Ich den FASM nicht kenne, aber ich hab mir den mal runtergeladen...
Was mich noch etwas irritiert: Wieso willst Du denn das Prg. in eine Bin Datei compilieren? .bin Dateien sind gewöhnlicherweise zum Proggen von EPROMs gedacht: Typisches Kennzeichen einer Bin Datei ist das der Offset 0 ist, ein anderer Fall sind so einige Betriebssystemdateien von DOS/Win die auch als .bin Datei vorliegen (müssen). Für eine 'gewöhnliche' Anwendung unter DOS/Win ist jedoch immer die .exe das günstigste Format.

mfg. crack

PS. nun, wie gesagt, nur eine DLL oder Bestandteile dieser Laden ist relativ einfach zu bewerkstelligen, um welche DLL handelt es sich? Um auf die Funktionen der DLL zugreifen zu können benötigst Du eine entsprechende .lib Datei, aber diese kann man aus der DLL generieren. Möchtest Du DLL des Panda Anti Virus benutzen? Nun, wenn ch da ein paar nähere Angaben hätte könnte ich dir da bestimmt ein gutes Stück weiterhelfen ...
mit freundlichen grüssen,
with best regards,

crack

Antworten