Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Модификация исполняемого кода в Delphi ? 
V
    Опции темы
Robus
  Дата 30.1.2009, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Entire



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 15.12.2005

Репутация: нет
Всего: 1



Привет всем !!!

Нужно сделать доступ к памяти, где лежит код программы. Конечный результат это модификация кода в момент его исполнения. Я всегда работал с ТМТ под виндовс и не знал с таким проблем !!! То есть на ходу модифицировал код. В делфи столкнулся с проблемой ... Как только записывю что-то в часть памяти с кодом, - получаю EXCEPTION ... Ну и со всеми вытекающими ... Вот пример кода:

Код

...
        ASM
          MOV EAX,11
          MOV DWORD PTR DS:[@M1],EAX
          JMP @EXIT
@M1:      DD 12345678H
@EXIT:    MOV EAX,DWORD PTR DS:[@M1]
          MOV N,EAX
        END;
        Button1.Caption :=IntToHex(N,8);
...


Собственно тут "MOV DWORD PTR DS:[@M1],EAX" мы получаем EXCEPTION ... Настройки компилятора перебрал все, линкера так же перебрал ... Можно легко подлинковать DLL из ТМТ но это не красиво, хочется всё аккуратно !!!

Хочу обратить внимание на то, что запись в DS не есть ошибка !!! Хоть сегменты DS и СS имеют разное значение, указывают они на один кусок физической памяти ... Я пробовал ис СS и ЕS - результат тот же !!!

Как побороть проблему ???
PM MAIL   Вверх
Romikgy
Дата 30.1.2009, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



если уж Вы занимается самомодификацией тогда дизассемблируйте 
Цитата(Robus @  30.1.2009,  13:48 Найти цитируемый пост)
ТМТ

да посмотрите что делает она
(правда даже не знаю что это за ТМТ)


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Rrader
  Дата 30.1.2009, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 70
Всего: 191



Вот тебе примеры:

1) Модификация данных через селектор:смещение:
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TMyClass = class(TObject)
  public
    FInt: Integer;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  TestClass: TMyClass;
  TypInfo: Pointer;
begin
  TypInfo := TMyClass;
  asm
          MOV    EAX, TypInfo
          MOV    DL, 1
          CALL   TMyClass.Create
          MOV    EDX, EAX
          MOV    TestClass, EDX
          MOV    EAX, 12345
          { Можно и SS, права позволяют :) }
          MOV    DWORD PTR DS:[EDX + 4], EAX
  end;
  Button1.Caption := IntToStr(TestClass.FInt);
  TestClass.Free;
end;

end.

2) Модификация кода (будем считать, что работаем в пределах одной страницы):
Код

procedure TForm1.Button2Click(Sender: TObject);
var
  N: Integer;
  Addr, Offs: DWORD;
  Info: TMemoryBasicInformation;
  OldProtect: DWORD;
  M2Addr: Pointer;
begin
  OldProtect := 0;
  N := 0;
  asm
          MOV    N, 100
          MOV    EAX, DWORD PTR DS:[@@M2]
          MOV    Addr, EAX
          MOV    Offs, offset @@M2
          JMP    @@M2
  @@M2:
          MOV    EAX, 150
          MOV    N, EAX
  @@M3:
          NOP
  end;
  { Protect = PAGE_EXECUTE_READ }
  if VirtualQuery(Pointer(Offs), Info,
    SizeOf(TMemoryBasicInformation)) <> 0 then
  begin
    if not VirtualProtect(Info.BaseAddress, Info.RegionSize,
      PAGE_EXECUTE_READWRITE, @OldProtect) then
    begin
      ShowMessage(SysErrorMessage(GetLastError));
      Exit;
    end;
    { Protect = PAGE_EXECUTE_READWRITE }
    if VirtualQuery(Pointer(Offs), Info,
      SizeOf(TMemoryBasicInformation)) <> 0 then
    asm
            MOV    EDX, DWORD PTR DS:[@@M3]
            { Patch }
            MOV    DWORD PTR SS:[@@M2], EDX
            MOV    M2Addr, offset @@M2
            MOV    EAX, 500
            MOV    ECX, 200
            JMP    M2Addr
    @@M2:
            { Затёрто }
            MOV    ECX, EAX
            NOP
            NOP
    @@M3:
            MOV    ECX, ECX
            NOP
            NOP
            MOV    N, ECX
    end;
  end;
  Button2.Caption := IntToStr(N);
end;

Переписал второй пример, просьба всех потестировать! Должно выводить 200 на Caption. Если закомментировать строчку под { Path }, то 500

Это сообщение отредактировал(а) Rrader - 30.1.2009, 17:44


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Robus
Дата 30.1.2009, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Entire



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 15.12.2005

Репутация: нет
Всего: 1



Rrader, поробовал твой вариант #2 !!! Получаю EXCEPTION вот в этом месте:

Код

if not VirtualProtect(Info.BaseAddress, Info.RegionSize,
      PAGE_EXECUTE_READWRITE, @OldProtect)


Вообще-то ... Я не совсем понял что оно вообще делает ??? По "JMP M2Addr" мы должны попасть в первый АСМ кусочек ... Но не доходим до этого !!!

Я понимаю, что нужно включить разрешение записи в СЕГМЕНТ, просто не знаю как это делать из под винды !!! Но в любом случае "VirtualProtect" не исполняется корректно и вызывает дикие огорчения у DELPHI !!!

И ещё ... В OldProtect ничего не записано !!! Это так надо ??? Или "VirtualProtect" туда должен записать ?
PM MAIL   Вверх
Rrader
  Дата 30.1.2009, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 70
Всего: 191



Robus, сможешь тестовый проект дать, и какая версия Delphi? 

Выкладываю свой проект, просьба всех протестировать! Указания есть в моем предыдущем посте.


Это сообщение отредактировал(а) Rrader - 30.1.2009, 17:50

Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  Asm.rar 6,17 Kb


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Qu1nt
Дата 31.1.2009, 00:28 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 18
Всего: 50



Delphi 7, Turbo Delphi. Все работает корректно = )
PM MAIL   Вверх
Robus
Дата 25.6.2009, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Entire



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 15.12.2005

Репутация: нет
Всего: 1



Спасибо, я разобался ... Теперь могу строить само-изменяющийся код в момент исполнения ...
PM MAIL   Вверх
CodeMonkey
Дата 25.6.2009, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Код
function WriteProtectedMemory(BaseAddress, Buffer: Pointer; Size: Cardinal; out WrittenBytes: Cardinal): Boolean;
var
  OldProtect, Dummy: Cardinal;
begin
  WrittenBytes := 0;
  if Size > 0 then
  begin
    Result := VirtualProtect(BaseAddress, Size, PAGE_EXECUTE_READWRITE, OldProtect);
    if Result then
    try
      Move(Buffer^, BaseAddress^, Size);
      WrittenBytes := Size;
      if OldProtect in [PAGE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE, PAGE_EXECUTE_WRITECOPY] then
        FlushInstructionCache(GetCurrentProcess, BaseAddress, Size);
    finally
      VirtualProtect(BaseAddress, Size, OldProtect, Dummy);
    end;
  end;
  Result := (WrittenBytes = Size);
end;



--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2101 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.