Здравствуйте господа! Совершенно случайно заметил сей забавный прикол, начну попорядку. Первое: Код (Text): .data str1 db "qwert" str2 db "yuio",0 Теперь если заставить вывести строку в месадж бокс с стр1 получим: qwertyuio. Вроде ястно строки склеились из-за отсутствия 0 у первой. А вот второй глюк становится интерестным: Код (Text): .data str1 db ? str2 db "yuio",0 Теперь как я понимаю str1 должно выделяться место когда мы в нее будем пихать данные по ходу работы. Но теперь используя: invoke MessageBox, NULL, addr str2, addr MsgBoxCaption, MB_OK На выходе получаем данные addr [str1+1], str2 данные мы вообще не видем. Такая же фигня получится если в секцию .data? пихнуть buf1 db ? и buf2 db ? обратившись к buf2 получаем buf1+1 Объясните мне плиз из-за чего сие происходит. Компилятор масм ml 7.10.3077.0 вот исходник демонстрирующий второй пример 939444746__getname.asm
Я прекрасно вижу в MessageBox'e строку по адресу str2: "yuio". Никаких проблем. Что касается - так buf2 это и есть buf1+1, чего здесь удивительного? Сделай так: Код (Text): lea eax, buf1 PrintDec eax lea eax, buf2 PrintDec eax и увидешь примерно такой результат: eax = 4206615 (Test Project.inc, 38) eax = 4206616 (Test Project.inc, 40) Адреса buf1 и buf2 идут друг за другом, и ничего удивительного нет в том, что buf1+1=buf2. Было бы странно, если бы это было не так.
В примере шо я выложил Buf2 как раз и лежит перед MsgBoxCaption. И если я тебя правильно понимаю invoke wsprintf,offset Buf2,offset Helo,eax перезапишет данные которые находятся в MsgBoxCaption? Хмм... интерестно ельзя ли это использовать для неявной передачи данных от процедуры к процедуре.
Уже копаю. Весьма забавные моменты возникают. Для крутой защиты не знаю, а вот запудрить мозги отладчикам и эвристикам усяким пожалуй можно. По крайней мере там где не присутствують "Глаза наблюдателя" ))
Grevgeny "Теперь как я понимаю str1 должно выделяться место когда мы в нее будем пихать данные по ходу работы." Это не похоже на правду. Вы хотите сказать, что при копировании в переменную, обозначенную ? место будет выделяться автоматически?.. Не похоже...
Угу похоже на то что как у меня в примере: .data Buf2 db ? MsgBoxCaption db "Имя компа %s",0 При записи в Buf2, данные MsgBoxCaption перезаписываются, что дает нам возможность скрыто передать данные. Допустим 1 процедура записывает какое-то значение в Buf2 ну со смещением на один байт, а через какое то продолжительное время мы эти же данные возьмем через MsgBoxCaption. Весьма трудно будет сообразить как они там оказались