Программирование на языке ассемблера NASM для ОС Unix. А. Столяров.pdf https://yadi.sk/i/98xBWl1-HXVINQ ...читаю... --- Сообщение объединено, 13 янв 2021 --- http://www.stolyarov.info/books/asm_unix Веб сайт Столярова
А на мой ответ никто внимания не обратил. Инфа про исключение: Код (Text): ExceptionAddress: 0000000000D86B81 shell32.0000000000D86B81 NumberParameters: 2 ExceptionInformation[00]: 0000000000000000 Read - адрес инструкции равен адресу выборки(IP = CR2). Тоесть она читает сама себя Ip: mov r,[Ip] и это приводит к ловушке, что может быть лишь при сегментации(86). На самом деле не так, это когда то разбирали, но я подзабыл нужно поискать. Как бы там небыло, семпл не простой:
Indy_, да там какие-то банальные ошибки в параметрах функций с мсдн, передал указатель вместо указателя на указатель или подобное. Копать можно, но не думаю, что есть толк.
M0rg0t, Смысл в том, что нужно узнать в какой ситуации при исключении два параметра равны, это знакомая ситуация но я не могу вспомнить. Сейчас поищем.
M0rg0t, Я по суркам свои поискал, вот нашло что нужно: - древний сурец по подмене выборки. Это значит если передача управления в NX область приведёт к двум одинаковым параметрам, тк попытка выполнить NX и соотвественно CR2 = IP. В данном случае значит что управление передаётся в неисполняемую память, по какой причине врядле можно сказать. Может быть в аргументах апи есть колбек, аргумент ошибочен и само собой будет такая ошибка. Странно что я это забыл.
Функция просто старая и не работает так написано в MSDN. [SHGetSpecialFolderPath is not supported. Instead, use SHGetFolderPath.] а там написано: Note As of Windows Vista, this function is merely a wrapper for SHGetKnownFolderPath. The CSIDL value is translated to its associated KNOWNFOLDERID and then SHGetKnownFolderPath is called. New applications should use the known folder system rather than the older CSIDL system, which is supported only for backward compatibility. Нужно использовать что бы получить путь к какой либо папке функцию: SHGetKnownFolderPath я не понял какие там аргументы и прошу с этой функцией помощи
Hacker, В прототипе нет обратного вызова, тогда как управление передаётся на какой то не исполняемый буфер ? Бери старый добрый gmer и смотри. По мойму наиболее вероятно что это глюки отладочных плагинов, которые ты используешь. Проскань систему на патчи и сразу всё станет ясно.
Ну если ыункция не поддерживается больше что в ней копаться? --- Сообщение объединено, 13 янв 2021 --- Хотя как такое вообще может быть?
она поддерживается, просто советуют юзать с висты более новую апи. Я же написал пример на предыдущей странице, или что именно неясно? На асме нужен пример чтоли? Могу только на масм.
Прости не видел примера, попробую отпишусь --- Сообщение объединено, 13 янв 2021 --- Ну если не сложно напиши на асм что бы значение аргументов видеть --- Сообщение объединено, 14 янв 2021 --- Подскажи пожалуйста чему равна FOLDERID_ProgramFilesX86 ? --- Сообщение объединено, 14 янв 2021 --- Код (ASM): mov r9 , PROGRAM_FILESX86 mov r8 , 0 mov rdx , 0 mov rcx , 0x002a call SHGetKnownFolderPath Вот так не получается, то же исключение --- Сообщение объединено, 14 янв 2021 --- PROGRAM_FILESX86 у меня ссылка на буфер PROGRAM_FILESX86 db 260 dup (?)
Hacker, меня терзают смутные сомнения, в каких регистрах какие по нумерации аргументы вы передаете? Первый и четвертый параметр ― это должны быть адреса, а что за адрес такой 2Ah? Старайтесь константы передавать через идентификаторы и использовать EQU имя EQU число или выражениетогда становится понятным ЧТО же хотел сказать автор программы, да и комментарии мешать не будут
Вас понял, буду всё делать с equ. 0x002a - это я вообще попробовал CSIDL от SHGetSpecialFolderPath() CSIDL_PROGRAM_FILESX86 (FOLDERID_ProgramFilesX86) сейчас вижу что они ровны, но почему тогда путь не записывается в буфер? Все делал как в примере у человека.
это не буфер, это что-то с СОМ связано, думаю не надо без опыта браться за СОМ. Это очень сложная тема, архисложная, тем более на ассемблере. Там и на плюсах можно запутаться. FOLDERID_ProgramFilesX86 это GUID, какое-то константное значение , ссылку на которое мы передаем. Смотри, на масме будет примерно так: 1. берем прогу от ManHunter https://www.manhunter.ru/releases/1571_guid_helper_1_1.html , туда вводим это значение, получаем его в формате Асма. Заносим в секцию .data Код (ASM): FOLDERID_ProgramFilesX86 dd 07C5A40EFh dw 0A0FBh dw 04BFCh db 087h, 04Ah, 0C0h, 0F2h, 0E0h, 0B9h, 0FAh, 08Eh 2. объявляем указатель для функции и для буфера, который она вернет. Код (ASM): .data? pfunc dd ? pbuf dd ? 3. Динамически получаем функцию (инклуды и либы масма рассчитаны на ось всех времен и народов - виндоуз ХР , а эта функа доступна только с висты). Код (ASM): invoke LoadLibraryW,uni$("Shell32.dll") .if eax mov edx,eax invoke GetProcAddress,edx,chr$("SHGetKnownFolderPath") .if eax mov pfunc,eax .endif .endif 4. Собственно, вызов функции Код (ASM): push offset pbuf ;PWSTR *ppszPath push 0 push 0 push offset FOLDERID_ProgramFilesX86 call pfunc Если все верно, то в pbuf будет указатель на строку. На х64 переводи сам.
Вот программа сама: Код (ASM): global start NULL equ 0 FOLDERID_ProgramFilesX86 equ 0x002a KEY_ALL_ACCESS equ 0x0000F003F HKEY_CURRENT_USER equ 0x80000001 extern SHGetKnownFolderPath extern lstrcatA extern DeleteFileA extern RegOpenKeyExA extern RegDeleteKeyA extern RegCloseKey extern MessageBoxA extern ExitProcess section .data PROGRAM_FILESX86 db 260 dup (?) hKey resq 1 xchat db "\xchat\inst.conf",0 RegistryKey db "\Software\XChat\",0 installed db "installed",0 MessBox db "XChat Trial Reset",0 section .code start: sub esp,48 mov r9 , PROGRAM_FILESX86 mov r8 , NULL mov rdx , NULL mov rcx , FOLDERID_ProgramFilesX86 call SHGetKnownFolderPath mov rdx , xchat mov rcx , PROGRAM_FILESX86 call lstrcatA mov rcx , PROGRAM_FILESX86 call DeleteFileA mov qword [rsp+20h] , hKey mov r9 , KEY_ALL_ACCESS mov r8 , NULL mov rdx , RegistryKey mov rcx , HKEY_CURRENT_USER call RegOpenKeyExA mov [hKey] , rax mov rdx , installed mov rcx , [hKey] call RegDeleteKeyA mov rcx , [hKey] call RegCloseKey mov r9 , 0x30 mov r8 , NULL mov rdx , MessBox mov rcx , NULL call MessageBoxA mov rcx , rax call ExitProcess
Hacker, хорошо, а теперь поменяй вызов SHGetKnownFolderPath как в моем примере, и да - нужно проверить коды ошибок; если функция вернула ошибку, то не идти дальше, а завершать работу / уведомлять. А то потом появляются чудеса.
Почему вы указываете адрес константы а не её саму? offset FOLDERID_ProgramFilesX86 ? Обычно в функцию передают саму константу а не её адрес тоесть мне нужно сделать FOLDERID_ProgramFilesX86 dw 0x002a и передать её адрес? а не через equ я не совсем понял --- Сообщение объединено, 14 янв 2021 --- сейчас будем думать в pbuf будет указатель на строку, я думал её выведут мне в буфер, будем думать и переделывать всё --- Сообщение объединено, 14 янв 2021 --- Тоесть нужно что-то типа: Код (ASM): Buffer db 260 dup (?) PROGRAM_FILESX86 resq 1 FOLDERID_ProgramFilesX86 dw 0x002a mov r9 , PROGRAM_FILESX86 mov r8 , NULL mov rdx , NULL mov rcx , FOLDERID_ProgramFilesX86 call SHGetKnownFolderPath mov rdx , PROGRAM_FILESX86 mov rcx , Buffer call lstrcatA mov rdx , xchat mov rcx , Buffer call lstrcatA --- Сообщение объединено, 14 янв 2021 --- Вообще как-то странно выглядит, ну ладно попробую, может быть функция такая --- Сообщение объединено, 14 янв 2021 --- не получается
Наверное потому, что функции требуется адрес Код (C++): PWSTR path; SHGetKnownFolderPath(&FOLDERID_ProgramFilesX86, 0, NULL, &path); и откуда взялась 2Ah? Код (ASM): FOLDERID_ProgramFilesX86 dd 7C5A40EFh dw 0A0FBh dw 4BFCh db 87h, 4Ah, 0C0h, 0F2h, 0E0h, 0B9h, 0FAh, 8Eh