SamForum.org  
SamLab.ws
Заблокированные пользователи

Вернуться   SamForum.org > Программирование > Assembler
Важная информация

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый Добавлено: 28.10.2011, 01:37
  (#41)
semiono
Осваивается
Пользователь
 
Аватар для semiono

По умолчанию

Это у меня направление такое
Я в ассемблере ни бумбум, но мне нравиться возможность скампилировать чтонибудь,
за что встречаю непонимание на низкоуровневых форумах )))

Работаем с cmd.exe:
Код:
include '%fasm%/win64ax.inc'
section '.code' executable
start:
        sub rsp,8

        invoke ExpandEnvironmentStrings,\
               '/c attrib -r -s -h "%ProgramFiles%\New Folder\*.*" && del /f /q "%ProgramFiles%\New Folder\*.*"',args,MAX_PATH
        invoke ShellExecute,NULL,NULL,'cmd.exe',args,NULL,SW_HIDE
exit:
        invoke ExitProcess,NULL

section '.data' readable writeable

        args rd MAX_PATH

section '.idata' import readable

        library kernel32,'KERNEL32.DLL',shell32,'SHELL32.DLL'
        include '%fasm%/api/kernel32.inc'
        include '%fasm%/api/shell32.inc'
В чём прелесть fasm, то что у него нету границ

У меня два любимых инструмента, это Fasm и InnoSetup, хотя иногда приходится обращаться к AutoIt3.

Добавлено через 59 минут
-------~--------
Код:
include '%fasm%/win64ax.inc'
section '.code' executable
start:
        sub rsp,8

        mov [lpFileOp.wFunc],FO_DELETE
        mov [lpFileOp.fFlags],FOF_SILENT + FOF_NOCONFIRMATION
        invoke ExpandEnvironmentStrings,'%ProgramFiles%\New Folder\*',args,MAX_PATH
        mov [lpFileOp.pFrom],args
        invoke SHFileOperation,lpFileOp
exit:
        invoke ExitProcess,NULL

        FO_DELETE = 0x0003
        FOF_SILENT = 0x0004
        FOF_NOCONFIRMATION = 0x0010

section '.data' readable writeable

        args rd MAX_PATH

struct LPSHFILEOPSTRUCT

        hwnd dq NULL
        wFunc dq NULL
        pFrom dq NULL
        pTo dq NULL
        fFlags dq NULL
        fAnyOperationsAborted dq NULL
        hNameMappings dq NULL
        lpszProgressTitle dq NULL
ends
        lpFileOp LPSHFILEOPSTRUCT

section '.idata' import readable

        library kernel32,'KERNEL32.DLL',shell32,'SHELL32.DLL'
        include '%fasm%/api/kernel32.inc'
        include '%fasm%/api/shell32.inc'
Удаляет рекурсивно не взирая на аттрибуты папки и файлы с пробелами в именах!
Маски, кстати, работают: New Text Document????.txt


RunDll32.DLL

Последний раз редактировалось semiono; 28.10.2011 в 03:59..
semiono вне форума Отправить личное сообщение для semiono
Вверх
Ответить с цитированием
Старый Добавлено: 28.10.2011, 05:34
  (#42)
semiono
Осваивается
Пользователь
 
Аватар для semiono

По умолчанию

батник:
Код:
@echo include '%%fasm%%/win64ax.inc'> c:\tmp.asm
@echo sub rsp,8h>> c:\tmp.asm
@echo invoke ShellExecute,NULL,NULL,'rundll32.exe',\>> c:\tmp.asm
@echo 'shell32.dll,Control_RunDLL sysdm.cpl,,0',NULL,SW_HIDE>> c:\tmp.asm
@echo invoke ExitProcess,NULL>> c:\tmp.asm
@echo section '.idata' import readable>> c:\tmp.asm
@echo library kernel32,'kernel32.dll',shell32,'shell32.dll'>> c:\tmp.asm
@echo include '%%fasm%%/api/kernel32.inc'>> c:\tmp.asm
@echo include '%%fasm%%/api/shell32.inc'>> c:\tmp.asm
@%WinDir%\system32\fasm.exe c:\tmp.asm
@c:\tmp.exe
@del /f /q c:\tmp.asm
@del /f /q c:\tmp.exe


RunDll32.DLL
semiono вне форума Отправить личное сообщение для semiono
Вверх
Ответить с цитированием
Старый Добавлено: 01.11.2011, 02:38
  (#43)
semiono
Осваивается
Пользователь
 
Аватар для semiono

По умолчанию

Макрос для пакетной регистрации AX/DLL:
Код:
; ..
        invoke ExpandEnvironmentStrings,'%ProgramFiles%\Videodeluxe\RegModule',RegModule
        invoke SetDllDirectory,RegModule

macro reg c {

        invoke LoadLibrary,c
        mov rbx,rax
        invoke GetProcAddress,rbx,'DllRegisterServer'
        mov qword [regsvr],rax
        invoke regsvr
        invoke FreeLibrary,rbx
        }

        reg 'AudioVis.dll'
        reg 'GPUInterop.dll'
        reg 'MCMultifileWriter.dll'
        reg 'Mx3d_GPUInterop.dll'
        reg 'MXAVIREADER.dll'
        reg 'MXCaptureEngine.dll'
        reg 'mxdsread.dll'
        reg 'mxinprocwrapper.dll'
        reg 'MXMPEG2.dll'
        reg 'MXVisuals.dll'
;..

section '.data' readable writeable

        RegModule rd MAX_PATH
        regsvr rq MAX_PATH

section '.idata' import readable

        library kernel32,'KERNEL32.DLL'
        include '%fasm%/api/kernel32.inc'


RunDll32.DLL
semiono вне форума Отправить личное сообщение для semiono
Вверх
Ответить с цитированием
Старый Добавлено: 01.11.2011, 04:52
  (#44)
semiono
Осваивается
Пользователь
 
Аватар для semiono

По умолчанию

Код:
include '%fasm%/win64ax.inc'
section '.code' executable
start:
        sub rsp,8

        invoke ExpandEnvironmentStrings,'%SystemRoot%\*.exe',expr,MAX_PATH
        invoke FindFirstFile,expr,find
        mov [root],eax
@@:
        invoke FindNextFile,[root],find
        cmp eax,NULL
        je exit
        invoke MessageBox,NULL,find.cFileName,'',MB_OK
        jmp @r
exit:
        invoke FindClose,[root]
        invoke ExitProcess,NULL

section '.data' readable writeable

        expr dd NULL
        root dd NULL

        find WIN32_FIND_DATA

section '.idata' import readable

        library kernel32,'KERNEL32.DLL',user32,'USER32.DLL'
        include '%fasm%/api/kernel32.inc'
        include '%fasm%/api/user32.inc'

section '.rsrc' resource readable

        directory RT_MANIFEST,_manifest
        resource _manifest,1,LANG_NEUTRAL,manifest
        resdata manifest
        db '<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> '
        db '<dependency> <dependentAssembly> '
        db '<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" '
        db 'processorArchitecture="amd64" publicKeyToken="6595b64144ccf1df" language="*"/> '
        db '</dependentAssembly> </dependency> </assembly>'
        endres
Поиск файлов по маске. Структура WIN32_FIND_DATA определена в fasm,
поэтому труда поменьше. Если не работает, то секцию '.rsrc' можно убрать!


RunDll32.DLL
semiono вне форума Отправить личное сообщение для semiono
Вверх
Ответить с цитированием
Старый Добавлено: 03.11.2011, 05:59
  (#45)
semiono
Осваивается
Пользователь
 
Аватар для semiono

По умолчанию

Код:
include '%fasm%/win64ax.inc'
section '.code' executable
start:
        sub rsp,8

macro msg CSIDL

        { invoke SHGetSpecialFolderPath,NULL,root,CSIDL,NULL
        invoke MessageBox,NULL,root,'',MB_OK }

        msg CSIDL_LOCAL_APPDATA
        msg CSIDL_APPDATA
        msg CSIDL_COMMON_APPDATA
        ; итд.
exit:
        invoke ExitProcess,NULL

section '.data' readable writeable

        root rd MAX_PATH

section '.idata' import readable

        library kernel32,'KERNEL32.DLL',shell32,'SHELL32.DLL',user32,'USER32.DLL'
        include '%fasm%/api/kernel32.inc'
        include '%fasm%/api/shell32.inc'
        include '%fasm%/api/user32.inc'
Макросы упрощают чтение и делают код читабельным )


RunDll32.DLL

Последний раз редактировалось semiono; 03.11.2011 в 06:03..
semiono вне форума Отправить личное сообщение для semiono
Вверх
Ответить с цитированием
Старый Добавлено: 04.11.2011, 23:41
  (#46)
semiono
Осваивается
Пользователь
 
Аватар для semiono

По умолчанию

Код:
include '%fasm%/win64ax.inc'
section '.code' executable
start:
        invoke ExpandEnvironmentStrings,'%ProgramFiles%\Videodeluxe\_msi_keyfile_*',open,MAX_PATH
        invoke ExpandEnvironmentStrings,'%ProgramFiles%\Videodeluxe\',temp,MAX_PATH

        invoke FindFirstFile,open,find
        mov [root],eax
        invoke lstrcat,temp,find.cFileName
        invoke SetFileAttributes,temp,FILE_ATTRIBUTE_NORMAL
        invoke DeleteFile,temp
        cmp eax,NULL
        jnz start
exit:
        invoke FindClose,[root]
        invoke ExitProcess,NULL

        FILE_ATTRIBUTE_NORMAL = 128

section '.data' readable writeable

        open rd MAX_PATH
        temp rd MAX_PATH
        root dd NULL

        find WIN32_FIND_DATA

section '.idata' import readable

        library kernel32,'KERNEL32.DLL'
        include '%fasm%/api/kernel32.inc'
Не знаю насколько это правильно, но работает.


RunDll32.DLL
semiono вне форума Отправить личное сообщение для semiono
Вверх
Ответить с цитированием
Старый Добавлено: 05.11.2011, 02:42
  (#47)
semiono
Осваивается
Пользователь
 
Аватар для semiono

По умолчанию

Код:
include '%fasm%/win64ax.inc'
section '.code' executable
start:
        sub,rsp,8

        invoke ExpandEnvironmentStrings,'cmd.exe /c del /f /s /q /a rsh "%ProgramFiles%\Videodeluxe\_msi_keyfile_*"',args,MAX_PATH
        invoke WinExec,args,SW_HIDE
exit:
        invoke ExitProcess,NULL

section '.data' readable writeable

        args rd MAX_PATH

section '.idata' import readable

        library kernel32,'KERNEL32.DLL'
        include '%fasm%/api/kernel32.inc'


RunDll32.DLL

Последний раз редактировалось semiono; 05.11.2011 в 03:10..
semiono вне форума Отправить личное сообщение для semiono
Вверх
Ответить с цитированием
Старый Добавлено: 05.11.2011, 11:13
  (#48)
virtuOS
Модератор
Модератор
 
Аватар для virtuOS

По умолчанию

Цитата:
Сообщение от semiono Посмотреть сообщение
Не знаю насколько это правильно, но работает.

Затрону только одну сторону кода, самую простую -
Код:
invoke ExpandEnvironmentStrings,'%ProgramFiles%\Videodeluxe\_msi_keyfile_*',open,MAX_PATH
Брать значения пути через переменные окружения в определенных случаях считается дурным тоном. Во-первых, никто не мешает пользователю переопределить их с помощью, например, командной строки. Во-вторых, это небезопасно, особенно если будете использовать переменную %Temp%.
Правильно будет брать эти переменные из реестра. Это сложнее в части программирования, зато исключены ошибки.
Правильно пути читать из разделов:
Код:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders


"Умом Россию не понять, аршином общим не измерить: у ней особенная стать - в Россию можно только верить."©
Волхвы не боятся могучих владык, а княжеский дар им не нужен; правдив и свободен их вещий язык и с волей небесною дружен. Грядущие годы таятся во мгле; но вижу твой жребий на светлом челе. ©
virtuOS вне форума Отправить личное сообщение для virtuOS
Вверх
Ответить с цитированием
Этот пользователь сказал cпасибо за это полезное сообщение:
semiono (08.11.2011)
Старый Добавлено: 08.11.2011, 07:59
  (#49)
semiono
Осваивается
Пользователь
 
Аватар для semiono

По умолчанию

virtuOS, может быть через это: SHGetSpecialFolderPath() код был выше. Справедливое замечание, спасибо!
Я обычно собираю свою ось, поэтому как бы уверен в переменных окружения, но для чужой системы лучше подстраховаться.

Добавлено через 3 минуты
Код:
include '%fasm%/win64ax.inc'
section '.code' executable
start:
        sub rsp,8

        invoke WinExec,'notepad.exe',SW_SHOW
        invoke keybd_event,0x41,NULL,NULL,NULL
        invoke keybd_event,0x42,NULL,NULL,NULL
        invoke keybd_event,0x43,NULL,NULL,NULL
        invoke keybd_event,0x44,NULL,NULL,NULL
        invoke keybd_event,0x45,NULL,NULL,NULL
        invoke keybd_event,0x46,NULL,NULL,NULL
        invoke keybd_event,0x47,NULL,NULL,NULL
        invoke keybd_event,0x48,NULL,NULL,NULL
        invoke keybd_event,0x49,NULL,NULL,NULL
        invoke keybd_event,0x4a,NULL,NULL,NULL
        invoke keybd_event,0x4b,NULL,NULL,NULL
        invoke keybd_event,0x4c,NULL,NULL,NULL
        invoke keybd_event,0x4d,NULL,NULL,NULL
        invoke keybd_event,0x4e,NULL,NULL,NULL
        invoke keybd_event,0x4f,NULL,NULL,NULL
        invoke keybd_event,0x50,NULL,NULL,NULL
        invoke keybd_event,0x51,NULL,NULL,NULL
        invoke keybd_event,0x52,NULL,NULL,NULL
        invoke keybd_event,0x53,NULL,NULL,NULL
        invoke keybd_event,0x54,NULL,NULL,NULL
        invoke keybd_event,0x55,NULL,NULL,NULL
        invoke keybd_event,0x56,NULL,NULL,NULL
        invoke keybd_event,0x57,NULL,NULL,NULL
        invoke keybd_event,0x58,NULL,NULL,NULL
        invoke keybd_event,0x59,NULL,NULL,NULL
        invoke keybd_event,0x5a,NULL,NULL,NULL
exit:
        invoke ExitProcess,NULL

section '.idata' import readable

        library kernel32,'KERNEL32.DLL',user32,'USER32.DLL'
        include '%fasm%/api/kernel32.inc'
        include '%fasm%/api/user32.inc'
Добрался я до keybd_event, приятная функция! Всё легко нажимает,
Майкрософт рекомендует SendInput, но там в структурах легко запутаться.

Можно запросто подставить VK_SNAPSHOT для снимка экрана

Добавлено через 17 минут
virtuOS, вообще-то я поспорю. Например, ProgramFiles можно брать только отсюда:
[HKLM\Software\Microsoft\Windows\CurrentVersion]
"CommonFilesDir"=
"CommonFilesDir (x86)"=
а это итак возвращается ExpandEnvironmentStrings
Папка Temp пишется сюда: (для всей машины)
[HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment]
"TEMP"=
"TMP"=
И опять же вернётся через апи.
Просто в 64-битной системе если 32-битное приложение вызовет ExpandEnvironmentStrings,
то в ответ получит данные из HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node, что может
быть порой неожиданным.

При кодировании в (x64) для себя я уяснил, что надо следить всегда за Wow6432Node
и за папками system32, SysWOW64 и для shell32 функций добавлять sub rsp,8 инструкцию.
Ну ещё некоторые данные расширять до QWORD dq правда для этого могут понадобиться
регистры типа rax, rbx, r15 итп.

Добавлено через 21 минуту
%ProgramFiles%\Videodeluxe\_msi_keyfile_*
Это, кстати, часть моего инсталятора, над которым я бюсь.
Сделал как бы внешний скрипт который управляет установкой msi,
но самым сложным оказалось создать ярлык к приложению на асме:
invoke CoCreateInstance,CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,IID_IShellLinkW,ISLink
это не для слабых
Теперь из юникода не могу выбраться, это даже хуже x64, без win32wx.inc не хочет получаться

Добавлено через 19 минут
Вот ещё одна програмка с вводом
Код:
include '%fasm%/win64ax.inc'
section '.code' executable
start:
        sub rsp,8

        invoke WinExec,'calc.exe',SW_SHOW

        mov ebx,15
@@:
        invoke FindWindow,'SciCalc',NULL
        mov [root],eax
        test eax,eax
        jnz @f
        dec ebx
        jz exit
        invoke Sleep,500
        jmp @r
@@:
        invoke SendMessageA,[root],WM_SETTEXT,NULL,'calc.exe...'
        invoke Sleep,5000
        invoke SendMessageA,[root],WM_CLOSE
exit:
        invoke ExitProcess,NULL

section '.data' readable writeable

        root rd MAX_PATH

section '.idata' import readable

        library kernel32,'KERNEL32.DLL',user32,'USER32.DLL'
        include '%fasm%/api/kernel32.inc'
        include '%fasm%/api/user32.inc'


RunDll32.DLL

Последний раз редактировалось semiono; 08.11.2011 в 07:45..
semiono вне форума Отправить личное сообщение для semiono
Вверх
Ответить с цитированием
Старый Добавлено: 12.11.2011, 05:27
  (#50)
semiono
Осваивается
Пользователь
 
Аватар для semiono

По умолчанию

Код:
include '%fasm%/win64ax.inc'
include '%fasm%/equates/ole32.inc'
section '.code' executable
start:
        sub rsp,8

        invoke RtlZeroMemory,x,MAX_PATH
        invoke RtlZeroMemory,y,MAX_PATH
        invoke RtlZeroMemory,z,MAX_PATH
        invoke SHGetSpecialFolderPath,NULL,x,CSIDL_APPDATA,NULL
        invoke SHGetSpecialFolderPath,NULL,y,CSIDL_APPDATA,NULL
        invoke lstrcat,x,'\MAGIX\Movie_Edit_Pro_MX_Premium_Download_Version'
        invoke lstrcat,y,'\MAGIX\Movie_Edit_Pro_MX_Premium_Download_Version\Videodeluxe.ini'
        invoke MultiByteToWideChar,CP_ACP,NULL,x,-1,z,MAX_PATH
        invoke SHCreateDirectory,NULL,z
        invoke WritePrivateProfileString,'Hidden Dialogs','0x0b17','1',y
exit:
        invoke ExitProcess,NULL

section '.data' readable writeable

        x rd MAX_PATH
        y rd MAX_PATH
        z rd MAX_PATH

section '.idata' import readable

        library kernel32,'KERNEL32.DLL',shell32,'SHELL32.DLL'
        import kernel32,\
               ExitProcess,'ExitProcess',lstrcat,'lstrcatA',MultiByteToWideChar,'MultiByteToWideChar',\
               RtlZeroMemory,'RtlZeroMemory',WritePrivateProfileString,'WritePrivateProfileStringA'
        import shell32,\
               SHCreateDirectory,'SHCreateDirectory',SHGetSpecialFolderPath,'SHGetSpecialFolderPathA'
Этот "скрипт" создаёт файл:
Код:
%AppData%
\MAGIX
\Movie_Edit_Pro_MX_Premium_Download_Version
\Videodeluxe.ini
и пишет в него:
Код:
[Hidden Dialogs]
0x0b17=1
Папки и файл создаются если они не существуют.

RtlZeroMemory - очищает содержимое переменной, это очень удобно для повторного использования
одних и тех же переменных многократно.
SHGetSpecialFolderPath - функция полезна тем, что указывает относительные пути к папкам,
которые могут содержать кириллицу, поэтому нецелесообразно их указать дописав путь к %UserProfile%
Однако функция SHCreateDirectory требует юникод, поэтому мы конвертируем строку
этой функой: MultiByteToWideChar.


RunDll32.DLL

Последний раз редактировалось semiono; 12.11.2011 в 05:30..
semiono вне форума Отправить личное сообщение для semiono
Вверх
Ответить с цитированием
Старый Добавлено: 21.11.2011, 08:10
  (#51)
semiono
Осваивается
Пользователь
 
Аватар для semiono

По умолчанию

Код:
include '%fasm%/win64ax.inc'
section '.code' executable
start:
        sub rsp,8

        invoke ExpandEnvironmentStrings,'%ProgramFiles%\!2345',a,MAX_PATH
        invoke CreateDirectory,a,NULL
        cmp eax,NULL
        je exit
        invoke SetFileAttributes,a,FILE_ATTRIBUTE_READONLY
        invoke lstrcat,a,'\desktop.ini'
        invoke WritePrivateProfileString,'.ShellClassInfo','InfoTip','Embedded',a
        invoke WritePrivateProfileString,'.ShellClassInfo','IconFile',\
               '%SystemRoot%\system32\shell32.dll',a
        invoke WritePrivateProfileString,'.ShellClassInfo','IconIndex','-239',a
        invoke MessageBox,NULL,'Success!','',MB_OK
exit:
        invoke ExitProcess,NULL

        FILE_ATTRIBUTE_READONLY = 1

section '.data' readable writeable

        a rb MAX_PATH

section '.idata' import readable

        library advapi32,'ADVAPI32.DLL',kernel32,'KERNEL32.DLL',\
                shell32,'SHELL32.DLL',user32,'USER32.DLL'
        include '%fasm%/api/advapi32.inc'
        include '%fasm%/api/kernel32.inc'
        include '%fasm%/api/shell32.inc'
        include '%fasm%/api/user32.inc'
Создать папку или выйти.
Здесь проверяется наличие папки, можно, например, обойти процедуру копирования файлов, если они уже оказались там.


RunDll32.DLL

Последний раз редактировалось semiono; 21.11.2011 в 08:15..
semiono вне форума Отправить личное сообщение для semiono
Вверх
Ответить с цитированием
Старый Добавлено: 07.12.2011, 20:10
  (#52)
semiono
Осваивается
Пользователь
 
Аватар для semiono

По умолчанию

Код:
include '%fasm%/win64ax.inc'
section '.code' executable
start:
        invoke RegQueryValue,HKEY_LOCAL_MACHINE,\
        'Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{341CF6D3-A072-4CBC-AE86-FBF94872ABD5}',NULL,MAX_PATH
        cmp eax,ERROR_SUCCESS
        jz exit
        invoke MessageBox,NULL,'','',MB_OK
exit:
        invoke ExitProcess,NULL

        ERROR_SUCCESS = NULL

section '.idata' import readable

        library advapi32,'ADVAPI32.DLL',kernel32,'KERNEL32.DLL',user32,'USER32.DLL'
        include '%fasm%/api/advapi32.inc'
        include '%fasm%/api/kernel32.inc'
        include '%fasm%/api/user32.inc'
Проверка установки программы...


RunDll32.DLL
semiono вне форума Отправить личное сообщение для semiono
Вверх
Ответить с цитированием
Старый Добавлено: 18.12.2011, 01:16
  (#53)
semiono
Осваивается
Пользователь
 
Аватар для semiono

По умолчанию

Код:
include '%fasm%/win64ax.inc'
section '.code' executable
start:
        invoke GetSystemMetrics,SM_CXSCREEN
        mov [x],rax

        invoke GetSystemMetrics,SM_CYSCREEN
        invoke wsprintf,a,'Software\Image-Line\FL Studio 10\Windows\%dx%d\Toolbars\OnlineToolBar',[x],rax

        invoke RegCreateKeyEx,HKEY_CURRENT_USER,a,\
               NULL,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL,b,NULL
        invoke RegSetValueEx,[b],'Visible',NULL,REG_SZ,'0',1
        invoke RegCloseKey,[b]

        invoke SHDeleteKey,HKEY_LOCAL_MACHINE,'Software\Wow6432Node\Image-Line'
exit:
        invoke ExitProcess,NULL

section '.data' readable writeable

        a rq MAX_PATH
        b rq MAX_PATH
        x rq MAX_PATH
        y rq MAX_PATH

section '.idata' import readable

        library advapi32,'ADVAPI32.DLL',kernel32,'KERNEL32.DLL',\
                user32,'USER32.DLL',shlwapi,'SHLWAPI.DLL'
        include '%fasm%/api/advapi32.inc'
        include '%fasm%/api/kernel32.inc'
        include '%fasm%/api/user32.inc'
        import shlwapi,SHDeleteKey,'SHDeleteKeyA'
Здесь создаётся SubKey реестра с параметрами экрана /Windows/1280x1024/Toolbars..

...и хорошая функция 'SHDeleteKeyA' из shlwapi.dll - вместо:
RegDeleteTree
{Minimum supported client Windows Vista}

rb
reserve dword/qword - чем больше тем лучше


RunDll32.DLL

Последний раз редактировалось semiono; 18.12.2011 в 01:21..
semiono вне форума Отправить личное сообщение для semiono
Вверх
Ответить с цитированием
Старый Добавлено: 22.03.2012, 00:54
  (#54)
semiono
Осваивается
Пользователь
 
Аватар для semiono

По умолчанию

В InnoSetup молчаливый выбор папки выглядит так:
Код:
[Registry]

Root: HKCU; Subkey: "Software\Image-Line\FL Studio 10\General"; ValueType: string; ValueName: "VST Plugins"; ValueData: "{reg:HKLM32\Software\VST,VSTPluginsPath|{win}\Plugins}\"; Flags: noerror; Permissions: everyone-full
Делаем это на ассемблере:
Код:
include '%fasm%/win64ax.inc'
section '.code' executable
start:
        sub rsp,8

        invoke SHRegGetPath,HKEY_LOCAL_MACHINE,'Software\Wow6432Node\VST','VSTPluginsPath',a,NULL
        cmp eax,NULL
        je @f

        invoke SHGetSpecialFolderPath,NULL,a,CSIDL_WINDOWS,NULL
        invoke lstrcat,a,'\Plugins'
@@:
        invoke lstrlen,a
        invoke SHSetValue,HKEY_CURRENT_USER,'Software\Image-Line\FL Studio 10\General','VST Plugins',REG_SZ,a,eax
exit:
        invoke ExitProcess,NULL

section '.data' readable writeable

        a rd MAX_PATH

section '.idata' import readable

        library kernel32,'KERNEL32.DLL',shlwapi,'SHLWAPI.DLL'
        include '%fasm%/api/kernel32.inc'
        import shlwapi,SHDeleteKey,'SHDeleteKeyA',SHRegGetPath,'SHRegGetPathA',SHSetValue,'SHSetValueA'
Здесь собраны функции библиотеки SHLWAPI.DLL, которые очень удобны для работы с реестром.


RunDll32.DLL

Последний раз редактировалось semiono; 22.03.2012 в 01:00..
semiono вне форума Отправить личное сообщение для semiono
Вверх
Ответить с цитированием
Старый Добавлено: 23.03.2012, 04:45
  (#55)
semiono
Осваивается
Пользователь
 
Аватар для semiono

По умолчанию

Код:
include '%fasm%/win64ax.inc'
section '.code' executable
start:
        sub rsp,8

        invoke SHGetSpecialFolderPath,NULL,a,CSIDL_PROGRAM_FILES,NULL
        invoke lstrcat,a,'\zero'
        invoke GetFileAttributes,a
        cmp eax,FILE_ATTRIBUTE_DIRECTORY
        jne exit

        mov [lpFileOp.wFunc],FO_DELETE
        mov [lpFileOp.pFrom],a
        mov [lpFileOp.fFlags],FOF_SILENT + FOF_NOCONFIRMATION
@@:
        invoke SHFileOperation,lpFileOp
        cmp eax,NULL
        je exit
        jmp @r
exit:
        invoke ExitProcess,NULL

        FO_DELETE = 3
        FOF_SILENT = 4
        FOF_NOCONFIRMATION = 10h

section '.data' readable writeable

        a rb MAX_PATH

struct SHFILEOPSTRUCT

        hwnd dq NULL
        wFunc dq NULL
        pFrom dq NULL
        pTo dq NULL
        fFlags dq NULL
        fAnyOperationsAborted dq NULL
        hNameMappings dq NULL
        lpszProgressTitle dq NULL
ends
        lpFileOp SHFILEOPSTRUCT

section '.idata' import readable

        library kernel32,'KERNEL32.DLL',shell32,'SHELL32.DLL'
        include '%fasm%/api/kernel32.inc'
        include '%fasm%/api/shell32.inc'
Допустим, нужно удалить папку, но предварительно поместим в неё New.txt
и откроем в блокноте. Програма всёравно удалит папку при закрытии процесса.
Такие задержки могут быть полезными при больших тяжёлых нагрузках на файловую систему.


RunDll32.DLL
semiono вне форума Отправить личное сообщение для semiono
Вверх
Ответить с цитированием
Старый Добавлено: 04.12.2013, 16:18
  (#56)
elch
Пользователь
Пользователь
 
Аватар для elch

По умолчанию

Чёто тема совсем заглохла.( Однако рискну здесь спросить, а то не понял, где на оффоруме подобные вопросы задавать.
В masm32 есть удобная функа exist, которой можно проверять наличие/отсутствие какого-либо файла. Рипнул её через дизассемблер, интересует всё ли правильно сделано, может чего подправить/улучшить/сократить? В смысле, функция не слишком индусская получилась? Вот исходник тестового exe с данной функой:
Код:
format PE GUI 4.00
entry start

include '%fasminc%\win32a.inc'

section '.code' code readable executable

start:
  push    szFile
  call    ExistProc
  cmp     eax, 0
  jz      @f
  invoke  MessageBox, 0, szYes, szFile, MB_ICONEXCLAMATION+MB_TOPMOST
  jmp     .exit
@@:
  invoke  MessageBox, 0, szNo, szFile, MB_ICONERROR+MB_TOPMOST
.exit:
  invoke  ExitProcess, 0

proc ExistProc

  push    ebp
  mov     ebp, esp
  add     esp, 0FFFFFEC0h
  lea     eax, [ebp-13Eh]
  push    eax
  push    dword ptr ebp+8
  call    [FindFirstFile]
  cmp     eax, 0FFFFFFFFh
  jnz     @f
  mov     eax, 0
  jmp     .endp
@@:
  push    eax
  call    [FindClose]
  mov     eax, 1
.endp:
  leave
  ret

endp

section '.data' data readable writeable

  szFile  db 'sample.ini',0
  szYes   db 'Yes',0
  szNo    db 'No',0

section '.idata' import data readable writeable

  library kernel32,'KERNEL32.DLL',\
          user32,'USER32.DLL'

  include '%fasminc%\apia\kernel32.inc'
  include '%fasminc%\apia\user32.inc'
p.s. Однако не самое удачное решение, если unicode собирать, то не работает. Поэтому придумал более простой и лучший, имхо, вариант:
Код:
  invoke CreateFile,szFile,GENERIC_READ,0,0,OPEN_EXISTING,0,0
  cmp eax,0FFFFFFFFh
  je nothing_error
p.p.s. Наличие папок можно так проверять: invoke CreateFile,szFile,GENERIC_WRITE,FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_FLAG_BACKUP_S EMANTICS,0

p.p.s. Не, вариант с CreateFile не очень хорош, с папками не всегда работает. В общем, как оказалось - exist и не надо было рипать, всё лежит в исходниках masm в папке m32lib. Итоговый вариант (за допиливание/приведение в элегантный вид большое спасибо ManHunter):
Код:
; ansi
proc existA lpszFileName:DWORD
  local wfd:WIN32_FIND_DATA
  lea eax,[wfd]
  invoke FindFirstFileA,[lpszFileName],eax
  cmp eax,-1
  je  @F
  invoke FindClose,eax
  dec eax
  @@:
  inc eax
  ret
endp
; unicode
proc existW ucFileName:DWORD
  local ucwfd:WIN32_FIND_DATAW
  lea eax,[ucwfd]
  invoke FindFirstFileW,[ucFileName],eax
  cmp eax,-1
  je  @F
  invoke FindClose,eax
  dec eax
  @@:
  inc eax
  ret
endp
; вызывать так: stdcall existX,FileName
; eax = 0 - файла/папки нет, eax = 1 - есть

Последний раз редактировалось elch; 11.01.2016 в 08:56..
elch вне форума Отправить личное сообщение для elch
Вверх
Ответить с цитированием
Старый Добавлено: 13.01.2016, 16:54
  (#57)
elch
Пользователь
Пользователь
 
Аватар для elch

По умолчанию

Столкнулся с таким - есть программка, а точнее патч-активатор - его задача работать и в XP и в старших осях, в которых могут потребоваться функции, которые в XP x86 не работают (типа Wow64DisableWow64FsRedirection), т. е. если их использовать в активаторе, то на XP он не запустится. Но как оказалось, можно сделать как-то так:
Код:
format PE GUI 4.00
entry start

include 'win32w.inc'

section '.text' code executable readable

proc RegDelTree _hkey:DWORD,_subkey:DWORD
  invoke  GetModuleHandle,szAdvapi
  invoke  GetProcAddress,eax,szRegDeleteTreeW
  or      eax,eax
  je      @F
  push    [_subkey]
  push    [_hkey]
  call    eax
  @@:
  ret
  szRegDeleteTreeW db 'RegDeleteTreeW',0
endp

proc SHDelKey _hkey:DWORD,_subkey:DWORD
  invoke  GetModuleHandle,szShlwapi
  invoke  GetProcAddress,eax,szSHDeleteKeyW
  or      eax,eax
  je      @F
  push    [_subkey]
  push    [_hkey]
  call    eax
  @@:
  ret
  szSHDeleteKeyW db 'SHDeleteKeyW',0
endp

start:
  invoke  GetVersion
  cmp     al,5
  jna     @F
  stdcall RegDelTree,HKEY_CURRENT_USER,tstkey
  jmp     check
  @@:
  stdcall SHDelKey,HKEY_CURRENT_USER,tstkey
  check:
  or      eax,eax
  je      @F
  invoke  MessageBox,0,msgfail,0,MB_OK
  jmp     loc_exit
  @@:
  invoke  MessageBox,0,msgok,0,MB_OK
  loc_exit:
  invoke  ExitProcess,0

section '.data' data readable writeable

tstkey    du 'Software\test1',0
szShlwapi du 'shlwapi.dll',0
szAdvapi  du 'advapi32.dll',0
msgfail   du 'Delete of registry key failed!',0Dh,0Ah,'(or possibly the key does not exist)',0
msgok     du 'Delete of registry key successful!',0

section '.idata' import data readable writeable

  library kernel32,'KERNEL32.DLL',user32,'USER32.DLL'
  include 'api/kernel32.inc'
  include 'api/user32.inc'
Такой exe будет работать везде. Наводка на это попалась в примере скроллера от diablo2oo2, в функции MakeDialogTransparentValue (там проверка на win 9x, но принцип абсолютно тот же).
Вот её код на FASM (в отличие от примера выше, тут чуть более усложненный вариант, с сохранением регистров):
Код:
proc DialogTransparent _dialoghandle:DWORD,_value:DWORD

  pushad
  invoke GetModuleHandle,szUser
  invoke GetProcAddress,eax,szProc
  or  eax,eax
  je  @F
  mov edi,eax
  invoke GetWindowLong,[_dialoghandle],GWL_EXSTYLE
  cmp [_value],255
  je  .removelayer
  or  eax,WS_EX_LAYERED
  jmp .setlayer
  .removelayer:
  xor eax,WS_EX_LAYERED

  .setlayer:
  invoke SetWindowLong,[_dialoghandle],GWL_EXSTYLE,eax
  cmp [_value],255
  jae @F
  push LWA_ALPHA
  push [_value]
  push NULL
  push [_dialoghandle]
  call edi

  @@:
  popad
  ret

  szUser  du 'user32.dll',0
  szProc  db 'SetLayeredWindowAttributes',0

endp
Лично мне, такая фишка с вызовом функций без добавления их в импорт, очень понравилась и весьма пригодилась.
elch вне форума Отправить личное сообщение для elch
Вверх
Ответить с цитированием
Старый Добавлено: 31.08.2016, 15:07
  (#58)
elch
Пользователь
Пользователь
 
Аватар для elch

По умолчанию

Мдя, похоже, FASM теперь только ManHunter и я интересуемся (semiono уже забил?)
Вот ещё пара функций - получение пути к текущей папке с завершающим слэшем (весьма нужная для меня вещь). Вторая когда-то доставляла проблему - не мог правильно перевести её в юникод (всё на фасме пишу исключительно в юникоде), но теперь вроде разобрался.
Пример:
Код:
format PE GUI 5.0

include 'WIN32W.INC'

entry start

section '.text' code readable executable

; такой способ использую в многих проектах, очень хорошо подходит для всяких лаунчеров/лоадеров
proc getdirW
	push	edi				; сохраним используемый edi - в данном примере это необязательно, но в более сложных программках зачастую необходимо
	invoke	GetModuleFileName,0,curdir,2048
	invoke	lstrlen,curdir
	lea		edi,[eax*2+curdir]
	@@:
	cmp		word[edi],5Ch
	je		@F
	dec		edi
	jmp		@B
	@@:
	mov		word[edi+2],0
	pop		edi
	ret
endp

; такой способ требовался значительно реже, но всё же в некоторых случаях бывает нужен он, а не тот, что выше
proc getcurdirW
	push	edi esi			; сохраним используемые регистры, как и в функции выше
	invoke	GetCurrentDirectory,MAX_PATH*2,lpBuffer
	mov		esi,lpBuffer	; итоговое значение переменной будет с завершающим слэшем
	mov		edi,szBuffer	; а тут без, как при обычном вызове GetCurrentDirectory
	@@:
	lodsw
	stosw
	test	ax,ax
	jne		@B
	sub		esi,2
	mov		word [esi],5Ch
	add		esi,2
	mov		word [esi],0
	pop		esi edi
	ret
endp

start:
	call	getcurdirW
	invoke	MessageBox,0,lpBuffer,szBuffer,MB_OK
	call	getdirW
	invoke	MessageBox,0,curdir,0,MB_OK
	invoke	ExitProcess,0

section '.bss' readable writeable

lpBuffer	du MAX_PATH dup(?)
szBuffer	du MAX_PATH dup(?)
curdir		du 1024 dup(?)

section '.idata' import data readable

	library user32,'USER32.DLL',\
		kernel32,'KERNEL32.DLL'

	include 'API\USER32.INC'
	include 'API\KERNEL32.INC'
p.s. На мой взгляд, в качестве IDE для FASM удобней всего Sublime Text 3, с подсветкой от ManHunter (он её кстати [Ссылки могут видеть только зарегистрированные пользователи. ] , как подключить FASM можно почитать там по ссылкам, или [Ссылки могут видеть только зарегистрированные пользователи. ] (более простой вариант, которым я пользуюсь)).
Кому лень изучать, вот готовый Sublime Text 3 Build 3120 x86 portable + fasm (без кряка, т. к. варез тут запрещён): [Ссылки могут видеть только зарегистрированные пользователи. ]
elch вне форума Отправить личное сообщение для elch
Вверх
Ответить с цитированием
Старый Добавлено: 26.05.2017, 03:25
  (#59)
max129
Наблюдающий
Пользователь
 
Аватар для max129

По умолчанию

Цитата:
Сообщение от semiono Посмотреть сообщение
Я в ассемблере ни бумбум, но мне нравиться возможность скампилировать чтонибудь,за что встречаю непонимание на низкоуровневых форумах )))В чём прелесть fasm, то что у него нету границ

Я больше спец по асму на Z-80, но посмотрел на исходники и смех берёт - это что-то с чем-то, вообщем больше похоже на фортран или даже на бейсик, ибо сплошные вызовы API и т.п.
Вообщем теряется вся суть асма как такового, ибо применяют его исключительно (относиться только к современным ПК) для написания оригинальных автономных программных вставок для оптимизации по скорости или для полного доступа к ресурсам ПК, вообщем для всего того, чего ни на каком языке программирования добиться не возможно.

Последний раз редактировалось max129; 28.05.2017 в 10:55.. Причина: правка
max129 вне форума Отправить личное сообщение для max129
Вверх
Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Реклама



Powered by vBulletin® Version 3.8.2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot

Время генерации страницы 0.77502 секунды с 38 запросами