push 0Ah ; Radix
push 2 ; fSizeInWords
lea eax, [ebp+DstBuf]
and dword ptr [ebp+DstBuf], 0
push eax ; DstBuf
push 7
pop ecx
xor edx, edx
mov eax, ebx
div ecx
push edx ; Val
call crt__itow_s
how to pass the _itow_s function in masm32 ?
I would have a look here for reference.
https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/itoa-s-itow-s?view=msvc-170
It is a C runtime function and you can load it with LoadLibrary() and GetProcAddress().
Unless you have good reason to use the security enhancements, I would use the _itoa function as it is a lot simpler to use.
Hello laomms,
You can create your own import library to use that function :
msvcrt.def :
LIBRARY msvcrt
EXPORTS
"_itow_s"
"wprintf"
itow_s.asm :
include \masm32\include\masm32rt.inc
includelib msvcrt.lib
_itow_s PROTO C :DWORD,:DWORD,:DWORD,:DWORD
.data
.data?
buffer db 8 dup(?)
.code
start:
invoke _itow_s,1000,ADDR buffer,8,10
invoke crt_wprintf,ADDR buffer
invoke ExitProcess,0
END start
Build.bat :
\masm32\bin\polib.exe /OUT:msvcrt.lib /DEF:msvcrt.def /MACHINE:x86
\masm32\bin\ml /c /coff itow_s.asm
\masm32\bin\polink /SUBSYSTEM:CONSOLE itow_s.obj msvcrt.lib
finally, I changed to the LoadLibrary method
LibName db "ntdll.dll",0
ProcName db "_itow_s",0
...
push 0Ah ; Radix
push 2 ; fSizeInWords
lea eax, [ebp+DstBuf]
and dword ptr [ebp+DstBuf], 0
push eax ; DstBuf
push 7
pop ecx
xor edx, edx
mov eax, ebx
div ecx
push edx ; Val
;call _itow_s
invoke LoadLibrary,ADDR LibName
invoke GetProcAddress,eax,ADDR ProcName
call eax
Quote from: laomms on February 02, 2023, 03:37:29 PM
lea eax, [ebp+DstBuf]
and dword ptr [ebp+DstBuf], 0
push eax ; DstBuf
Dumb compilers:
and dword ptr [eax], 0 would be equally fast but 4 bytes shorter.
So you are re-assembling a disassembled program. Nice. What's the purpose of the exercise?
Hi laomms,
Any specific reason to prefer ntdll.dll over msvcrt.dll to import that function?