Есть некий базонезависимый код, который работает в чужом модуле опираясь на расчитанную дельту. Из этого кода вызывается callback-функция процедура которой находится в том же модуле. Когда управление передается на эту процедуру, то дельта теряется, соответсвенно все адреса начинают указывать нетуда куда хотелось бы. Каким образом можно передать дельту callback-процедуре, если из материнской функции, передачи параметров не предусмотрено ?
Ну если колбэк твой и вызываешь его ты, тогда через стек/регистр передать можно. Но я бы рекомендовал заново вычислить - имхо так проще
только вычислять. или у некоторых коллбыков есть параметр. Через него можно. Но вычислять вроде 3 строки. Потому легче вычислить.
Меня клинит или так и есть? При расчете дельты (в одном из расчетов) мы обращаемся к адресу по которому расположена метка. Вызываем ее через call, либо тупо загружем ее адрем директивой lea...В связи с этим, вопрос: значит ли это то, что метка в чужом адресном пространстве будет всегда иметь правильное смещение ? (раз мы вызываая ее через call попадаем именно на нее). Почему бы тогда в шелл коде и переменные не обозначать через метки? Типа perem1: dd 0 perem2: dd ? а не вызывать их прибавляя к смещению вычисленную дельту. Или меня переглючило после тяжелых рабочих дней ???
Нет, не правильно. Смещение метки будет абсолютным. Т.е. например 403000. А в другом процессе оно может быть любым. А обращаться программа будет все равно к 403000. Дык вот, чтобы не было глюка, и используется дельта. Дело в том, что call'ы используют относительные адреса! То, что ты видишь в отладчике call 403000 (например) - это только отладчик специально для тебя сделал расчет и показал, куда идет прыжок. На самом деле, вместо адреса, куда прыгать, в call будет стоять разница между текущим адресом (т.е. адресом команды call) и местом, куда надо прыгнуть. P.S.: насчет lea не знаю, потому не могу точно сказать.
адресом следующей за call команды В опкоде call относительное смещение, в опкоде lea абсолютное, и рассчитывается оно при ассемблировании. eg. lea eax, param1 <=> mov eax, offset param1.