На форуме запрещена публикация любого незаконного материала, нарушающего авторские права создателей, а также просьбы выложить это! МЫ поможем ВАМ найти бесплатную альтернативу! О публикации ключей, креков, пиратского ПО, игр, музыки, фильмов и т.д. - сообщать СЮДА!
Это у меня направление такое
Я в ассемблере ни бумбум, но мне нравиться возможность скампилировать чтонибудь,
за что встречаю непонимание на низкоуровневых форумах )))
Работаем с 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.
Брать значения пути через переменные окружения в определенных случаях считается дурным тоном. Во-первых, никто не мешает пользователю переопределить их с помощью, например, командной строки. Во-вторых, это небезопасно, особенно если будете использовать переменную %Temp%.
Правильно будет брать эти переменные из реестра. Это сложнее в части программирования, зато исключены ошибки.
Правильно пути читать из разделов:
virtuOS, может быть через это: SHGetSpecialFolderPath() код был выше. Справедливое замечание, спасибо!
Я обычно собираю свою ось, поэтому как бы уверен в переменных окружения, но для чужой системы лучше подстраховаться.
Добрался я до 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..
RtlZeroMemory - очищает содержимое переменной, это очень удобно для повторного использования
одних и тех же переменных многократно.
SHGetSpecialFolderPath - функция полезна тем, что указывает относительные пути к папкам,
которые могут содержать кириллицу, поэтому нецелесообразно их указать дописав путь к %UserProfile%
Однако функция SHCreateDirectory требует юникод, поэтому мы конвертируем строку
этой функой: MultiByteToWideChar.
RunDll32.DLL
Последний раз редактировалось semiono; 12.11.2011 в 05:30..
Допустим, нужно удалить папку, но предварительно поместим в неё New.txt
и откроем в блокноте. Програма всёравно удалит папку при закрытии процесса.
Такие задержки могут быть полезными при больших тяжёлых нагрузках на файловую систему.
Чёто тема совсем заглохла.( Однако рискну здесь спросить, а то не понял, где на оффоруме подобные вопросы задавать.
В masm32 есть удобная функа exist, которой можно проверять наличие/отсутствие какого-либо файла. Рипнул её через дизассемблер, интересует всё ли правильно сделано, может чего подправить/улучшить/сократить? В смысле, функция не слишком индусская получилась? Вот исходник тестового exe с данной функой:
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_SEMANTICS,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..
Столкнулся с таким - есть программка, а точнее патч-активатор - его задача работать и в 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
Лично мне, такая фишка с вызовом функций без добавления их в импорт, очень понравилась и весьма пригодилась.
Мдя, похоже, 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 (без кряка, т. к. варез тут запрещён): [Ссылки могут видеть только зарегистрированные пользователи. ]
Я в ассемблере ни бумбум, но мне нравиться возможность скампилировать чтонибудь,за что встречаю непонимание на низкоуровневых форумах )))В чём прелесть fasm, то что у него нету границ
Я больше спец по асму на Z-80, но посмотрел на исходники и смех берёт - это что-то с чем-то, вообщем больше похоже на фортран или даже на бейсик, ибо сплошные вызовы API и т.п.
Вообщем теряется вся суть асма как такового, ибо применяют его исключительно (относиться только к современным ПК) для написания оригинальных автономных программных вставок для оптимизации по скорости или для полного доступа к ресурсам ПК, вообщем для всего того, чего ни на каком языке программирования добиться не возможно.
не любитель выпить
Последний раз редактировалось max129; 28.05.2017 в 10:55..
Причина: правка