.data hMsgBox db "你按下了 CTRL + ALT + A",0h uMsg MSG <?> .code main PROC ; 41h = A | 65h=uMsg.wParam invoke RegisterHotKey,NULL,065h,MOD_CONTROL or MOD_ALT,041h .while(TRUE) invoke GetMessage,addr uMsg,NULL,0,0 .if(uMsg.message == WM_HOTKEY) ; 按下按键提示 invoke MessageBox,NULL,addr hMsgBox,addr uMsg.wParam,MB_OK .elseif(uMsg.message == WM_DESTROY) ; 程序结束后关闭热键 invoke UnregisterHotKey,NULL,065h invoke PostQuitMessage,NULL .endif .endw invoke ExitProcess,0 main ENDP END main
最小化指定窗口:
.data FindName db "qq",0h handle dd ? .code main PROC invoke FindWindow,NULL,addr FindName mov handle,eax .if(handle != 0) ; 找到则隐藏窗口 invoke ShowWindow,handle,SW_HIDE .else ; 没有找到则显示 invoke ShowWindow,handle,SW_SHOW .endif invoke ExitProcess,0 main ENDP END main
显示当前目录等:
.data stStartUp STARTUPINFO <?>
.code main PROC invoke GetStartupInfo,addr stStartUp mov eax,stStartUp.lpDesktop mov eax,stStartUp.lpTitle ; 显示当前软件目录 invoke ExitProcess,0 main ENDP END main
取系统版本等:
.data version OSVERSIONINFO <?> lpsystem SYSTEM_INFO <?> .code main PROC invoke GetSystemInfo,addr lpsystem mov ax,lpsystem.wProcessorArchitecture invoke GetVersionEx,addr version mov eax,version.dwBuildNumber invoke ExitProcess,0 main ENDP END main
取命令行参数:
.data cmdline dword ?
.code main PROC invoke GetCommandLine ; 获取命令行参数 mov cmdline,eax invoke ExitProcess,0 main ENDP END main
获取环境变量:
.data szBuffer DB 200 dup(?) ; 保存到缓冲区 szVarName DB "PATH",0h ; 获取set PATH lpVar DD ?
.code main PROC invoke GetEnvironmentVariable,addr szVarName,addr szBuffer,sizeof szBuffer xor eax,eax invoke GetEnvironmentStrings mov lpVar,eax invoke ExitProcess,0 main ENDP END main
设置环境变量:
.data
lpVarName DB "PATH",0h lpValue DB "E:\RadASM\masm32\bin",0h .code main PROC invoke SetEnvironmentVariable,addr lpVarName,addr lpValue invoke ExitProcess,0 main ENDP END main
运行系统软件: 下载并运行一个软件.
include urlmon.inc includelib urlmon.lib
.data szURL DB "https://www.mkdirs.com/lyshark.exe",0h szFileName DB "C:\\lyshark.exe",0h WinRun DB "C:/lyshark.exe",0h .code main proc invoke URLDownloadToFile,NULL,addr szURL,addr szFileName,0,NULL invoke WinExec,offset WinRun,SW_SHOW ret main endp end main
获取本地时间:
.data systime SYSTEMTIME <>
.code main PROC invoke GetLocalTime,addr systime ; 获取当前时间 mov ax,systime.wYear mov bx,systime.wMonth mov cx,systime.wDay invoke SetLocalTime,addr systime ; 设置当前时间 main ENDP END main
获取系统时间:
.data systime SYSTEMTIME <>
.code main PROC invoke GetSystemTime,addr systime mov ax,systime.wYear mov bx,systime.wMonth mov cx,systime.wDay invoke SetSystemTime,addr systime main ENDP END main
获取时间差: eax保存的就是执行代码后的时间差,单位毫秒
.data dwTock DWORD ?
.code main PROC invoke GetTickCount mov dwTock,eax invoke GetTickCount sub eax,dwTock main ENDP END main
## 内存分配函数
◆标准内存管理◆
获取内存状态: GlobalMemourStatus
.data Mem MEMORYSTATUS <> .code main PROC invoke GlobalMemoryStatus,offset Mem mov eax,Mem.dwLength ; 获取结构长度 mov eax,Mem.dwMemoryLoad ; 已用内存百分比 mov eax,Mem.dwTotalPhys ; 物理内存总数 mov eax,Mem.dwAvailPhys ; 可用物理内存 mov eax,Mem.dwTotalPageFile ; 交换文件的总大小 mov eax,Mem.dwAvailPageFile ; 交换文件可用大小 mov eax,Mem.dwTotalVirtual ; 用户可用的地址空间 mov eax,Mem.dwAvailVirtual ; 用户空闲地址空间 invoke ExitProcess,0 main ENDP END main
.code main PROC lea eax,Source ; 源地址 lea ebx,Dest ; 目标地址 invoke RtlMoveMemory,addr Dest,addr Source,40 ;将源地址复制到目标地址,复制40个字节 invoke ExitProcess,0 main ENDP END main
填充内存: 将Memory中的字节数据,全部填充替换为A,或填充为0
.data Memory DB 1,2,3,4,5,6,7,8,9,0 DB 1,2,3,4,5,6,7,8,9,0 DB 1,2,3,4,5,6,7,8,9,0 Fill DB "A",0 .code main PROC lea eax,Memory ; 填充Memory内存,向后填充1024字节,填充为A invoke RtlFillMemory,addr Memory,1024,addr Fill ;填充Memory内存,向后填充1024字节,全部初始化为0 invoke RtlZeroMemory,addr Memory,1024 invoke ExitProcess,0 main ENDP END main
◆堆管理函数◆
创建私有堆: 创建一个1024字节的私有堆,并返回内存地址.
.data HeapMain DWORD ? .code main PROC invoke HeapCreate,HEAP_NO_SERIALIZE,1024,0 ; 保留1024字节物理内存 .if(eax != NULL) mov HeapMain,eax ; 成功分配则返回内存地址 .endif invoke HeapDestroy,HeapMain ; 释放堆空间 invoke ExitProcess,0 main ENDP END main
include windows.inc include user32.inc include kernel32.inc includelib user32.lib includelib kernel32.lib
.data titles DB "box",0h check_ok DB "破解完成.",0h check_err DB "破解失败",0h .code main proc xor eax,eax .if eax invoke MessageBox,NULL,addr check_ok,addr titles,MB_OK .else invoke MessageBox,NULL,addr check_err,addr titles,MB_OK .endif ret main endp end main
读取进程数据: 读取指定的内存地址中的数据,并将其放入ReadBuf缓冲区中.
OEP equ 004198402 ; 读取的范围 .data stStartUp STARTUPINFO <> ; 初始化 stProInfo PROCESS_INFORMATION <> ; 该进程的进程信息 ExeRun DB "C:\\lyshark.exe",0h ; 要打开的进程名称 ReadBuf DD ? ; 读取到的数据内容 .code main proc invoke GetStartupInfo,addr stStartUp invoke CreateProcess,addr ExeRun,NULL,NULL,NULL,NULL,\ NORMAL_PRIORITY_CLASS,0,0,addr stStartUp,addr stProInfo .if(eax) ; 读取当前进程,读取内存地址为OEP,每次读取8个字节,读取到放入ReadBuf invoke ReadProcessMemory,stProInfo.hProcess,OEP,addr ReadBuf,8,NULL lea eax,ReadBuf .endif ret main endp end main
写入进程数据: 写入进程数据,将跳转替换为nop指令的机器码.
OEP equ 004198402 ; 读取的范围 .data stStartUp STARTUPINFO <> ; 初始化 stProInfo PROCESS_INFORMATION <> ; 该进程的进程信息 ExeRun DB "C:\\lyshark.exe",0h ; 要打开的进程名称 lpPatch DB 90h,90h,90h,90h ; 要替换的汇编指令 redPatch DD ? ; 替换完后保存替换结果 .code main proc invoke GetStartupInfo,addr stStartUp invoke CreateProcess,addr ExeRun,NULL,NULL,NULL,NULL,\ NORMAL_PRIORITY_CLASS,0,0,addr stStartUp,addr stProInfo .if(eax) ; 写入当前进程,写入内存地址为OEP,替换8个字节,替换成nop invoke WriteProcessMemory,stProInfo.hProcess,OEP,addr lpPatch,4,NULL .if(eax != 0) ; 如果不等于0则说明补丁替换完成 invoke ReadProcessMemory,stProInfo.hProcess,OEP,addr redPatch,4,NULL lea eax,redPatch ; 将补丁地址取出,并用OD分析,为9090则替换完成. .endif .endif ret main endp end main
main PROC invoke CreateThread,NULL,0,addr _MyThread,NULL,CREATE_SUSPENDED,addr ThreadID .if(eax) mov hThread,eax ; 将线程句柄放入hThread .endif invoke ResumeThread, hThread ; 运行这个线程 ret main ENDP END main
; 在进程中分配空间并将DLL文件名拷贝过去,然后创建一个LoadLibrary线程 invoke VirtualAllocEx,hProcess,NULL,MAX_PATH,MEM_COMMIT,PAGE_READWRITE mov lpDllName,eax invoke WriteProcessMemory,hProcess,eax,offset szMyDllFull,MAX_PATH,NULL invoke CreateRemoteThread,hProcess,NULL,0,lpLoadLibrary,lpDllName,0,NULL ret main endp end main
◆远程线程代码注入◆
注入器: 新建main.asm
.data lpLoadLibrary dd ? lpGetProcAddress dd ? lpGetModuleHandle dd ? dwProcessID dd ? dwThreadID dd ? hProcess dd ? lpRemoteCode dd ? .const ProcHandle db "lyshark.exe",0h KernelBase db "Kernel32.dll",0h szLoadLibrary db "LoadLibraryA",0h szGetProcAddress db "GetProcAddress",0h szGetModuleHandle db "GetModuleHandleA",0h .code include Macro.inc include ShellCode.asm main proc invoke GetModuleHandle,addr KernelBase mov ebx,eax invoke GetProcAddress,ebx,offset szLoadLibrary mov lpLoadLibrary,eax invoke GetProcAddress,ebx,offset szGetProcAddress mov lpGetProcAddress,eax invoke GetProcAddress,ebx,offset szGetModuleHandle mov lpGetModuleHandle,eax
.data? hInstance dd ? uMsg MSG <?> .code main proc invoke installhook invoke GetModuleHandle,NULL mov hInstance,eax .while(TRUE) invoke GetMessage,addr uMsg,NULL,0,0 invoke TranslateMessage,addr uMsg invoke DispatchMessage,addr uMsg .endw invoke uninstallhook ret main endp end main
## 注册表和INI文件
◆注册表相关◆
遍历子键: HKEY_LOCAL_MACHINE中的子键
include msvcrt.inc includelib msvcrt.lib include advapi32.inc includelib advapi32.lib
.data dwIndex dd ? dwSize dd ? szBuffer db 256 dup(?) PrintText db "%s",0ah .code main proc mov dwIndex,0 .while(TRUE) mov dwSize,offset szBuffer invoke RegEnumKeyEx,HKEY_LOCAL_MACHINE,dwIndex,addr szBuffer,addr dwSize, \ NULL,NULL,NULL,NULL .break .if eax == ERROR_NO_MORE_ITEMS invoke crt_printf,addr PrintText,addr szBuffer inc dwIndex .endw ret main endp end main
创建键值:
include advapi32.inc includelib advapi32.lib
.data szKeyPATH db "Software\\Microsoft\\Windows\\CurrentVersion\\Run",0h szValueName db "AutoRun Shell",0h szFileName db MAX_PATH dup(?) .code _RegSetValue proc _lpszKey,_lpszValueName,_lpszValue,_dwValueType,_dwSize LOCAL @hKey invoke RegCreateKey,HKEY_LOCAL_MACHINE,_lpszKey,addr @hKey .if (eax == ERROR_SUCCESS) invoke RegSetValueEx,@hKey,_lpszValueName,NULL,\ _dwValueType,_lpszValue,_dwSize invoke RegCloseKey,@hKey .endif ret _RegSetValue endp
main proc invoke GetModuleFileName,NULL,addr szFileName,MAX_PATH ; 获取文件全路径 inc eax invoke _RegSetValue,addr szKeyPATH,addr szValueName,addr szFileName,REG_SZ,eax ret main endp end main
删除键值:
include advapi32.inc includelib advapi32.lib
.data szKeyPATH db "Software\\Microsoft\\Windows\\CurrentVersion\\Run",0h szValueName db "AutoRun Shell",0h .code _RegDelValue proc _lpszKey,_lpszValueName LOCAL @hKey invoke RegOpenKeyEx,HKEY_LOCAL_MACHINE,_lpszKey,NULL,KEY_WRITE,addr @hKey .if(eax == ERROR_SUCCESS) invoke RegDeleteValue,@hKey,_lpszValueName invoke RegCloseKey,@hKey .endif ret _RegDelValue endp
main proc invoke _RegDelValue,addr szKeyPATH,addr szValueName ret main endp end main
创建子键
include advapi32.inc includelib advapi32.lib
.data lpszKey db "Software\Microsoft\\Windows\\CurrentVersion\\Run\\",0h lpszSubKey db "MySub",0h .code _RegCreateKey proc _lpszKey,_lpszSubKeyName LOCAL @hKey,@hSubkey,@dwDisp invoke RegOpenKeyEx,HKEY_LOCAL_MACHINE,_lpszKey,NULL,KEY_CREATE_SUB_KEY,addr @hKey .if eax == ERROR_SUCCESS invoke RegCreateKeyEx,@hKey,_lpszSubKeyName,NULL,NULL,\ NULL,NULL,NULL,addr @hSubkey,addr @dwDisp invoke RegCloseKey,@hKey invoke RegCloseKey,@hSubkey .endif ret _RegCreateKey endp
main proc invoke _RegCreateKey,addr lpszKey,addr lpszSubKey ret main endp end main
删除子键:
include advapi32.inc includelib advapi32.lib
.data lpszKey db "Software\Microsoft\\Windows\\CurrentVersion\\Run\\",0h lpszSubKey db "MySub",0h .code _RegDelSubKey proc _lpszKey,_lpszSubKeyName LOCAL @hKey invoke RegOpenKeyEx,HKEY_LOCAL_MACHINE,_lpszKey,NULL,KEY_WRITE,addr @hKey .if eax == ERROR_SUCCESS invoke RegDeleteKey,@hKey,_lpszSubKeyName invoke RegCloseKey,@hKey .endif ret _RegDelSubKey endp
main proc invoke _RegDelSubKey,addr lpszKey,addr lpszSubKey ret main endp end main
读取键值:
include advapi32.inc includelib advapi32.lib
.data lpDwSize dd 1024 lpValue db 1024 dup(?) szKeyPATH db "Software\\Microsoft\\Windows\\CurrentVersion\\Run\\",0h szValueName db "IgfxTray",0h .code _RegQueryValue proc _lpszKey,_lpszValueName,_lpszValue,_lpdwSize,_lpdwType LOCAL @hKey,@dwReturn mov @dwReturn,-1 invoke RegOpenKeyEx,HKEY_LOCAL_MACHINE,_lpszKey,NULL,\ KEY_QUERY_VALUE,addr @hKey .if eax == ERROR_SUCCESS invoke RegQueryValueEx,@hKey,_lpszValueName,NULL,_lpdwType,\ _lpszValue,_lpdwSize mov @dwReturn,eax invoke RegCloseKey,@hKey .endif mov eax,@dwReturn ret _RegQueryValue endp
main proc invoke _RegQueryValue,addr szKeyPATH,addr szValueName,addr lpValue,addr lpDwSize,0 lea eax,lpValue ret main endp end main
设置开机自启动:
include advapi32.inc includelib advapi32.lib
.data szhKey dd ? szFileName db MAX_PATH dup(?) ; 获取当前路径 szKeyAutoRun db "Software\\Microsoft\\Windows\\CurrentVersion\\Run",0h ; 写入子键 szValueAutoRun db "AutoRun Shell",0h ; 写入的名称 .code main proc invoke GetModuleFileName,NULL,addr szFileName,MAX_PATH ; 获取文件全路径 invoke RegCreateKey,HKEY_LOCAL_MACHINE,addr szKeyAutoRun,addr szhKey .if(eax == ERROR_SUCCESS) invoke RegSetValueEx,szhKey,addr szValueAutoRun,NULL,REG_SZ, \ addr szFileName,sizeof szFileName .endif ret main endp end main
include msvcrt.inc includelib msvcrt.lib .data szStrlen dd ? szBuffer1 db 20480 dup(?) szININame db ".\Option.ini",0h szFmtSection db "[%s]",0h PrintText db "%s ",0ah .code main proc LOCAL @szBuffer[256]:byte invoke GetPrivateProfileSectionNames,addr szBuffer1,sizeof szBuffer1,addr szININame mov esi,offset szBuffer1 .while byte ptr [esi] invoke wsprintf,addr @szBuffer,addr szFmtSection,esi invoke crt_printf,addr PrintText,esi ; 打印键值 invoke lstrlen,esi add esi,eax inc esi .endw ret main endp end main
遍历键值对
include msvcrt.inc includelib msvcrt.lib .data szStrlen dd ? szBuffer db 2048 dup(?) szININame db ".\Option.ini",0h ; 指定要遍历的文件 szPrintKey db "lyshark",0h ; 指定要遍历的key szFmtSection db "[%s]",0h PrintText db "%s ",0ah .code main proc invoke GetPrivateProfileSection,addr szPrintKey,addr szBuffer,sizeof szBuffer,addr szININame mov edi,offset szBuffer .while byte ptr [edi] invoke crt_printf,addr PrintText,edi ; 打印key invoke lstrlen,edi add edi,eax inc edi .endw invoke lstrlen,esi add esi,eax inc esi ret main endp end main
拼接并打印字符串:
include masm32.inc includelib masm32.lib
.data szBuffer db 2048 dup(?) ; 保存当前路径 szININame db "\Option.ini",0h ; 配置文件路径 .code main proc invoke GetCurrentDirectory,MAX_PATH,addr szBuffer mov esi,offset szBuffer invoke lstrlen,esi mov ecx,offset szININame .if byte ptr [esi+eax-1] == '\' inc ecx .endif invoke lstrcat,esi,ecx invoke StdOut, eax ; 打印拼接后的字符串 ret main endp end main
读取:
.data
szININame db ".\Option.ini",0h ; 指定要遍历的文件 szSecPos db "IniDemo",0h ; 指定要遍历的key szKeyInt db "IntKey",0h ; 要读取的整数字段值 szKeyStr db "StringKey",0h ; 要读取的字符串字段 szBuffer db 2048 dup(?) .code main proc invoke GetPrivateProfileInt,addr szSecPos,addr szKeyInt,50,addr szININame ; 读取整数 invoke GetPrivateProfileString,addr szSecPos,addr szKeyStr,0, \ addr szBuffer,sizeof szBuffer,addr szININame ; 读取字符串 lea eax,szBuffer ret main endp end main
添加/删除键值:
include masm32.inc includelib masm32.lib
.data szBuffer db 2048 dup(?) ; 保存当前路径 szININame db ".\Option.ini",0h ; 配置文件路径 szAppName db "IniDemo",0h ; 字段为IniDemo lpAppKey db "Temp",0h ; 键值对为Temp lpAppStr db "app temp",0h ; 键值对值 lpAppNew db "hello temp",0h ; 新的键值对 .code main proc ; 在IniDemo中添加 Temp=apptemp invoke WritePrivateProfileString,addr szAppName,addr lpAppKey,addr lpAppStr,addr szININame ; 将IniDemo中的Temp=app temp修改为Temp=hello temp invoke WritePrivateProfileString,addr szAppName,addr lpAppKey,addr lpAppNew,addr szININame ; 删除IniDemo中的Temp键值对 invoke WritePrivateProfileString,addr szAppName,addr lpAppKey,NULL,addr szININame ; 清空IniDemo底下的所有键值对 invoke WritePrivateProfileString,addr szAppName,NULL,NULL,addr szININame ret main endp end main
## 通用对话框
设置页面对话框:
include Comdlg32.inc includelib Comdlg32.lib
.code main proc LOCAL @stPS:PAGESETUPDLG invoke RtlZeroMemory,addr @stPS,sizeof @stPS mov @stPS.lStructSize,sizeof @stPS mov @stPS.hwndOwner,0 invoke PageSetupDlg,addr @stPS .if eax && @stPS.hDevMode mov eax,@stPS.hDevMode mov eax,[eax] invoke MessageBox,0,eax,0,MB_OK .endif ret main endp end main
打开对话框:
include Comdlg32.inc includelib Comdlg32.lib
.data szFilter db 'Text Files(*.txt)',0,'*.txt',0,'All Files(*.*)',0,'*.*',0,0 szFileName db MAX_PATH dup (?) .code main proc LOCAL @stOF:OPENFILENAME invoke RtlZeroMemory,addr @stOF,sizeof @stOF mov @stOF.lStructSize,sizeof @stOF mov @stOF.hwndOwner,eax mov @stOF.lpstrFilter,offset szFilter mov @stOF.lpstrFile,offset szFileName mov @stOF.nMaxFile,MAX_PATH mov @stOF.Flags,OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST invoke GetOpenFileName,addr @stOF .if eax invoke MessageBox,NULL,addr szFileName,0,MB_OK .endif ret main endp end main
保存对话框:
include Comdlg32.inc includelib Comdlg32.lib
.data szFilter db 'Text Files(*.txt)',0,'*.txt',0,'All Files(*.*)',0,'*.*',0,0 szFileName db MAX_PATH dup (?) szDefExt db 'txt',0 szSaveCaption db '请输入保存的文件名',0 .code main proc LOCAL @stOF:OPENFILENAME invoke RtlZeroMemory,addr @stOF,sizeof @stOF mov @stOF.lStructSize,sizeof @stOF mov @stOF.hwndOwner,0 mov @stOF.lpstrFilter,offset szFilter mov @stOF.lpstrFile,offset szFileName mov @stOF.nMaxFile,MAX_PATH mov @stOF.Flags,OFN_PATHMUSTEXIST mov @stOF.lpstrDefExt,offset szDefExt mov @stOF.lpstrTitle,offset szSaveCaption invoke GetSaveFileName,addr @stOF .if eax invoke MessageBox,NULL,addr szFileName,0,MB_OK .endif ret main endp end main
选择颜色:
include Comdlg32.inc includelib Comdlg32.lib
.data dwBackColor dd ? dwCustColors dd 16 dup (?) szBuffer db 1024 dup (?) szFormatColor db "您选择的颜色值:%08x",0 .code main proc LOCAL @stCC:CHOOSECOLOR invoke RtlZeroMemory,addr @stCC,sizeof @stCC mov @stCC.lStructSize,sizeof @stCC mov @stCC.hwndOwner,0 push dwBackColor pop @stCC.rgbResult mov @stCC.Flags,CC_RGBINIT or CC_FULLOPEN mov @stCC.lpCustColors,offset dwCustColors invoke ChooseColor,addr @stCC .if eax push @stCC.rgbResult pop dwBackColor invoke wsprintf,addr szBuffer,addr szFormatColor,dwBackColor invoke MessageBox,NULL,addr szBuffer,0,MB_OK .endif ret main endp end main
选择字体:
include Comdlg32.inc includelib Comdlg32.lib
.data stLogFont LOGFONT <?> dwFontColor dd ? szBuffer db 1024 dup (?) szFormatFont db '字体名称:%s',0dh,0ah .code main proc LOCAL @stCF:CHOOSEFONT invoke RtlZeroMemory,addr @stCF,sizeof @stCF mov @stCF.lStructSize,sizeof @stCF mov @stCF.hwndOwner,0 mov @stCF.lpLogFont,offset stLogFont push dwFontColor pop @stCF.rgbColors mov @stCF.Flags,CF_SCREENFONTS or CF_INITTOLOGFONTSTRUCT or CF_EFFECTS invoke ChooseFont,addr @stCF .if eax push @stCF.rgbColors pop dwFontColor invoke wsprintf,addr szBuffer,addr szFormatFont,addr stLogFont.lfFaceName,\ dwFontColor,@stCF.iPointSize invoke MessageBox,NULL,addr szBuffer,0,MB_OK .endif ret main endp end main
## 网络相关函数
服务端:
import socket
ip_addr=("127.0.0.1",6666)
server = socket.socket() server.bind(ip_addr) server.listen(5)