Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2012, 12:26   #1
Denutrror
Пользователь
 
Регистрация: 18.08.2010
Сообщений: 59
По умолчанию Инъекция кода.

Пожалуйста, помогите разобраться.
Есть такой код:

var
rw : cardinal;
ThreadHand: THandle;
ProcId, hProcess, UBytes, USize: DWord;
threadaddr1, ParamAddr, UBuf: Pointer;

Код:
procedure asm_code(aPParams:PParams);Stdcall; 
var
p1,p2: dword;
begin                                    
asm
    pop p1                     
    push p1                      
    mov p2,$6B51d0             
    mov ecx,edi                 
    Lea Edi,[eax+4]          
    MOV EDX,ECX                 
    jmp p2                   
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
GetWindowThreadProcessId( FindWindow('ElementClient Window', nil), @ProcID);
hProcess:= OpenProcess(PROCESS_ALL_ACCESS, False, ProcID);
if hprocess <> 0 then
  begin
ThreadAddr1 := VirtualAllocEx(hProcess, nil, 68, MEM_COMMIT, PAGE_READWRITE);

WriteProcessMemory(hprocess, ThreadAddr1, @asm_code, 68, UBytes);
end;
end;
В ThreadAddr1, лежит адрес начала внедрённого кода.
Теперь мне нужно вставить jmp, на этот код в память приложения. Я делаю это следующим образом:

Код:
procedure asm_codejmp(aPParams:PParams);Stdcall;
begin                                  
asm
jmp threadaddr1
 end;
 end;

procedure TForm1.Button3Click(Sender: TObject);
begin
GetWindowThreadProcessId( FindWindow('ElementClient Window', nil), @ProcID);
hProcess:= OpenProcess(PROCESS_ALL_ACCESS, False, ProcID);
WriteProcessMemory(hprocess, ptr($6B51CE), @asm_codejmp, 8, rw);
end;
Но в итоге начиная с адреса $6B51CE приложения, вписываются следующие 3 строки:


1. почему помимо jmp`а в память приложения вписываются:
PUSH EBP
MOV EBP,ESP
?
2. и почему при любом значении threadaddr1, jamp происходит на значение ячейки по адресу $D1456C04 ?
Denutrror вне форума Ответить с цитированием
Старый 18.11.2012, 12:40   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
почему помимо jmp`а в память приложения вписываются:
Потому что процедура asm_codejmp так компилируется.
Вообще ты зря вписываешь часть своего кода - не извесно что еще докомпилирует Делфи к нему. Лучше переведи АСМ в его бинарное представление, которое вгони в строку, и уже ее вписывай.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.11.2012, 18:46   #3
xoodoo
Форумчанин
 
Регистрация: 11.04.2012
Сообщений: 212
По умолчанию

Цитата:
почему
PUSH EBP
MOV EBP,ESP ?
Как минимум потому что объявлены локальные переменные p1,p2: dword;
xoodoo вне форума Ответить с цитированием
Старый 21.11.2012, 14:53   #4
Denutrror
Пользователь
 
Регистрация: 18.08.2010
Сообщений: 59
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Лучше переведи АСМ в его бинарное представление, которое вгони в строку, и уже ее вписывай.
Согласен с Вами. Были подобные мысли на этот счёт. Но как мне тоже самое сделать с переходом на внедрённый код? Ведь мой код вписывается в любое свободное, на тот момент, пространство в памяти процесса. И получается, что адрес, на который будет произведён jamp, каждый раз будет разным.
В принципе у меня только здесь возникают проблемы, не знаю, как правильно вписать в память приложения jmp на внедрённый код.
Пожалуйста, подскажите, если есть какие-нибудь решения или идеи по этому поводу.

Цитата:
Сообщение от xoodoo Посмотреть сообщение
Как минимум потому что объявлены локальные переменные p1,p2: dword;
Обратил внимание, что: если убрать эти две переменные, и оставить к примеру только MOV EAX,EAX, то всё равно перед моим кодом вписываются эти две операции. Я не очень хорошо в этом разбираюсь, возможно это какая-то необходимость( хотя, я сомневаюсь). вообще, Delphi дописывает много чего странного, и абсолютно мне ненужного, после моего кода.
Denutrror вне форума Ответить с цитированием
Старый 21.11.2012, 14:58   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
если есть какие-нибудь решения или идеи по этому поводу.
Так, чисто на заметку: Когда то видел пример одного мегакакера примерно такого содержания:

Код:
procedure asm_codejmp(aPParams:PParams);Stdcall;
begin                                   
 lBegin:
 asm
  jmp threadaddr1
 end;
 lEnd:
end;
Где lBegin и lEnd - метки. Какер высчитывал их местоположение, и вписывал не саму процедуру а часть кода из нее между этими метками.
Не в курсе хороший пример или нет, я бы не пробовал, но если тебе интересно поковыряться - попробуй.
Цитата:
вообще, Delphi дописывает много чего странного, и абсолютно мне ненужного, после моего кода.
Так может всетки скажешь зачем тебе именно такой путь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.11.2012, 16:20   #6
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Лучше запиши в память процесса название dll'ки, сделай CreateRemoteThread с адресом LoadLibrary (он должен быть одинаковый во всех процессах), а в dll'ке - всё, что нужно, можно и на Delphi.
Somebody вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Инъекция своего кода в чужое приложение. Denutrror Общие вопросы Delphi 2 05.11.2012 15:03
Пересоздание кода Alex Cones Свободное общение 13 24.01.2011 11:02
Распознавание Аски кода и скан кода MyLastHit Общие вопросы Delphi 8 06.12.2010 18:34
SQL-инъекция Dimarik PHP 12 21.07.2010 18:49
Выдернуть куски кода из html-кода trafbite Помощь студентам 7 18.08.2007 13:51