tag:blogger.com,1999:blog-1702873441071265539.post8330770018834586847..comments2023-05-29T19:02:20.570+03:00Comments on Блог GunSmoker-а: Фреймы на стеке (стековые фреймы)GunSmokerhttp://www.blogger.com/profile/15611696588191431330noreply@blogger.comBlogger9125tag:blogger.com,1999:blog-1702873441071265539.post-32020943141981004152015-05-15T14:48:25.456+03:002015-05-15T14:48:25.456+03:00Спасибо за ссылку.
Ну, это блог про Delphi. 64-би...Спасибо за ссылку.<br /><br />Ну, это блог про Delphi. 64-битные приложения Delphi умеет создавать только под Windows. В Windows красной зоны нет. Вместо этого есть зона параметров, которую я кратко упомянул, без деталей.GunSmokerhttps://www.blogger.com/profile/15611696588191431330noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-64485704000822619572015-05-15T14:35:16.336+03:002015-05-15T14:35:16.336+03:00upd x86-64 ABI (eng, pdf)upd <a href="http://www.x86-64.org/documentation/abi.pdf" rel="nofollow">x86-64 ABI (eng, pdf)</a>Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-55433531646120309652015-05-15T14:32:11.303+03:002015-05-15T14:32:11.303+03:00Добавлю ссыль на Кадр стека x86-64 (eng).
По ссыл...Добавлю ссыль на <a href="http://eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64/" rel="nofollow">Кадр стека x86-64 (eng)</a>. <br />По ссылке раскрыта информация, которая отсутствует в данной статье: красная зона или область параметров.<br />И еще один ссыль <a rel="nofollow">x86-64 ABI (eng, pdf)</a>.<br /><br /><br /><br />Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-23057838899136022882015-03-02T10:05:38.389+03:002015-03-02T10:05:38.389+03:00Практический пример.<a href="http://www.sql.ru/forum/1145003/jcl-debug-expert-diagnostika-oshibok-v-programme" rel="nofollow">Практический пример</a>.GunSmokerhttps://www.blogger.com/profile/15611696588191431330noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-69865487958989023902015-02-25T00:27:24.989+03:002015-02-25T00:27:24.989+03:00>>> адрес загрузки модуля меняется
Это м...<i> >>> адрес загрузки модуля меняется</i><br /><br />Это можно проверить в любом просмотрщике PE (многие HEX-редакторы также имеют такую возможность).<br /><br /><i> >>> Опытным путем установлено, что до подписи адреса процедур из map-файла корректные, а после подписи уже нет</i><br /><br />Речь точно идёт о цифровой подписи, а не протекторе? Классическая цифровая подпись <b>НЕ</b> меняет данные. <br /><br />Для подписываемого файла вычисляется его хэш, на базе хэша создаётся сертификат для подписи, сертификат записывается в конец исполняемого файла. Из хэша исключается поле Checksum, запись Certificate Table в опциональном заголовке PE и сами данные сертификата в конце файла. Для валидации ОС считает хэш (с тремя исключениями выше) и сравниваем его с сертификатом.<br /><br />Как видите, в этом алгоритме нет "изменить базовый адрес" или чего-то такого. Так что вы видите что-то другое.GunSmokerhttps://www.blogger.com/profile/15611696588191431330noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-15793168713100901072015-02-24T17:16:51.864+03:002015-02-24T17:16:51.864+03:00>>> Каким образом подпись влияет на адрес...>>> Каким образом подпись влияет на адреса?<br />Опытным путем установлено, что до подписи адреса процедур из map-файла корректные, а после подписи уже нет.<br />м.б. адрес загрузки модуля меняется.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-28635614423133187472015-02-21T03:37:01.927+03:002015-02-21T03:37:01.927+03:00>>> получить значения параметров
В общем...<i> >>> получить значения параметров</i><br /><br />В <b>общем</b> случае это невозможно. <br /><br />Дело тут не в Delphi и даже не в соглашении вызова. Если компилятор оптимизирующий, то параметры не живут дольше их последнего использования. Т.е. если, к примеру, подпрограмма при входе сохранила параметр в, скажем, поле объекта, то ниже по тексту этот параметр (где бы он ни был сохранён - в регистре или стеке) будет перезаписан под что-то более нужное. <br /><br />Нет никакой возможности узнать, что делает код с этим параметром. Может быть, код использует его. Может быть, продолжает хранить, где он был передан. Может быть, копирует в другое, более удобное место. Человек это может понять, посмотрев машинный код. Компилятор это знает, т.к. он же этот код и собирал, у него есть учёт какие данные куда идут.<br /><br />Внешний же код этого знать не может.<br /><br />Дело не изменяется даже в x86-64. Хотя соглашение вызова x86-64 резервирует место на стеке специально для хранения параметров ("param spilling"), но нет никакого требования именно хранить там параметры. Поэтому оптимизирующий компилятор использует это место как "песочницу" - просто дополнительную свободную память, доступную подпрограмме.<br /><br />Само собой, в <b>частных</b> случаях это сделать можно. Так что весь вопрос упирается в то, насколько частный ваш случай. Если вам нужно делать это для конкретной подпрограммы - можно попробовать использовать соглашение вызова, которое передаёт параметры в стеке, и стек чистит вызывающий. Под такое определение подходит cdecl. <br /><br /><i> >>> exe-файл подписывался на этапе сборки инсталлятора, происходило смещение адресов</i><br /><br />Что? Каким образом подпись влияет на адреса? Есть мнение, что происходит что-то другое.GunSmokerhttps://www.blogger.com/profile/15611696588191431330noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-11817702539651454692015-02-20T13:34:43.795+03:002015-02-20T13:34:43.795+03:00Я как-то использовал легковесную библиотеку для по...Я как-то использовал легковесную библиотеку для получения трассы стека (uLkStackTrace.pas). Все работало. <br />Но т.к. exe-файл подписывался на этапе сборки инсталлятора, происходило смещение адресов, и в реальной работе имена функций в стеке были неверными. <br />Случайно не посоветуете как эту проблему решить?Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-29490579900387042442015-02-20T10:19:36.531+03:002015-02-20T10:19:36.531+03:00Наверное это подходящая статья, чтобы спросить. Ин...Наверное это подходящая статья, чтобы спросить. Иногда при трассировке стека хочется странного, а именно - получить значения параметров. В интернете встречал мнение что в случае с делфи это невозможно, т.к. по умолчанию параметры передаются через регистры и перетираются. Но ведь процедура, использующая параметры, их из регистров всё равно достает (и, насколько я могу увидеть, складывает рядом с ebp). Почему их нельзя оттуда получить? <br />Окей, предположим получить такие параметры всё таки нельзя, но ведь их может быть всего 3, а в случае с методами классов и вовсе 2. Значит должно быть можно получить остальные, т.к. они все равно лежат в стеке?Anonymousnoreply@blogger.com