1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

можно ли программно изменить значение лексемы в сегменте констант

Тема в разделе "WASM.BEGINNERS", создана пользователем assch, 9 янв 2020.

  1. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.112
    Тыц, черным по-русски написано. Мой пост второй раз читать не надо, если с первого не дошло.
     
  2. njeen

    njeen Active Member

    Публикаций:
    0
    Регистрация:
    26 мар 2017
    Сообщения:
    100
    Адрес:
    Ташлинск
    Такое тоже возможно, но думаю, мною понято верно - поясните свои слова.
    Я знаю, что ТС пытается сделать то, что не реализуемо - если в лоб - лексемы менять, - то их нельзя менять вообще, если имелась в виду все-таки модификация константных данных - то все правильно отвечено.
    "Вы хотите обмануть компилер и создать расширяемый буфер" - это ваши предположения, вопрос звучал по-другому, а в угадайку я не играю. Если бы был "может ли программа 'оберегать' значение в const" - тогда да.
     
  3. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    137
    Спасибо за совет по поводу изменения доступа
    Но я согласен с Indy
    Овчинка не стоит выделки

    Кстати ormoulu
    странно что вам не понравилось что означает слово - Лексема
    и уж тем более смело с вашей стороны утверждать
    что в данной подаче она не имеет смысла

    Если вы откроете Википедию то там чёрным по белому написано
    что одно из значений этого слова это - ассоциированное слово
    в данном случае если вы не поняли
    нужно понимать как ассоциация с адресом

    Я ничего не имею против вашего академического разъяснения
    по мне всё гораздо проще - Краткость сестра таланта

    Всем спасибо за участие
     
  4. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    3.240
    njeen,

    А почему ты решил/а что я тоже не пытался сделать много лет ранее :preved:
     
  5. ormoulu

    ormoulu Active Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    485
    Да уж :crazy:

    Ну да ладно, мне вот это интересно:
    Если секция релоков отсутствует, а image base такой же, как у уже загруженного в память модуля, что будет с библиотекой при загрузке? Кто знает, кто проверял?
     
  6. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    3.240
    ormoulu,

    Загрузка разделяется на две фазы, отображение как секция(не путать с файловыми секциями). Это делает ядро. Обычно пока небыло выборки из проекции, хоть область памяти и выделена, но она не доступна для манипуляций, из за оптимизации по записи. После отображения как секция наступает вторая фаза, управление получает юзер загрузчик.

    Ядро проверит адрес загрузки и возможность отображения на другой адрес, если это не возможно вернёт ошибку. Обычно на этом попытка загрузки заканчивается снятием процесса, так как загрузчик развернёт не штатное исключение.
     
  7. ormoulu

    ormoulu Active Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    485
    Indy_, т.е. загрузчик именно прибьет процесс? Но не посчитает, например, что в коде нечего релоцировать и не загрузит принудительно по другому адресу?
     
  8. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    3.240
    ormoulu,

    Ядро ничего про релоки не знает. Будет вызван сервис отображения(NtMapVi), он вернёт ошибку корреляции адресов, загрузчик сразу завершится возвратив ошибку. В зависимости от версии и состояния(настройки) он может выдать сообщение.
     
  9. ormoulu

    ormoulu Active Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    485
    Indy_, т.е. желаемый адрес загрузки модуля выбирает и передает в ядро юзермодный загрузчик?
    Хмм, погодите, но ведь отображение/секция создается вызовом MapViewOfFile? А этот вызов уже может сообщить в коде ошибки, что модуль отображен по другому адресу?
    Где же проверяется в итоге наличие релоков?
     
  10. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    3.240
    ormoulu,

    Адрес отображения выбирает ядро, если есть директория релоков он отобразит на рандом адрес(aslr) и возвратит статус c ошибкой, точнее warning(их 4-ре типа статусных кодов). На основе его юзер загрузчик начнёт релокацию образа. Под релокацией понимается настройка окружения, но ничего более.
     
  11. ormoulu

    ormoulu Active Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    485
    Ммм... приблизительно понятно, спасибо.
     
  12. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    3.240
    ormoulu,

    Сделай приятно, напиши загрузчик из памяти раз понял всё.
     
  13. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.552
    Адрес:
    Russia
    эта ересь исключительно для выдачи предупреждений начинающему кодеру со стороны masm о записи туда куда он писать не собирался
    --- Сообщение объединено, 11 янв 2020 ---
    ваша программа и ваш массив => вам городить проверки на пересечение границ массива
    --- Сообщение объединено, 11 янв 2020 ---
    чтоб не париться с этим каждый раз обычно пишут get/read и set/write процедуры для чтения и запись в массив
     
  14. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.827
    Может быть кому-то понадобится.
    Создаю 4 DLL, отличия в заголовке "17a DLL Skeleton", "17c DLL Skeleton", "17d DLL Skeleton", "17e DLL Skeleton" и названиях функций: TestHello0, TestHello1, TestHello2, TestHello3
    Код (ASM):
    1. ; DLL #
    2. include win64a.inc
    3. IDC_ICON1 equ 500
    4. .data
    5. AppName db "Uncle Remus tales:#17a DLL Skeleton",0
    6. mb label   MSGBOXPARAMS
    7.   dd sizeof MSGBOXPARAMS,?;cbSize
    8.   dq 0  ;hwndOwner
    9.   dq ?  ;hInstance
    10.   dq ?  ;lpszText
    11.   dq AppName  ;lpszCaption
    12.   dd MB_OK or MB_USERICON,?;dwStyle
    13.   dq IDC_ICON1  ;lpszIcon
    14.   dd 0,?;dwContextHelpId
    15.   dq 0  ;lpfnMsgBoxCallback
    16.   dd 0,?;dwLanguageId
    17. format db "hInstDll    = %08Xh",10,"hInstance = %08Xh",0
    18. .code
    19. DllMain proc hInstDLL:QWORD, reason:QWORD, unused:QWORD
    20.        mov mb.hInstance,rcx
    21.        mov eax,TRUE
    22.        leave
    23.        ret
    24. DllMain Endp
    25. TestHello0 proc
    26. local buffer[100h]:byte
    27.        invoke GetModuleHandle,0
    28.        invoke  wsprintf,&buffer,&format,mb.hInstance,rax
    29.        lea eax,buffer
    30.        mov mb.lpszText,rax
    31.        invoke MessageBoxIndirect,&mb
    32.        leave
    33.        mov eax,TRUE
    34.        ret
    35. TestHello0 endp
    36. end
    к каждой DLL rc-файлы
    Код (C):
    1. #define IDC_ICON1 500
    2. IDC_ICON1 ICON "br_Fox1.ico"
    и def-файлы
    Код (Text):
    1. LIBRARY tut_17a
    2. EXPORTS TestHello0
    сборка bat-файлом
    Код (Text):
    1. %masm64_path%bin\ml64 /c /Cp /I %masm64_path%include %filename%.asm >> errors.txt
    2. if errorlevel 1 exit
    3. %masm64_path%bin\RC /r  %filename%.rc >> errors.txt
    4. if errorlevel 1 exit
    5. %masm64_path%bin\link /SUBSYSTEM:WINDOWS /LIBPATH:%masm64_path%lib ^
    6. /ENTRY:DllMain /DLL /section:.bss,S /stub:%masm64_path%bin\stubby.exe  ^
    7. %filename%.obj %filename%.res /DEF:%filename%.def >> errors.txt
    и asm-файл для создания ЕХЕ, который вызовет DLL'ки
    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. includelib tut_17a.lib
    4. includelib tut_17c.lib
    5. includelib tut_17d.lib
    6. includelib tut_17e.lib
    7. OPTION PROLOGUE:none
    8. TestHello0 PROTO
    9. TestHello1 PROTO
    10. TestHello2 PROTO
    11. TestHello3 PROTO
    12. .code
    13. WinMain proc
    14.        enter 30h,0
    15.        mov edi,3
    16. @@:    invoke CreateThread,0,0,handle[rdi*8],0,NORMAL_PRIORITY_CLASS,&ThreadID
    17. ;Если вызов CreateThread прошел успешно, возвращается хэндл созданного треда,
    18.        or eax,eax;в противном случае возвращается NULL
    19.        jz @f
    20.        invoke CloseHandle,eax
    21.        dec edi
    22.        jns @b
    23. @@:  invoke Sleep,50000;задержка, чтобы рассмотреть MessageBox'ы
    24.        invoke RtlExitUserProcess,NULL;завершение программы
    25. WinMain endp
    26. ThreadProc0 proc
    27.        push rax
    28.        call TestHello0
    29.        pop rax
    30.        ret
    31. ThreadProc0 endp
    32. ThreadProc1 proc
    33.        push rax
    34.        call TestHello1
    35.        pop rax
    36.        ret
    37. ThreadProc1 endp
    38. ThreadProc2 proc
    39.        push rax
    40.        call TestHello2
    41.        pop rax
    42.        ret
    43. ThreadProc2 endp
    44. ThreadProc3 proc
    45.        push rax
    46.        call TestHello3
    47.        pop rax
    48.        ret
    49. ThreadProc3 endp
    50. handle  dq ThreadProc3,ThreadProc2,ThreadProc1,ThreadProc0
    51. ThreadID dd ?
    52. end
    сборка bat-файлом
    Код (Text):
    1. %masm64_path%bin\ml64 /Cp /c /I"%masm64_path%Include" %filename%.asm >> errors.txt
    2. if errorlevel 1 exit
    3. %masm64_path%bin\link /LIBPATH:"%masm64_path%Lib" /STUB:%masm64_path%bin\stubby.exe ^
    4. /entry:WinMain /fixed /nocoffgrpinfo %filename%.obj >> errors.txt
    запускаю
    00.png
     
  15. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    137
    Спасибо за участие
    По поводу вопроса темы можно применить такой код

    Код (ASM):
    1.  
    2. .const
    3. hInstance dd 0
    4. .data?
    5. old dd ?
    6. .code
    7.  
    8. invoke VirtualProtect,addr hInstance,4,PAGE_READWRITE,addr old
    9. invoke GetModuleHandle,0
    10. lea ecx,hInstance
    11. mov dword ptr [ecx],eax
    12. invoke VirtualProtect,addr hInstance,4,old,addr old
    13.  
    Как вариант имеет право на жизнь
    Другое дело имеет ли смысл это делать
    каждый решает сам
     
  16. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.827
    assch,
    под hInstance можешь не отводить память, всё равно после GetModuleHandle(0) будешь получать одно и то же значение
    Код (ASM):
    1. hInstance equ 400000h
     
  17. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    137
    Это смотря какие заданы настройки
    у меня по умолчанию это значение всегда разное
    пример универсальный и его не обязательно использовать именно для - hInstance

    Mikl___, большое спасибо за примеры
     
  18. Rel

    Rel Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    2.544
    зависит от того, как часто ты значение используешь, тк каждый раз этой функцией лезть в PEB и доставать этот адрес выглядит как то избыточно...
     
  19. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    3.240
    Mikl___,

    > invoke MessageBoxIndirect

    Это макрос сделан для удобства, аргументы перечисляются, но если их нет это call.

    > enter 30h,0

    Плохой пример, незачёт.