1043

Delphi

Сделаем такой примерчик: Поцепим на форму один Memo и одну кнопку. Напишем такой код: procedure TForm1.Button1Click(Sender: TObject); begin Asm int 3 end; memo1.Lines.savetoFile(''hz.txt''); end; Я поставил int 3 чтоб было легко найти то место, где будет вызваться memo1.Lines.savetoFile. Запускаем нашу супер прогу. Делаем bpint 3. Жмем на нашу единственную кнопку. Попадем в айс. Сменим eip на адрес следующей команды. На жеж не надо чтоб int 3 выполнилось. И пройдем до адреса 44FC41. Увидим такое: EAX=00BC3544 EBX=00BC3604 ECX=004284A8 EDX=0044FC50 ESI=00BC1A18 EDI=0068F4AC EBP=0068F470 ESP=0068F330 EIP=0044FC41 o d I s z a P c CS=015F DS=0167 SS=0167 ES=0167 FS=0F3F GS=0000 DS:00BC3544=00427080 -----PROJECT1!CODE+0004EC50-----------------------byte--------------PROT---(0)-- 0167:0044FC50 68 7A 2E 74 78 74 00 00-55 8B EC 33 C0 55 68 7D hz.txt..U..3.Uh}^ -------------------------------------------------------------------------PROT32- 015F:0044FC2F INT 3 015F:0044FC30 MOV EAX,[ESI+000002F0] 015F:0044FC36 MOV EAX,[EAX+00000220] 015F:0044FC3C MOV EDX,0044FC50 015F:0044FC41 MOV ECX,[EAX] 015F:0044FC43 CALL [ECX+74] В edx лежит адрес строки ''hz.txt''. Больше тут смотреть неначто. Теперь сделаем из нашего кода вот такую вещь: procedure TForm1.Button1Click(Sender: TObject); begin Asm int 3 end; memo1.Lines.LoadfromFile(''hz.txt''); end; При вызове этого мы в айсе увидим следующее: EAX=00BC3544 EBX=00BC3604 ECX=00427080 EDX=0044FC4C ESI=004283A4 EDI=0068F4AC EBP=0068F470 ESP=0068F334 EIP=0044FC40 o d I s z a P c CS=015F DS=0167 SS=0167 ES=0167 FS=3D37 GS=0000 DS:004270E8=00414ECC -----PROJECT1!CODE+0004EC4C-----------------------byte--------------PROT---(0)-- 0167:0044FC4C 68 7A 2E 74 78 74 00 00-55 8B EC 33 C0 55 68 79 hz.txt..U..3.Uhy^ -------------------------------------------------------------------------PROT32- 015F:0044FC2C INT 3 015F:0044FC2D MOV EAX,[EAX+000002F0] 015F:0044FC33 MOV EAX,[EAX+00000220] 015F:0044FC39 MOV EDX,0044FC4C 015F:0044FC3E MOV ECX,[EAX] 015F:0044FC40 CALL [ECX+68] Один интересный момент! В принципе тут все одинаково с предидущим кодом. Только изменился адрес строки и значение ECX, а также теперь идет CALL [ECX+68], вместо CALL [ECX+74]... А теперь делаем такую подлость: удаляем для чистоты эксперимента файл "hz.txt". Запускаем прогу, где у нас идет memo1.Lines.LoadfromFile(''hz.txt''); И когда дойдем до 015F:0044FC40 CALL [ECX+68] изменим его на 015F:0044FC40 CALL [ECX+74] И выполним. Ну как? нравится? был создан hz.txt! Т.е. выполнилась memo1.Lines.savetoFile(''hz.txt''); Вот так-то! При компиляции exe файлов делфи пихает все процедуры и свойства юзаемых компонентов даже если они не юзаются. Благодаря этому файлы временами имеют гигантские размеры. Какие можно сделать выводы?
0