Skip to content

Instantly share code, notes, and snippets.

@jmbrito01
Created August 5, 2015 14:36
Show Gist options
  • Save jmbrito01/94ebadf64d333f301ea5 to your computer and use it in GitHub Desktop.
Save jmbrito01/94ebadf64d333f301ea5 to your computer and use it in GitHub Desktop.
A number of usefull functions and macros to help you work with intel x86 assembly
include windows.inc
include user32.inc
include kernel32.inc
include gdi32.inc
include winmm.inc
include urlmon.inc
include wininet.inc
include advapi32.inc
includelib user32.lib
includelib kernel32.lib
includelib gdi32.lib
includelib winmm.lib
includelib urlmon.lib
includelib wininet.lib
includelib advapi32.lib
ofStr MACRO Text : req
local lText
.data
lText db Text, 0
.code
exitm <offset lText>
endM
lpStr MACRO Text : req
local lText
.data
lText db Text, 0
.code
exitm <addr lText>
endM
;STATIC FUNCTIONS
SetStaticImage PROTO hStatic : DWORD, szImage : DWORD, szType : DWORD, hInstance : DWORD ;hInstance can be null
;OWNERDRAW
SetTextType PROTO hDC : DWORD, Color: DWORD, Stock : DWORD, BGCOLOR : DWORD
DrawLine PROTO hDC : DWORD, X : DWORD, Y : DWORD, X2 : DWORD, Y2 : DWORD
CreateTitleArea PROTO hWin : DWORD, dwSize : DWORD
DrawTitleArea PROTO hWin : DWORD, hDC : DWORD, dwSize : DWORD ;NÃO ACABADA
;WINDOW FUNCTIONS
SetWindowIcon PROTO hWin : DWORD, szImage : DWORD, hInstance : DWORD ;hInstance can be null
GetWindowWidth PROTO hWin : DWORD
GetWindowHeight PROTO hWin : DWORD
EnumChildCallback PROTO hWin : DWORD, lParam : DWORD
RefreshWindow PROTO hWin : DWORD
SetAlphaTransparency PROTO hWin : DWORD, Alpha : DWORD, AlphaType : DWORD
SetWindowBackground PROTO hWin : DWORD, szImage : DWORD, hInstance : DWORD, szType : DWORD
RoundBorder PROTO hWin : DWORD
;OBJECT FUNCTIONS
CreateWebBrowser PROTO hWin : DWORD, lpStartPage : DWORD, X : DWORD, Y : DWORD, dwWidth : DWORD, dwHeight : DWORD, ID : DWORD, hInstance : DWORD
;PLAYER OBJECT FUNCTIONS
CreatePlayer PROTO hWin : DWORD, X : DWORD, Y : DWORD, dwWidth : DWORD, dwHeight : DWORD, hInstance : DWORD
HookPlayerCallback PROTO hWin : DWORD, uMsg : DWORD, wParam : DWORD, lParam : DWORD
;GAUGE FUNCTIONS
CreateGauge PROTO hWin : DWORD, X : DWORD, Y : DWORD, dwWidth : DWORD, dwHeight : DWORD, hInstance : DWORD
HookGaugeCallback PROTO hWin : DWORD, uMsg : DWORD, wParam : DWORD, lParam : DWORD
;IO FUNCTIONS
ReadTextFile PROTO lpFileName : DWORD
WriteTextFile PROTO lpFileName : DWORD, pText : DWORD
ReadFileChunk PROTO lpFileName : DWORD, dwSize : DWORD, dwChunk : DWORD
;CONVERT FUNCTIONS
IntToStr PROTO dwInt : DWORD
IntToHex PROTO dwInt : DWORD
StrToInt PROTO lpNumber : DWORD
UpperCase PROTO lpString : DWORD
SmallerCase PROTO lpString : DWORD
AsciiToUnicode PROTO lpString : DWORD
UnicodeToAscii PROTO lpString : DWORD ;NÃO ACABADA
;STRING FUNCTIONS
ExtractFilePath PROTO lpBuffy : DWORD
ExtractFileName PROTO lpBuffy : DWORD
ExtractFileExtension PROTO lpBuffy : DWORD
;FILE TRANSFER PROTOCOL
FTPConnect PROTO Server : DWORD, User : DWORD, Password : DWORD, Port : DWORD
FTPUpload PROTO hConnect : DWORD, lpFrom : DWORD, lpTo : DWORD
FTPClose PROTO hConnect : DWORD
FTPDownload PROTO hConnect : DWORD, lpFrom : DWORD, lpTo : DWORD
;REMOTE IO
RemoteReadFile PROTO lpLink : DWORD, dwSize : DWORD
RemoteGetFileChunk PROTO lpLink : DWORD, dwSize : DWORD, ChunkAt : DWORD
;PE Functions
IsValidPE PROTO lpFileName : DWORD
GetDOSHeader PROTO lpFileName : DWORD
GetNTHeaders PROTO lpFileName : DWORD
GetEntryPoint PROTO lpFileName : DWORD
GetOptionalHeaderObject PROTO lpFileName : DWORD, dwType : DWORD
GetNumberOfSections PROTO lpFileName : DWORD
ListSections PROTO lpFileName : DWORD, dwCallBack : DWORD, lParam : DWORD
;PROCESS FUNCTION
ProcExists PROTO pName : DWORD
GetPIDbyName PROTO pName : DWORD
SeDebugPrivilege PROTO
;TIME FUNCTIONS
TimeGetYear PROTO
TimeGetMonth PROTO
TimeGetWeekDay PROTO
TimeGetDay PROTO
TimeGetHour PROTO
TimeGetMinute PROTO
TimeGetSecond PROTO
TimeGetMillisecond PROTO
;UTILS
ShowTaskbar PROTO bBoolean : BOOL
MD5hash proto :dword,:dword,:dword
;IMAGE TYPES
IMAGETYPE_BITMAP equ 1
IMAGETYPE_ICON equ 2
;RETURN MESSAGES
ERROR_INCORRECT_PARAM equ 1
RETURN_SUCCESS equ 2
;COLOR STOCK
STOCK_WHITE equ 0
STOCK_LIGHTGRAY equ 1
STOCK_GRAY equ 2
STOCK_BLACK equ 4
STOCK_TRANSPARENT equ 5
;BG_COLOR
BG_TRANSPARENT equ -1
;Alpha Type
ALPHA_PERCENTAGE equ 1
ALPHA_BYTE equ 0
;OPTIONAL HEADER TYPES
OPTIONAL_GET_MAGIC equ 0
OPTIONAL_GET_MAJORLINKVER equ 1
OPTIONAL_GET_MINORLINKVER equ 2
OPTIONAL_GET_SIZEOFCODE equ 3
OPTIONAL_GET_SIZEOFINITDATA equ 4
OPTIONAL_GET_SIZEOFUINITDATA equ 5
OPTIONAL_GET_ADDROFEP equ 6
OPTIONAL_GET_BASEOFCODE equ 7
OPTIONAL_GET_BASEOFDATA equ 8
OPTIONAL_GET_IMAGEBASE equ 9
OPTIONAL_GET_SECTIONALIGN equ 10
OPTIONAL_GET_FILEALIGN equ 11
OPTIONAL_GET_MAJOROSVER equ 12
OPTIONAL_GET_MINOROSVER equ 13
OPTIONAL_GET_MAJORIMGVER equ 14
OPTIONAL_GET_MINORIMGVER equ 15
OPTIONAL_GET_MAJORSUBSYSVER equ 16
OPTIONAL_GET_MINORSUBSYSVER equ 17
OPTIONAL_GET_WIN32VERVALUE equ 18
OPTIONAL_GET_SIZEOFIMAGE equ 19
OPTIONAL_GET_SIZEOFHEADERS equ 20
OPTIONAL_GET_CHECKSUM equ 21
OPTIONAL_GET_SUBSYSTEM equ 22
OPTIONAL_GET_DLLCHARAC equ 23
OPTIONAL_GET_SIZEOFSTACKRES equ 24
OPTIONAL_GET_SIZEOFSTACKCOM equ 25
OPTIONAL_GET_SIZEOFHEAPRES equ 26
OPTIONAL_GET_SIZEOFHEAPCOM equ 27
OPTIONAL_GET_LOADERFLAG equ 28
OPTIONAL_GET_NUMBERRVASIZES equ 29
;PLAYER MESSAGES
PM_SELECTMUSIC equ WM_USER+1
PM_PLAYMUSIC equ WM_USER+2
PM_PAUSEMUSIC equ WM_USER+3
PM_DESTROYPLAYER equ WM_USER+4
;GAUGE MESSAGES
GM_GETBARCOLOR equ WM_USER+6
GM_GETBKCOLOR equ WM_USER+7
GM_GETPOS equ WM_USER+8
GM_GETMIN equ WM_USER+9
GM_GETSTEP equ WM_USER+10
GM_SETBARCOLOR equ WM_USER+11
GM_SETBKCOLOR equ WM_USER+12
GM_SETPOS equ WM_USER+13
GM_SETRANGE equ WM_USER+14
GM_SETSTEP equ WM_USER+15
GM_STEPIT equ WM_USER+16
GM_SETTEXTCOLOR equ WM_USER+17
GM_SETBKTEXTCOLOR equ WM_USER+18
GM_GETMAX equ WM_USER+19
GM_DESTROY equ WM_USER+20
WIN_INFO STRUCT
hMain dd ?
dwSize dd ?
WIN_INFO EndS
WINDOWINFO struct
cbSize DWORD ?
rcWindow RECT <>
rcClient RECT <>
dwStyle DWORD ?
dwExStyle DWORD ?
dwWindowStatus DWORD ?
cxWindowBorders UINT ?
cyWindowBorders UINT ?
atomWindowType ATOM ?
wCreatorVersion WORD ?
WINDOWINFO ends
PLAYER struct
hPlay dd ?
hPause dd ?
hWin dd ?
hInstance dd ?
dwWinProc dd ?
lpFileName dd ?
OpenParms MCI_OPEN_PARMS <?>
PlayParms MCI_PLAY_PARMS <?>
GenericParms MCI_GENERIC_PARMS <?>
PLAYER EndS
GAUGE struct
hProgress dd ?
hStatic dd ?
hWin dd ?
dwWinProc dd ?
TextColor dd ?
TextBgColor dd ?
GAUGE EndS
.data
wbClass db "AtlAxWin", 0
wbModule db "atl.dll", 0
wbFunction db "AtlAxWinInit", 0
staticClass db "STATIC", 0
lpPauseText db "or or", 0
lpPlayText db "or >", 0
buttonClass db "BUTTON", 0
hPlayerStruct dd ?
hGaugeStruct dd ?
strBuff db 256 dup(0)
.code
SetStaticImage proc hStatic : DWORD, szImage : DWORD, szType : DWORD, hInstance : DWORD
LOCAL hImage : DWORD
.if (szType == IMAGETYPE_BITMAP)
invoke GetWindowLong, hStatic, GWL_STYLE
or eax, SS_BITMAP
invoke SetWindowLong, hStatic, GWL_STYLE, eax
invoke LoadBitmap, hInstance, szImage
invoke SendMessage, hStatic, STM_SETIMAGE, IMAGE_BITMAP, eax
mov eax, RETURN_SUCCESS
ret
.elseif (szType == IMAGETYPE_ICON)
invoke GetWindowLong, hStatic, GWL_STYLE
or eax, SS_ICON
invoke SetWindowLong, hStatic, GWL_STYLE, eax
invoke LoadIcon, hInstance, szImage
invoke SendMessage, hStatic, STM_SETIMAGE, IMAGE_ICON, eax
mov eax, RETURN_SUCCESS
ret
.else
mov eax, ERROR_INCORRECT_PARAM
ret
.endif
SetStaticImage EndP
SetWindowIcon proc hWin : DWORD, szImage : DWORD, hInstance : DWORD
invoke GetModuleHandle, hInstance
invoke LoadIcon, eax, szImage
invoke SendMessage, hWin, WM_SETICON, eax, 0
mov eax, RETURN_SUCCESS
Ret
SetWindowIcon EndP
SetTextType proc hDC : DWORD, Color: DWORD, Stock : DWORD, BGCOLOR: DWORD
.if (BGCOLOR == BG_TRANSPARENT)
invoke SetBkMode, hDC, TRANSPARENT
.else
invoke SetBkColor, hDC, BGCOLOR
.endif
invoke SetTextColor, hDC, Color
invoke GetStockObject, Stock
Ret
SetTextType EndP
DrawLine proc hDC : DWORD, X : DWORD, Y : DWORD, X2 : DWORD, Y2 : DWORD
LOCAL P : POINT
invoke MoveToEx, hDC, X, Y, addr P
invoke LineTo, hDC, X2, Y2
invoke MoveToEx, hDC, P.x, P.y, NULL
mov eax, RETURN_SUCCESS
Ret
DrawLine EndP
CreateTitleArea proc hWin : DWORD, dwSize : DWORD
LOCAL R: RECT
LOCAL winInfo : WIN_INFO
invoke GetWindowRect, hWin, addr R
mov ebx, R.right
sub ebx, R.left
mov ecx, R.bottom
sub ecx, R.top
add ecx, dwSize
invoke MoveWindow, hWin, R.left, R.top, ebx, ecx,TRUE
invoke GetWindowLong, hWin, GWL_STYLE
xor eax, WS_BORDER
xor eax, WS_DLGFRAME
invoke SetWindowLong, hWin, GWL_STYLE, eax
mov eax, hWin
mov winInfo.hMain, eax
mov eax, dwSize
mov winInfo.dwSize, eax
invoke EnumChildWindows, hWin, addr EnumChildCallback, addr winInfo
invoke SendMessage, hWin, WM_PAINT, 0, 0
mov eax, RETURN_SUCCESS
Ret
CreateTitleArea EndP
EnumChildCallback proc hWin : DWORD, lParam : DWORD
LOCAL R : RECT
LOCAL R2 : RECT
mov esi, lParam
assume esi : ptr WIN_INFO
invoke GetWindowRect, [esi].hMain, addr R
invoke GetWindowRect, hWin, addr R2
mov ebx, R2.left
sub ebx, R.left
mov ecx, R2.top
sub ecx, R.top
add ecx, [esi].dwSize
invoke GetWindowHeight, hWin
mov edx, eax
invoke GetWindowWidth, hWin
invoke MoveWindow, hWin, ebx, ecx, eax, edx, TRUE
invoke RefreshWindow, hWin
invoke RefreshWindow, [esi].hMain
mov eax, RETURN_SUCCESS
Ret
EnumChildCallback EndP
DrawTitleArea proc hWin : DWORD, hDC : DWORD, dwSize : DWORD
LOCAL winCaption[500] : CHAR
invoke GetWindowText, hWin, addr winCaption, sizeof winCaption
invoke GetWindowTextLength, hWin
invoke TextOut, hDC, 5, 5, addr winCaption,eax
invoke GetWindowHeight, hWin
invoke DrawLine, hDC, 0, dwSize, eax, dwSize
mov eax, RETURN_SUCCESS
Ret
DrawTitleArea EndP
GetWindowHeight proc hWin : DWORD
invoke VirtualAlloc, NULL, sizeof WINDOWINFO, MEM_COMMIT, PAGE_READWRITE
mov esi, eax
assume esi : ptr WINDOWINFO
mov [esi].cbSize, sizeof WINDOWINFO
invoke GetWindowInfo, hWin, esi
mov eax, [esi].rcWindow.bottom
sub eax, [esi].rcWindow.top
push eax
invoke VirtualFree, esi, sizeof WINDOWINFO, MEM_RELEASE
pop eax
Ret
GetWindowHeight EndP
GetWindowWidth proc hWin : DWORD
invoke VirtualAlloc, NULL, sizeof WINDOWINFO, MEM_COMMIT, PAGE_READWRITE
mov esi, eax
assume esi : ptr WINDOWINFO
mov [esi].cbSize, sizeof WINDOWINFO
invoke GetWindowInfo, hWin, esi
mov eax, [esi].rcWindow.right
sub eax, [esi].rcWindow.left
push eax
invoke VirtualFree, esi, sizeof WINDOWINFO, MEM_RELEASE
pop eax
Ret
GetWindowWidth EndP
RefreshWindow proc hWin : DWORD
invoke RedrawWindow, hWin, NULL, NULL, RDW_ERASE or RDW_INVALIDATE or RDW_FRAME or RDW_ALLCHILDREN
mov eax, RETURN_SUCCESS
Ret
RefreshWindow EndP
SetAlphaTransparency proc hWin : DWORD, Alpha : DWORD, AlphaType : DWORD
invoke GetWindowLong, hWin, GWL_EXSTYLE
or eax, WS_EX_LAYERED
invoke SetWindowLong, hWin, GWL_EXSTYLE, eax
.if (AlphaType == ALPHA_PERCENTAGE)
mov eax, 255
imul eax, Alpha
mov ecx, 100
div ecx
.else
mov eax, Alpha
.endif
invoke SetLayeredWindowAttributes, hWin, NULL, eax, LWA_ALPHA
mov eax, RETURN_SUCCESS
Ret
SetAlphaTransparency EndP
CreateWebBrowser proc hWin : DWORD, lpStartPage : DWORD, X : DWORD, Y : DWORD, dwWidth : DWORD, dwHeight : DWORD, ID : DWORD, hInstance : DWORD
invoke LoadLibrary, offset wbModule
invoke GetProcAddress, eax, addr wbFunction
call eax
invoke CreateWindowEx, NULL, addr wbClass, lpStartPage, WS_VISIBLE or WS_CHILD, X, Y, dwWidth, dwHeight, hWin, ID, hInstance, NULL
Ret
CreateWebBrowser EndP
SetWindowBackground proc hWin : DWORD, szImage : DWORD, hInstance : DWORD, szType : DWORD
invoke GetWindowWidth, hWin
mov ebx, eax
invoke GetWindowHeight, hWin
invoke CreateWindowEx, NULL, addr staticClass, NULL, WS_CHILD or WS_VISIBLE or SS_CENTERIMAGE, 0, 0, ebx, eax, hWin, NULL, hInstance, NULL
mov esi, eax
invoke SetStaticImage, eSI, szImage, szType, hInstance
invoke SetWindowPos, esi,HWND_BOTTOM, 0, 0, 0, 0,SWP_NOSIZE or SWP_NOMOVE
Ret
SetWindowBackground EndP
RoundBorder proc hWin : DWORD
invoke GetWindowWidth, hWin
mov ebx, eax
invoke GetWindowHeight, hWin
invoke CreateRoundRectRgn, 0, 0, ebx, eax, 20, 20
invoke SetWindowRgn, hWin, eax, TRUE
Ret
RoundBorder EndP
CreatePlayer proc hWin : DWORD, X : DWORD, Y : DWORD, dwWidth : DWORD, dwHeight : DWORD, hInstance : DWORD
mov eax, dwWidth
mov ecx, 2
div ecx
mov ebx, eax
invoke VirtualAlloc, NULL, sizeof PLAYER, MEM_COMMIT, PAGE_READWRITE
mov edi, eax
assume edi : ptr PLAYER
invoke CreateWindowEx, NULL, addr buttonClass, addr lpPlayText, WS_VISIBLE or WS_CHILD, X, Y, ebx, dwHeight, hWin, NULL, hInstance, NULL
mov [edi].hPlay, eax
mov ecx, X
add ecx, ebx
invoke CreateWindowEx, NULL, addr buttonClass, addr lpPauseText, WS_VISIBLE or WS_CHILD, ecx, Y, ebx, dwHeight, hWin, NULL, hInstance, NULL
mov [edi].hPause, eax
mov eax, hWin
mov [edi].hWin, eax
invoke GetWindowLong, [edi].hWin,GWL_WNDPROC
mov [edi].dwWinProc, eax
invoke SetWindowLong, [edi].hWin, GWL_WNDPROC, addr HookPlayerCallback
mov hPlayerStruct, edi
mov eax, edi
Ret
CreatePlayer EndP
HookPlayerCallback proc hWin : DWORD, uMsg : DWORD, wParam : DWORD, lParam : DWORD
mov edi, hPlayerStruct
assume edi : ptr PLAYER
.if (uMsg == WM_COMMAND)
mov eax, lParam
.if (eax == [edi].hPlay)
push hWin
pop [edi].PlayParms.dwCallback
mov [edi].OpenParms.lpstrDeviceType, ofStr("Sequencer")
mov eax, [edi].lpFileName
mov [edi].OpenParms.lpstrElementName, eax
invoke mciSendCommand, 0, MCI_OPEN, MCI_OPEN_TYPE or MCI_OPEN_ELEMENT, addr [edi].OpenParms
mov esi, [edi].OpenParms.wDeviceID
invoke mciSendCommand, esi, MCI_PLAY, MCI_NOTIFY, addr [edi].PlayParms
.elseif (eax == [edi].hPause)
push hWin
pop [edi].GenericParms.dwCallback
invoke mciSendCommand, [edi].OpenParms.wDeviceID, MCI_PAUSE, MCI_NOTIFY, addr [edi].GenericParms
.endif
.elseif (uMsg == PM_SELECTMUSIC)
mov eax, lParam
mov [edi].lpFileName, eax
.elseif (uMsg == PM_PLAYMUSIC)
invoke SendMessage, hWin, WM_COMMAND, 0, [edi].hPlay
.elseif (uMsg == PM_PAUSEMUSIC)
invoke SendMessage, hWin, WM_COMMAND, 0, [edi].hPause
.elseif (uMsg == PM_DESTROYPLAYER)
invoke SetWindowLong, hWin, GWL_WNDPROC, [edi].dwWinProc
push hWin
pop [edi].GenericParms.dwCallback
invoke mciSendCommand, [edi].OpenParms.wDeviceID, MCI_PAUSE, MCI_NOTIFY, addr [edi].GenericParms
invoke DestroyWindow, [edi].hPlay
invoke DestroyWindow, [edi].hPause
invoke VirtualFree, edi, sizeof PLAYER, MEM_RELEASE
.endif
mov eax, [edi].dwWinProc
push lParam
push wParam
push uMsg
push hWin
call eax
Ret
HookPlayerCallback EndP
ReadTextFile proc lpFileName : DWORD
LOCAL hFile : DWORD
LOCAL pText : DWORD
LOCAL Written : DWORD
invoke CreateFile, lpFileName,GENERIC_READ, FILE_SHARE_READ, NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL
mov hFile, eax
invoke GetFileSize, hFile, NULL
inc eax
push eax
invoke VirtualAlloc, NULL, eax, MEM_COMMIT, PAGE_READWRITE
mov pText, eax
pop ebx
invoke ReadFile, hFile, pText, ebx, addr Written, NULL
invoke CloseHandle, hFile
mov eax, pText
Ret
ReadTextFile EndP
WriteTextFile proc lpFileName : DWORD, pText : DWORD
LOCAL hFile : DWORD
LOCAL Written : DWORD
invoke CreateFile, lpFileName,GENERIC_WRITE, FILE_SHARE_WRITE, NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL, NULL
mov hFile, eax
invoke lstrlen, pText
mov ebx, eax
invoke WriteFile, hFile, pText, ebx, addr Written, NULL
invoke CloseHandle, hFile
mov eax,ebx
Ret
WriteTextFile EndP
IntToStr proc dwInt : DWORD
invoke VirtualAlloc, NULL, 11, MEM_COMMIT, PAGE_READWRITE
push eax
invoke wsprintf, eax, lpStr("%d"), dwInt
pop eax
Ret
IntToStr EndP
IntToHex proc dwInt : DWORD
invoke VirtualAlloc, NULL, 9, MEM_COMMIT, PAGE_READWRITE
mov esi, eax
invoke wsprintf, esi, lpStr("%X"), dwInt
mov eax, esi
Ret
IntToHex EndP
ExtractFilePath proc lpBuffy : DWORD
invoke lstrlen, lpBuffy
mov ecx, lpBuffy
mov esi, eax
.while (esi > 0)
mov al, byte ptr ds:[ecx+esi]
.if (al == "\")
invoke VirtualAlloc, NULL, edx, MEM_COMMIT, PAGE_READWRITE
mov edx, eax
push eax
inc esi
invoke RtlMoveMemory, edx, lpBuffy, esi
pop eax
ret
.endif
dec esi
.endw
Ret
ExtractFilePath EndP
ExtractFileName proc lpBuffy : DWORD
invoke lstrlen, lpBuffy
mov ecx, lpBuffy
mov esi, eax
.while (esi > 0)
mov al, byte ptr ds:[ecx+esi]
.if (al == "\")
dec esi
add esi, lpBuffy
invoke lstrlen, esi
mov edi, eax
inc edx
push edx
invoke VirtualAlloc, NULL, eax, MEM_COMMIT, PAGE_READWRITE
push eax
pop edx
invoke RtlMoveMemory, eax,edx, edi
pop eax
ret
.endif
dec esi
.endw
Ret
ExtractFileName EndP
ExtractFileExtension proc lpBuffy : DWORD
invoke lstrlen, lpBuffy
mov ecx, lpBuffy
mov esi, eax
.while (esi > 0)
mov al, byte ptr ds:[ecx+esi]
.if (al == ".")
dec esi
add esi, lpBuffy
invoke lstrlen, esi
mov edi, eax
inc edx
push edx
invoke VirtualAlloc, NULL, eax, MEM_COMMIT, PAGE_READWRITE
push eax
pop edx
invoke RtlMoveMemory, eax,edx, edi
pop eax
ret
.endif
dec esi
.endw
Ret
ExtractFileExtension EndP
CreateGauge proc hWin : DWORD, X : DWORD, Y : DWORD, dwWidth : DWORD, dwHeight : DWORD, hInstance : DWORD
mov eax, dwWidth
mov ecx, 2
div ecx
add eax, 20
mov ebx, eax
invoke VirtualAlloc, NULL, sizeof GAUGE, MEM_COMMIT, PAGE_READWRITE
mov edi, eax
assume edi : ptr GAUGE
invoke CreateWindowEx, NULL, lpStr("msctls_progress32"), NULL, WS_VISIBLE or WS_CHILD or PBS_MARQUEE, X, Y, dwWidth, dwHeight, hWin, NULL, hInstance, NULL
mov [edi].hProgress, eax
invoke CreateWindowEx, NULL, lpStr("STATIC"), lpStr("0 %"), WS_VISIBLE or WS_CHILD or SS_CENTERIMAGE or SS_CENTER, ebx, Y, 35, dwHeight, hWin, NULL, hInstance, NULL
mov [edi].hStatic, eax
mov eax, hWin
mov [edi].hWin, eax
invoke GetWindowLong, [edi].hWin,GWL_WNDPROC
mov [edi].dwWinProc, eax
invoke SetWindowLong, [edi].hWin, GWL_WNDPROC, addr HookGaugeCallback
mov hGaugeStruct, edi
mov [edi].TextBgColor, BG_TRANSPARENT
invoke SendMessage, [edi].hProgress, PBM_SETMARQUEE, TRUE, 0
mov eax, edi
Ret
CreateGauge EndP
HookGaugeCallback proc hWin : DWORD, uMsg : DWORD, wParam : DWORD, lParam : DWORD
mov edi, hGaugeStruct
assume edi : ptr GAUGE
.if (uMsg == GM_GETPOS)
invoke SendMessage, [edi].hProgress, PBM_GETPOS, 0, 0
ret
.elseif (uMsg == GM_GETBARCOLOR)
invoke SendMessage, [edi].hProgress, PBM_GETBARCOLOR, 0, 0
ret
.elseif (uMsg == GM_GETBKCOLOR)
invoke SendMessage, [edi].hProgress, PBM_GETBKCOLOR, 0, 0
ret
.elseif (uMsg == GM_GETMIN)
invoke SendMessage, [edi].hProgress, PBM_GETRANGE, TRUE, 0
ret
.elseif (uMsg == GM_GETMAX)
invoke SendMessage, [edi].hProgress, PBM_GETRANGE, FALSE, 0
ret
.elseif (uMsg == GM_GETSTEP)
invoke SendMessage, [edi].hProgress, PBM_GETSTEP, 0, 0
ret
.elseif (uMsg == GM_STEPIT)
invoke SendMessage, [edi].hProgress, PBM_STEPIT, 0, 0
invoke SendMessage, [edi].hProgress, PBM_GETPOS, 0, 0
imul eax, 100
push eax
invoke SendMessage, [edi].hProgress, PBM_GETRANGE, FALSE, 0
xor edx, edx
pop eax
mov ecx, 100
div ecx
invoke wsprintf, addr strBuff, lpStr("%d %% "), eax
invoke SendMessage, [edi].hStatic, WM_SETTEXT, 0, addr strBuff
invoke ShowWindow, [edi].hStatic, SW_HIDE
invoke ShowWindow, [edi].hStatic, SW_SHOW
ret
.elseif (uMsg == GM_SETBARCOLOR)
invoke SendMessage, [edi].hProgress, PBM_SETBARCOLOR, 0, lParam
ret
.elseif (uMsg == GM_SETBKCOLOR)
invoke SendMessage, [edi].hProgress, PBM_SETBKCOLOR, 0, lParam
ret
.elseif (uMsg == GM_SETPOS)
invoke SendMessage, [edi].hProgress, PBM_SETPOS, wParam, 0
invoke SendMessage, [edi].hProgress, PBM_GETPOS, 0, 0
imul eax, 100
push eax
invoke SendMessage, [edi].hProgress, PBM_GETRANGE, FALSE, 0
xor edx, edx
pop eax
mov ecx, 100
div ecx
invoke wsprintf, addr strBuff, lpStr("%d %% "), eax
invoke SendMessage, [edi].hStatic, WM_SETTEXT, 0, addr strBuff
invoke ShowWindow, [edi].hStatic, SW_HIDE
invoke ShowWindow, [edi].hStatic, SW_SHOW
ret
.elseif (uMsg == GM_SETRANGE)
invoke SendMessage, [edi].hProgress, PBM_SETRANGE32, wParam, lParam
ret
.elseif (uMsg == GM_SETSTEP)
invoke SendMessage, [edi].hProgress, PBM_SETSTEP, wParam, 0
ret
.elseif (uMsg == GM_SETTEXTCOLOR)
mov eax, lParam
mov [edi].TextColor, eax
ret
.elseif (uMsg == GM_SETBKTEXTCOLOR)
mov eax, lParam
mov [edi].TextBgColor, eax
ret
.elseif (uMsg == WM_CTLCOLORSTATIC)
mov eax, lParam
.if (eax == [edi].hStatic)
.if ([edi].TextBgColor == BG_TRANSPARENT)
invoke SetBkMode, wParam,TRANSPARENT
.else
invoke SetBkColor, wParam, [edi].TextBgColor
.endif
invoke SetTextColor, wParam, [edi].TextColor
invoke GetStockObject, NULL_BRUSH
ret
.endif
.elseif (uMsg == GM_DESTROY)
invoke DestroyWindow, [edi].hProgress
invoke DestroyWindow, [edi].hStatic
invoke SetWindowLong, hWin,GWL_WNDPROC, [edi].dwWinProc
invoke VirtualFree, edi, sizeof GAUGE, MEM_RELEASE
ret
.endif
push lParam
push wParam
push uMsg
push hWin
mov eax, [edi].dwWinProc
call eax
Ret
HookGaugeCallback EndP
FTPConnect proc Server : DWORD, User : DWORD, Password : DWORD, Port : DWORD
LOCAL hInternet : DWORD
LOCAL hConnect : DWORD
LOCAL Find : WIN32_FIND_DATA
LOCAL W : DWORD
invoke InternetOpen, lpStr("UtilFTP"), INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0
mov hInternet, eax
invoke InternetConnect, eax, Server, Port, User, Password, INTERNET_SERVICE_FTP, NULL, NULL
Ret
FTPConnect EndP
FTPUpload proc hConnect : DWORD, lpFrom : DWORD, lpTo : DWORD
invoke FtpPutFile, hConnect,lpFrom, lpTo, FTP_TRANSFER_TYPE_ASCII, 0
Ret
FTPUpload EndP
FTPClose proc hConnect : DWORD
invoke InternetCloseHandle, hConnect
Ret
FTPClose EndP
FTPDownload proc hConnect : DWORD, lpFrom : DWORD, lpTo : DWORD
invoke FtpGetFile, hConnect, lpFrom, lpTo, FALSE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_ASCII, NULL
Ret
FTPDownload EndP
RemoteReadFile proc lpLink : DWORD, dwSize: DWORD
LOCAL hConnect : DWORD
LOCAL W : DWORD
invoke InternetOpen, lpStr("UtilFTP"), INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0
invoke InternetOpenUrl, eax, lpLink, lpStr("Accept: */*\r\n\r\n"), 19, INTERNET_FLAG_DONT_CACHE, NULL
mov hConnect, eax
mov eax, dwSize
invoke VirtualAlloc, NULL, eax, MEM_COMMIT, PAGE_READWRITE
mov esi, eax
invoke InternetReadFile, hConnect, esi, dwSize, addr W
invoke InternetCloseHandle, hConnect
mov eax, esi
Ret
RemoteReadFile EndP
RemoteGetFileChunk proc lpLink : DWORD, dwSize : DWORD, ChunkAt : DWORD
LOCAL hConnect : DWORD
LOCAL W: DWORD
invoke InternetOpen, lpStr("UtilFTP"), INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0
invoke InternetOpenUrl, eax, lpLink, lpStr("Accept: */*\r\n\r\n"), 19, INTERNET_FLAG_DONT_CACHE, NULL
mov hConnect, eax
mov eax, dwSize
invoke VirtualAlloc, NULL, eax, MEM_COMMIT, PAGE_READWRITE
mov esi, eax
invoke InternetSetFilePointer, hConnect, ChunkAt, NULL, FILE_BEGIN, NULL
invoke InternetReadFile, hConnect, esi, dwSize, addr W
invoke InternetCloseHandle, hConnect
mov eax, esi
Ret
RemoteGetFileChunk EndP
ReadFileChunk proc lpFileName : DWORD, dwSize : DWORD, dwChunk : DWORD
LOCAL hFile : DWORD
LOCAL Written : DWORD
invoke CreateFile, lpFileName, GENERIC_READ,FILE_SHARE_READ, NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
mov hFile, eax
invoke SetFilePointer, hFile, dwChunk, NULL, FILE_BEGIN
invoke VirtualAlloc, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE
xchg esi, eax
invoke ReadFile, hFile, esi, dwSize, addr Written, NULL
invoke CloseHandle, hFile
xchg esi, eax
Ret
ReadFileChunk EndP
IsValidPE proc lpFileName : DWORD
LOCAL hFile : DWORD
LOCAL W : DWORD
LOCAL DOSHeader : IMAGE_DOS_HEADER
LOCAL NTHeaders : IMAGE_NT_HEADERS
invoke CreateFile, lpFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
mov hFile, eax
invoke ReadFile, hFile, addr DOSHeader, sizeof IMAGE_DOS_HEADER, addr W, NULL
invoke SetFilePointer, hFile, DOSHeader.e_lfanew, NULL, FILE_BEGIN
invoke ReadFile, hFile, addr NTHeaders, sizeof IMAGE_NT_HEADERS, addr W, NULL
invoke CloseHandle, hFile
.if (NTHeaders.Signature == IMAGE_NT_SIGNATURE)
mov eax, TRUE
.else
mov eax, FALSE
.endif
Ret
IsValidPE EndP
GetDOSHeader proc lpFileName : DWORD
LOCAL hFile : DWORD
LOCAL W : DWORD
invoke CreateFile, lpFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
mov hFile, eax
invoke VirtualAlloc, NULL, sizeof IMAGE_DOS_HEADER, MEM_COMMIT, PAGE_READWRITE
mov esi, eax
invoke ReadFile, hFile, esi, sizeof IMAGE_DOS_HEADER, addr W, NULL
invoke CloseHandle, hFile
mov eax, esi
Ret
GetDOSHeader EndP
GetNTHeaders proc lpFileName : DWORD
LOCAL hFile : DWORD
LOCAL Written : DWORD
LOCAL DOSHeader : IMAGE_DOS_HEADER
LOCAL W : DWORD
invoke CreateFile, lpFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
mov hFile, eax
invoke ReadFile, hFile, addr DOSHeader, sizeof IMAGE_DOS_HEADER, addr W, NULL
invoke SetFilePointer, hFile, DOSHeader.e_lfanew, NULL, FILE_BEGIN
invoke VirtualAlloc, NULL, sizeof IMAGE_NT_HEADERS, MEM_COMMIT, PAGE_READWRITE
mov esi, eax
invoke ReadFile, hFile, esi, sizeof IMAGE_NT_HEADERS, addr W, NULL
invoke CloseHandle, hFile
mov eax, esi
Ret
GetNTHeaders EndP
GetEntryPoint proc lpFileName : DWORD
invoke GetNTHeaders, lpFileName
assume eax : ptr IMAGE_NT_HEADERS
mov eax, [eax].OptionalHeader.ImageBase
add eax, [eax].OptionalHeader.AddressOfEntryPoint
Ret
GetEntryPoint EndP
GetOptionalHeaderObject proc lpFileName : DWORD, dwType : DWORD
invoke GetNTHeaders, lpFileName
assume eax : ptr IMAGE_NT_HEADERS
.if (dwType == OPTIONAL_GET_MAGIC)
movzx esi, [eax].OptionalHeader.Magic
.elseif (dwType == OPTIONAL_GET_MAJORLINKVER)
movzx esi, [eax].OptionalHeader.MajorLinkerVersion
.elseif (dwType == OPTIONAL_GET_MINORLINKVER)
movzx esi, [eax].OptionalHeader.MinorLinkerVersion
.elseif (dwType == OPTIONAL_GET_SIZEOFCODE)
mov eax, [eax].OptionalHeader.SizeOfCode
.elseif (dwType == OPTIONAL_GET_SIZEOFINITDATA)
mov eax, [eax].OptionalHeader.SizeOfInitializedData
.elseif (dwType == OPTIONAL_GET_SIZEOFUINITDATA)
mov eax, [eax].OptionalHeader.SizeOfUninitializedData
.elseif (dwType == OPTIONAL_GET_ADDROFEP)
mov eax, [eax].OptionalHeader.AddressOfEntryPoint
ret
.elseif (dwType == OPTIONAL_GET_BASEOFCODE)
mov eax, [eax].OptionalHeader.BaseOfCode
.elseif (dwType == OPTIONAL_GET_BASEOFDATA)
mov eax, [eax].OptionalHeader.BaseOfData
.elseif (dwType == OPTIONAL_GET_IMAGEBASE)
mov eax, [eax].OptionalHeader.ImageBase
.elseif (dwType == OPTIONAL_GET_SECTIONALIGN)
mov eax, [eax].OptionalHeader.SectionAlignment
.elseif (dwType == OPTIONAL_GET_FILEALIGN)
mov eax, [eax].OptionalHeader.FileAlignment
.elseif (dwType == OPTIONAL_GET_MAJOROSVER)
movzx esi, [eax].OptionalHeader.MajorOperatingSystemVersion
.elseif (dwType == OPTIONAL_GET_MINOROSVER)
movzx esi, [eax].OptionalHeader.MinorOperatingSystemVersion
.elseif (dwType == OPTIONAL_GET_MAJORSUBSYSVER)
movzx esi, [eax].OptionalHeader.MajorSubsystemVersion
.elseif (dwType == OPTIONAL_GET_MINORSUBSYSVER)
movzx esi, [eax].OptionalHeader.MinorSubsystemVersion
.elseif (dwType == OPTIONAL_GET_WIN32VERVALUE)
mov eax, [eax].OptionalHeader.Win32VersionValue
.elseif (dwType == OPTIONAL_GET_SIZEOFIMAGE)
mov eax, [eax].OptionalHeader.SizeOfImage
.elseif (dwType == OPTIONAL_GET_SIZEOFHEADERS)
mov eax, [eax].OptionalHeader.SizeOfHeaders
.elseif (dwType == OPTIONAL_GET_CHECKSUM)
mov eax, [eax].OptionalHeader.CheckSum
.elseif (dwType == OPTIONAL_GET_SUBSYSTEM)
movzx esi, [eax].OptionalHeader.Subsystem
.elseif (dwType == OPTIONAL_GET_DLLCHARAC)
movzx esi, [eax].OptionalHeader.DllCharacteristics
.elseif (dwType == OPTIONAL_GET_SIZEOFSTACKRES)
mov eax, [eax].OptionalHeader.SizeOfStackReserve
.elseif (dwType == OPTIONAL_GET_SIZEOFSTACKCOM)
mov eax, [eax].OptionalHeader.SizeOfStackCommit
.elseif (dwType == OPTIONAL_GET_SIZEOFHEAPRES)
mov eax, [eax].OptionalHeader.SizeOfHeapReserve
.elseif (dwType == OPTIONAL_GET_SIZEOFHEAPCOM)
mov eax, [eax].OptionalHeader.SizeOfHeapCommit
.elseif (dwType == OPTIONAL_GET_LOADERFLAG)
mov eax, [eax].OptionalHeader.LoaderFlags
.elseif (dwType == OPTIONAL_GET_NUMBERRVASIZES)
mov eax, [eax].OptionalHeader.NumberOfRvaAndSizes
.endif
Ret
GetOptionalHeaderObject EndP
GetNumberOfSections proc lpFileName : DWORD
invoke GetNTHeaders, lpFileName
assume eax : ptr IMAGE_NT_HEADERS
movzx eax, [eax].FileHeader.NumberOfSections
Ret
GetNumberOfSections EndP
ListSections proc lpFileName : DWORD, dwCallback : DWORD, lParam : DWORD
LOCAL hFile : DWORD
LOCAL SecHeader : IMAGE_SECTION_HEADER
LOCAL W: DWORD
invoke GetNTHeaders, lpFileName
mov edi, eax
invoke CreateFile, lpFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
mov hFile, eax
assume edi : ptr IMAGE_NT_HEADERS
invoke GetDOSHeader, lpFileName
assume eax : ptr IMAGE_DOS_HEADER
invoke SetFilePointer, hFile, [eax].e_lfanew, 0, FILE_BEGIN
invoke SetFilePointer, hFile, sizeof IMAGE_NT_HEADERS, NULL, FILE_CURRENT
xor ebx, ebx
movzx ebx, [edi].FileHeader.NumberOfSections
.while (ebx > 0)
pushad
invoke ReadFile, hFile, addr SecHeader, sizeof IMAGE_SECTION_HEADER, addr W, NULL
invoke VirtualAlloc, NULL, sizeof IMAGE_SECTION_HEADER+1, MEM_COMMIT, PAGE_READWRITE
mov esi, eax
invoke RtlMoveMemory, esi, addr SecHeader, sizeof IMAGE_SECTION_HEADER
push lParam
push esi
call dwCallback
invoke SetFilePointer, hFile, sizeof IMAGE_SECTION_HEADER, NULL, FILE_CURRENT
popad
dec ebx
.endw
Ret
ListSections EndP
ProcExists proc pName :DWORD
LOCAL hSnap : HANDLE
LOCAL PE32 : PROCESSENTRY32
invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS, NULL
mov hSnap, eax
mov PE32.dwSize, sizeof PE32
invoke Process32First, hSnap, addr PE32
.while (eax == TRUE)
invoke lstrcmp, addr PE32.szExeFile, pName
.if (eax == 0)
mov eax, TRUE
ret
.endif
invoke Process32Next, hSnap, addr PE32
.endw
mov eax, FALSE
Ret
ProcExists EndP
GetPIDbyName proc pName : DWORD
LOCAL hSnap : DWORD
LOCAL pS : PROCESSENTRY32
invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS, 0
mov hSnap, eax
mov pS.dwSize, sizeof pS
invoke Process32First, hSnap, addr pS
.while (eax == TRUE)
invoke lstrcmp, addr pS.szExeFile, pName
.if (eax == 0)
mov eax, [pS.th32ProcessID]
ret
.endif
invoke Process32Next, hSnap, addr pS
.endw
mov eax, 0
ret
GetPIDbyName EndP
SeDebugPrivilege proc
LOCAL hToken : HANDLE
LOCAL tokenPrivs :TOKEN_PRIVILEGES
call GetCurrentProcess
mov ebx, eax
invoke OpenProcessToken, ebx, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, addr hToken
invoke LookupPrivilegeValue,0, lpStr("SeDebugPrivilege"),addr tokenPrivs.Privileges[0].Luid
mov tokenPrivs.PrivilegeCount, 1
mov tokenPrivs.Privileges[0].Attributes, SE_PRIVILEGE_ENABLED
invoke AdjustTokenPrivileges, hToken, FALSE, addr tokenPrivs, sizeof tokenPrivs, NULL, NULL
invoke CloseHandle, hToken
Ret
SeDebugPrivilege EndP
TimeGetYear proc
LOCAL S: SYSTEMTIME
invoke GetLocalTime, addr S
movzx eax, S.wYear
Ret
TimeGetYear EndP
TimeGetMonth proc
LOCAL S: SYSTEMTIME
invoke GetLocalTime, addr S
movzx eax, S.wMonth
Ret
TimeGetMonth EndP
TimeGetWeekDay proc
LOCAL S: SYSTEMTIME
invoke GetLocalTime, addr S
movzx eax, S.wDayOfWeek
Ret
TimeGetWeekDay EndP
TimeGetDay proc
LOCAL S: SYSTEMTIME
invoke GetLocalTime, addr S
movzx eax, S.wDay
Ret
TimeGetDay EndP
TimeGetHour proc
LOCAL S: SYSTEMTIME
invoke GetLocalTime, addr S
movzx eax, S.wHour
Ret
TimeGetHour EndP
TimeGetMinute proc
LOCAL S: SYSTEMTIME
invoke GetLocalTime, addr S
movzx eax, S.wMinute
Ret
TimeGetMinute EndP
TimeGetSecond proc
LOCAL S: SYSTEMTIME
invoke GetLocalTime, addr S
movzx eax, S.wSecond
Ret
TimeGetSecond EndP
TimeGetMillisecond proc
LOCAL S: SYSTEMTIME
invoke GetLocalTime, addr S
movzx eax, S.wMilliseconds
Ret
TimeGetMillisecond EndP
ShowTaskbar proc bBoolean : BOOL
invoke FindWindow, lpStr("Shell_TrayWnd"), NULL
.if (bBoolean == FALSE)
invoke ShowWindow, eax, SW_HIDE
.elseif (bBoolean == TRUE)
invoke ShowWindow, eax, SW_SHOW
.endif
Ret
ShowTaskbar EndP
StrToInt proc lpNumber : DWORD
mov esi, lpNumber
invoke lstrlen, esi
mov ecx, eax
xor edx, edx
xor ebx, ebx
.while (ebx < ecx)
mov al, byte ptr ds:[esi+ebx]
.if (ebx > 0)
imul edx, 10
.endif
sub al, 48
movzx eax, al
add edx, eax
inc ebx
.endw
mov eax, edx
Ret
StrToInt EndP
UpperCase proc lpString : DWORD
LOCAL pText : DWORD
mov esi, lpString
invoke lstrlen, esi
mov ecx, eax
xor edx, edx
xor ebx, ebx
pushad
inc ecx
invoke VirtualAlloc, NULL, ecx, MEM_COMMIT, PAGE_READWRITE
mov pText, eax
popad
.while (ebx < ecx)
mov al, byte ptr ds:[esi+ebx]
.if (al >= 97 && al <= 122)
sub al, 32
.endif
mov edx, pText
mov byte ptr ds:[edx+ebx], al
inc ebx
.endw
mov eax, pText
Ret
UpperCase EndP
SmallerCase proc lpString : DWORD
LOCAL pText : DWORD
mov esi, lpString
invoke lstrlen, esi
mov ecx, eax
xor edx, edx
xor ebx, ebx
pushad
inc ecx
invoke VirtualAlloc, NULL, ecx, MEM_COMMIT, PAGE_READWRITE
mov pText, eax
popad
.while (ebx < ecx)
mov al, byte ptr ds:[esi+ebx]
.if (al >= 65 && al <= 90)
add al, 32
.endif
mov edx, pText
mov byte ptr ds:[edx+ebx], al
inc ebx
.endw
mov eax, pText
Ret
SmallerCase EndP
AsciiToUnicode proc lpString : DWORD
LOCAL pText : DWORD
mov esi, lpString
invoke lstrlen, esi
mov ecx, eax
xor edx, edx
xor ebx, ebx
pushad
imul eax, 2
inc eax
mov ecx, eax
invoke VirtualAlloc, NULL, ecx, MEM_COMMIT, PAGE_READWRITE
mov pText, eax
popad
.while (ebx < ecx)
movzx ax, byte ptr ds:[esi+ebx]
pushad
mov edx, pText
imul ebx, 2
mov word ptr ds:[edx+ebx], ax
popad
inc ebx
.endw
mov eax, pText
Ret
AsciiToUnicode EndP
UnicodeToAscii proc lpString : DWORD
LOCAL pText : DWORD
mov esi, lpString
invoke lstrlenW, lpString
mov ecx, 2
idiv ecx
mov ecx, eax
xor edx, edx
xor ebx, ebx
pushad
inc ecx
invoke VirtualAlloc, NULL, ecx, MEM_COMMIT, PAGE_READWRITE
mov pText, eax
popad
.while (ebx < ecx)
pushad
mov edx, pText
imul ecx, 2
popad
mov al, byte ptr ds:[esi+ebx]
mov byte ptr ds:[edx+ecx], al
inc ecx
.endw
mov eax, pText
Ret
UnicodeToAscii EndP
;____________________________________________________________________________________________________________________________
; MD5hash : hashes a string using the md5 algorithm
; Credits: roy|fleur
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
MD5RESULT STRUCT
dtA dd ?
dtB dd ?
dtC dd ?
dtD dd ?
MD5RESULT ENDS
FF MACRO dta,dtb,dtc,dtd,x,s,t ; a = b + ((a + F(b,c,d) + x + t) << s )
mov eax,dtb
mov ebx,dtc
mov ecx,dtd
and ebx,eax
not eax
and eax,ecx
or eax,ebx
add eax,dta
add eax,x
add eax,t
mov cl,s
rol eax,cl
add eax,dtb
mov dta,eax
ENDM
GG MACRO dta,dtb,dtc,dtd,x,s,t ; a = b + ((a + G(b,c,d) + x + t) << s)
mov eax,dtb
mov ebx,dtc
mov ecx,dtd
; G(x,y,z) = (x and z) or (y and (not z))
and eax,ecx
not ecx
and ecx,ebx
or eax,ecx
add eax,dta
add eax,x
add eax,t
mov cl,s
rol eax,cl
add eax,dtb
mov dta,eax
ENDM
HH MACRO dta,dtb,dtc,dtd,x,s,t ; a = b + ((a + H(b,c,d) + x + t) << s)
mov eax,dtb
mov ebx,dtc
mov ecx,dtd
; H(x,y,z) = x xor y xor z
xor eax,ebx
xor eax,ecx
add eax,dta
add eax,x
add eax,t
mov cl,s
rol eax,cl
add eax,dtb
mov dta,eax
ENDM
II MACRO dta,dtb,dtc,dtd,x,s,t ; a = b + ((a + I(b,c,d) + x + t) << s)
mov eax,dtb
mov ebx,dtc
mov ecx,dtd
; I(x,y,z) = y xor (x or (not z))
not ecx
or eax,ecx
xor eax,ebx
add eax,dta
add eax,x
add eax,t
mov cl,s
rol eax,cl
add eax,dtb
mov dta,eax
ENDM
.code
MD5hash proc uses eax ebx ecx edx edi esi,ptBuffer:dword,dtBufferLength:dword,ptMD5Result:dword
local dta:dword,dtb:dword,dtc:dword,dtd:dword
; phase I · padding
mov edi,ptBuffer
mov eax,dtBufferLength
inc eax
add edi,eax
mov byte ptr [edi-1],080h
xor edx,edx
mov ebx,64
div ebx
neg edx
add edx,64
cmp edx,8
jae @f
add edx,64
@@: mov ecx,edx
xor al,al
rep stosb
mov eax,dtBufferLength
inc edx
add dtBufferLength,edx
xor edx,edx
mov ebx,8
mul ebx
mov dword ptr [edi-8],eax
mov dword ptr [edi-4],edx
mov edx,dtBufferLength
mov edi,ptBuffer
; phase II · chaining variables initialization
mov esi,ptMD5Result
assume esi:ptr MD5RESULT
mov [esi].dtA,067452301h
mov [esi].dtB,0efcdab89h
mov [esi].dtC,098badcfeh
mov [esi].dtD,010325476h
; phase III · hashing
hashloop: mov eax,[esi].dtA
mov dta,eax
mov eax,[esi].dtB
mov dtb,eax
mov eax,[esi].dtC
mov dtc,eax
mov eax,[esi].dtD
mov dtd,eax
; round 1
FF dta,dtb,dtc,dtd,dword ptr [edi+00*4],07,0d76aa478h
FF dtd,dta,dtb,dtc,dword ptr [edi+01*4],12,0e8c7b756h
FF dtc,dtd,dta,dtb,dword ptr [edi+02*4],17,0242070dbh
FF dtb,dtc,dtd,dta,dword ptr [edi+03*4],22,0c1bdceeeh
FF dta,dtb,dtc,dtd,dword ptr [edi+04*4],07,0f57c0fafh
FF dtd,dta,dtb,dtc,dword ptr [edi+05*4],12,04787c62ah
FF dtc,dtd,dta,dtb,dword ptr [edi+06*4],17,0a8304613h
FF dtb,dtc,dtd,dta,dword ptr [edi+07*4],22,0fd469501h
FF dta,dtb,dtc,dtd,dword ptr [edi+08*4],07,0698098d8h
FF dtd,dta,dtb,dtc,dword ptr [edi+09*4],12,08b44f7afh
FF dtc,dtd,dta,dtb,dword ptr [edi+10*4],17,0ffff5bb1h
FF dtb,dtc,dtd,dta,dword ptr [edi+11*4],22,0895cd7beh
FF dta,dtb,dtc,dtd,dword ptr [edi+12*4],07,06b901122h
FF dtd,dta,dtb,dtc,dword ptr [edi+13*4],12,0fd987193h
FF dtc,dtd,dta,dtb,dword ptr [edi+14*4],17,0a679438eh
FF dtb,dtc,dtd,dta,dword ptr [edi+15*4],22,049b40821h
; round 2
GG dta,dtb,dtc,dtd,dword ptr [edi+01*4],05,0f61e2562h
GG dtd,dta,dtb,dtc,dword ptr [edi+06*4],09,0c040b340h
GG dtc,dtd,dta,dtb,dword ptr [edi+11*4],14,0265e5a51h
GG dtb,dtc,dtd,dta,dword ptr [edi+00*4],20,0e9b6c7aah
GG dta,dtb,dtc,dtd,dword ptr [edi+05*4],05,0d62f105dh
GG dtd,dta,dtb,dtc,dword ptr [edi+10*4],09,002441453h
GG dtc,dtd,dta,dtb,dword ptr [edi+15*4],14,0d8a1e681h
GG dtb,dtc,dtd,dta,dword ptr [edi+04*4],20,0e7d3fbc8h
GG dta,dtb,dtc,dtd,dword ptr [edi+09*4],05,021e1cde6h
GG dtd,dta,dtb,dtc,dword ptr [edi+14*4],09,0c33707d6h
GG dtc,dtd,dta,dtb,dword ptr [edi+03*4],14,0f4d50d87h
GG dtb,dtc,dtd,dta,dword ptr [edi+08*4],20,0455a14edh
GG dta,dtb,dtc,dtd,dword ptr [edi+13*4],05,0a9e3e905h
GG dtd,dta,dtb,dtc,dword ptr [edi+02*4],09,0fcefa3f8h
GG dtc,dtd,dta,dtb,dword ptr [edi+07*4],14,0676f02d9h
GG dtb,dtc,dtd,dta,dword ptr [edi+12*4],20,08d2a4c8ah
; round 3
HH dta,dtb,dtc,dtd,dword ptr [edi+05*4],04,0fffa3942h
HH dtd,dta,dtb,dtc,dword ptr [edi+08*4],11,08771f681h
HH dtc,dtd,dta,dtb,dword ptr [edi+11*4],16,06d9d6122h
HH dtb,dtc,dtd,dta,dword ptr [edi+14*4],23,0fde5380ch
HH dta,dtb,dtc,dtd,dword ptr [edi+01*4],04,0a4beea44h
HH dtd,dta,dtb,dtc,dword ptr [edi+04*4],11,04bdecfa9h
HH dtc,dtd,dta,dtb,dword ptr [edi+07*4],16,0f6bb4b60h
HH dtb,dtc,dtd,dta,dword ptr [edi+10*4],23,0bebfbc70h
HH dta,dtb,dtc,dtd,dword ptr [edi+13*4],04,0289b7ec6h
HH dtd,dta,dtb,dtc,dword ptr [edi+00*4],11,0eaa127fah
HH dtc,dtd,dta,dtb,dword ptr [edi+03*4],16,0d4ef3085h
HH dtb,dtc,dtd,dta,dword ptr [edi+06*4],23,004881d05h
HH dta,dtb,dtc,dtd,dword ptr [edi+09*4],04,0d9d4d039h
HH dtd,dta,dtb,dtc,dword ptr [edi+12*4],11,0e6db99e5h
HH dtc,dtd,dta,dtb,dword ptr [edi+15*4],16,01fa27cf8h
HH dtb,dtc,dtd,dta,dword ptr [edi+02*4],23,0c4ac5665h
; round 4
II dta,dtb,dtc,dtd,dword ptr [edi+00*4],06,0f4292244h
II dtd,dta,dtb,dtc,dword ptr [edi+07*4],10,0432aff97h
II dtc,dtd,dta,dtb,dword ptr [edi+14*4],15,0ab9423a7h
II dtb,dtc,dtd,dta,dword ptr [edi+05*4],21,0fc93a039h
II dta,dtb,dtc,dtd,dword ptr [edi+12*4],06,0655b59c3h
II dtd,dta,dtb,dtc,dword ptr [edi+03*4],10,08f0ccc92h
II dtc,dtd,dta,dtb,dword ptr [edi+10*4],15,0ffeff47dh
II dtb,dtc,dtd,dta,dword ptr [edi+01*4],21,085845dd1h
II dta,dtb,dtc,dtd,dword ptr [edi+08*4],06,06fa87e4fh
II dtd,dta,dtb,dtc,dword ptr [edi+15*4],10,0fe2ce6e0h
II dtc,dtd,dta,dtb,dword ptr [edi+06*4],15,0a3014314h
II dtb,dtc,dtd,dta,dword ptr [edi+13*4],21,04e0811a1h
II dta,dtb,dtc,dtd,dword ptr [edi+04*4],06,0f7537e82h
II dtd,dta,dtb,dtc,dword ptr [edi+11*4],10,0bd3af235h
II dtc,dtd,dta,dtb,dword ptr [edi+02*4],15,02ad7d2bbh
II dtb,dtc,dtd,dta,dword ptr [edi+09*4],21,0eb86d391h
mov eax,dta
add [esi].dtA,eax
mov eax,dtb
add [esi].dtB,eax
mov eax,dtc
add [esi].dtC,eax
mov eax,dtd
add [esi].dtD,eax
add edi,64
sub edx,64
jnz hashloop
; phase IV · results
mov ecx,4
@@: mov eax,dword ptr [esi]
xchg al,ah
rol eax,16
xchg al,ah
mov dword ptr [esi],eax
add esi,4
loop @b
ret
MD5hash endp
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment