Hi all and happy to join the forum
I have a Classic VB background and am just beginning to learn ASM from scratch .. I wanted to start with the famous hello world program
the following works as expected :
;.386
;.model flat,stdcall
; option casemap:none
include \masm32\include\masm32rt.inc
.data
MyTitle db "ASM is Fun!",0
MyText db "I hope you're learning!",0
msg dd 0,0
.code
start:
push 0
mov eax, offset MyTitle
push eax
mov eax, offset MyText
push eax
push 0
call MessageBoxA
;push eax
call ExitProcess
end start
Now the two questions :
1- How do I pass a variable containg a numeric value to the MsgBox in the second argument ie: MyText ( Say I want to display the desktop hwnd via the GetDesktopWindow API
2 - The above code displays the Msgbox but doesn't show how to get the return value from the user and handle it
Can anybody please show me how to do the above ? I tend to learn by small examples better than reading long tutorials
Regards.
Formatting can be done with wsprintf.
Return value for 32-bit MessageBox is in eax.
I haven't tested the following..mightn't work.
.686
.model flat, stdcall
include windows.inc
includelib user32.lib
includelib kernel32.lib
.data
title db "Handle test", 0
fmt db "Window Handle: %08X", 0
buf db 64 dup (?)
.code
start:
invoke GetDesktopWindow
invoke wsprintf, addr buf, addr fmt, eax
invoke MessageBox, NULL, addr buf, addr title, MB_OK
invoke ExitProcess, 0
end start
If you know some C, you can generate assembler code with MSVC using /Fa switch.
That'll give you idea how it works under the hood.
Standard example using Masm32 macros:
include \masm32\include\masm32rt.inc
.code
start: MsgBox 0, str$(rv(GetDesktopWindow)), "Your handle:", MB_YESNO
.if eax==IDYES
MsgBox 0, "You clicked YES", "Hi", MB_OK
.else
MsgBox 0, "You clicked NO", "Hi", MB_OK
.endif
exit
end start
Use Olly (http://www.ollydbg.de/version2.html) to see what's happening under the hood.
there are other masm32 macros that may be used, as well
INVOKE MessageBox,0,hex$(eax),offset szTitle,MB_OK ;hexadecimal dword value from register
INVOKE MessageBox,0,str$(dwValue),offset szTitle.MB_OK ;signed decimal dword value from memory
ustr$ is for unsigned decimal values
when done, MessageBox returns a result in EAX
https://msdn.microsoft.com/en-us/library/windows/desktop/ms645505%28v=vs.85%29.aspx (https://msdn.microsoft.com/en-us/library/windows/desktop/ms645505%28v=vs.85%29.aspx)
INVOKE MessageBox,0,offset szText,offset szTitle,MB_YESNO
.if eax==IDYES
;Yes button was pressed
.elseif eax==IDNO
;No button was pressed
.endif
Here is a quick tweak of your code.
include \masm32\include\masm32rt.inc
; ----------------
; initialised data
; ----------------
.data
MyTitle db "ASM is Fun!",0
MyText db "I hope you're learning!",0
; ------------------
; uninitialised data
; ------------------
.data?
num dd ?
; ----------------
; the CODE section
; ----------------
.code
start:
mov num, ustr$(1234) ; convert number to string
push MB_OK ; push the style
push offset MyTitle ; push the title offset
push num ; push the string containing the number
push 0 ; push 0 as there is no parent handle
call MessageBox ; call the ANSI version of messageBox
push 0 ; set an exit process value of 0
call ExitProcess ; exit the application
end start
Thanks everybody for responding 8)
This is what i came up with to display the DeskTop hwnd on the MsgBox :
include \masm32\include\masm32rt.inc
; ----------------
; initialised data
; ----------------
.data
MyTitle db "Desktop hwnd",0
; ------------------
; uninitialised data
; ------------------
.data?
num dd ?
stl dd ?
; ----------------
; the CODE section
; ----------------
.code
start:
mov num, ustr$(GetDesktopWindow) ; retriev the deskto hwnd and convert hwnd to string
mov stl , MB_OK
push stl ; push the style
push offset MyTitle ; push the title offset
push num ; push the string containing the Desktop hwnd
push 0 ; push 0 as there is no parent handle
call MessageBox ; call the ANSI version of messageBox
push 0 ; set an exit process value of 0
call ExitProcess ; exit the application
end start
I have seen some classic VB code that runs a Msgbox extracted form ASM via the CallWindowProc API ... I think it is called inline asm
Does anyone know how to convert the above ASM code into VB using this inline asm technic
Quote from: AssemblyBeginner on February 11, 2015, 02:55:17 AM
...
This is what i came up with to display the DeskTop hwnd on the MsgBox :
...
Also you might like this notation (tested on Windows XP):
include \masm32\include\masm32rt.inc
.code
start:
fn MessageBox,0,str$(GetDesktopWindow),"Desktop hwnd",MB_OK
exit
end start
Quote from: AssemblyBeginner on February 11, 2015, 02:55:17 AM
...
I think it is called inline asm
...
No, it's called a hack . From my VB days I remember I read a tutorial on this "technic"
and wrote simple proggie . Now I forgot all the detail how exactly it was done.
Thanks vertograd,
I think it is shellcode that you store in a vb string or array and then execute the code via the CallWindowProc API .. It is a hack but it opens up many opportunities in VB
If you have MasmBasic installed, have a look at the folder \masm32\masmbasic\mb2vb
Shellcode is for script kiddies, it's a hack, as Vertograd rightly called it. With the files in the mb2vb folder, you have access to the complete Masm32 and MasmBasic libraries.
Thanks jj2007,
Unfortunately the masmbasic folder is not in my masm32 installation
Do you know how to extract shellcode ? I see that shellcoding is very colse to asm that's why I thought I would ask in this forum
I hope I am not breaking the rules of this forum .. If so, I do apologise & I wont ask again
Regards
Quote from: AssemblyBeginner on February 11, 2015, 06:16:10 AM
Thanks jj2007,
Unfortunately the masmbasic folder is not in my masm32 installation
You need to install the library, see http://masm32.com/board/index.php?topic=94.0 and the remarks on JWasm
QuoteDo you know how to extract shellcode ? I see that shellcoding is very colse to asm that's why I thought I would ask in this forum
I hope I am not breaking the rules of this forum .. If so, I do apologise & I wont ask again
Regards
The rules are strict because shellcode is almost exclusively used by malware writers. Besides, the DLL approach used in \Masm32\MasmBasic\MB2VB\MasmBasicInsertStruct.bas offers a lot more flexibility.