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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как избавиться от перехвата ф-ций АПИ 
V
    Опции темы
RideX
Дата 3.9.2006, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 94
Регистрация: 8.9.2004

Репутация: 4
Всего: 7



Посмотреть экспортируемую функцию любого загруженного модуля можно без лишних извратов и левых тулз, а только средствами Delphi, например, так:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  hModule: THandle;
  arr: array[1..32] of byte;
  buff: String;
  i: integer;
begin
  hModule := GetModuleHandle('user32.dll');
  CopyMemory(@arr, GetProcAddress(hModule, 'MessageBoxA'), SizeOf(arr));
  for i := 1 to SizeOf(arr) do
    buff := buff + IntToHex(arr[i], 2) + ' ';

  Memo1.Lines.Append(buff);
end;


Или через родной дизассемблер Delphi путём вызова интересующей ф-ции, например:
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  MessageBoxA(0, 'lpText', 'lpCaption', MB_ICONINFORMATION);
end;


Поставив breakpoint и остановившись на нём, жмём Ctr+Alt+C, чтобы попасть в окно CPU встроенного отладчика:
Код

Unit1.pas.28: MessageBoxA(0, 'lpText', 'lpCaption', MB_ICONINFORMATION);
0044E1D4 6A40            push $40
0044E1D6 68E8E14400      push $0044e1e8
0044E1DB 68F4E14400      push $0044e1f4
0044E1E0 6A00            push $00
0044E1E2 E85587FBFF      call MessageBoxA
Unit1.pas.29: end;


Далее просто трассируем по F7, пока не попадем в системную библиотеку:
Код

USER32.MessageBoxA:
77D7050B 8BFF            mov edi,edi
77D7050D 55              push ebp
77D7050E 8BEC            mov ebp,esp
77D70510 833D1C04D97700  cmp dword ptr [$77d9041c],$00

PM   Вверх
dumb
Дата 4.9.2006, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

Репутация: 13
Всего: 158



Цитата(RideX @  3.9.2006,  21:13 Найти цитируемый пост)
Посмотреть экспортируемую функцию любого загруженного модуля можно без лишних извратов и левых тулз, а только средствами Delphi

"без лишних извратов и левых тулз" ты увидишь уже похуканный код. "левые тулзы" же показывают оригинальный код.
PM MAIL   Вверх
Romikgy
Дата 4.9.2006, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Все избавился , от этого зверя , с танцами и бубнами, 
и в безопасном режиме + коммандная строка, удалось залезть в реестр и все поправить smile
Тема закрыта smile Всем еще раз сенкс smile


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

PM   Вверх
RideX
Дата 4.9.2006, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 94
Регистрация: 8.9.2004

Репутация: 4
Всего: 7



Цитата(dumb @  4.9.2006,  12:41 Найти цитируемый пост)
"без лишних извратов и левых тулз" ты увидишь уже похуканный код. "левые тулзы" же показывают оригинальный код.

Ты ошибаешься, я увижу то, что захочу увидеть smile , запишу в любой процесс, в т.ч. системный (не говоря уже о DLL) то что захочу, и, как я уже раньше говорил, "без лишних извратов и левых тулз". Просто вообще-то это форум по программированию в Delphi, а не по реверсу, так что хью, петулз и лордпе вроде здесь как не к месту. Ну, и чтобы не оффтоп, в заключении приведу небольшой примерчик только на чтение ф-ции из памяти и соответствующую ей из файла с диска:
Код

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.ReadOnly   := True;
  Memo1.WordWrap   := False;
  Memo1.ScrollBars := ssBoth;
  Memo1.Font.Name  := 'Courier New';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  hModule         : THandle;
  pProcAddr       : Pointer;
  szProcName      : PChar;
  szFileName      : array[0..MAX_PATH + 1] of Char;

  pDOSHeader      : PImageDosHeader;
  pFileHeader     : PImageFileHeader;
  pNtHeader       : PImageNtHeaders;
  pOptionalHeader : PImageOptionalHeader;
  pSECTHeader     : PImageSectionHeader;

  hFile, hFileMap : THandle;
  pFileMap        : Pointer;
  RVA, FileOffset : DWORD;
  buff            : String;
  arr             : array[0..15] of byte;
  i               : integer;
begin
  szProcName := 'MessageBoxA';
  hModule   := GetModuleHandle('user32.dll');
  GetModuleFileName(hModule, @szFileName, MAX_PATH);
  pProcAddr := GetProcAddress(hModule, szProcName);
  RVA := DWORD(pProcAddr) - hModule;

  hFile := CreateFileA(szFileName, GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE,
            nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if hFile = INVALID_HANDLE_VALUE then
    Exit;

  hFileMap := CreateFileMapping(hFile, nil, PAGE_READONLY, 0, 0, nil);
  pFileMap := MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0);

  pDOSHeader := PImageDosHeader(pFileMap);
  pNtHeader := Pointer(DWORD(pDOSHeader) + DWORD(pDOSHeader._lfanew));
  pFileHeader := @pNtHeader.FileHeader;
  pOptionalHeader := @pNtHeader.OptionalHeader;

  pSECTHeader :=  PImageSectionHeader(DWORD(pNtHeader) + SizeOf(TImageNtHeaders));

  for i := 1 to pNtHeader.FileHeader.NumberOfSections do begin
    if RVA > pSECTHeader.VirtualAddress + pSECTHeader.Misc.VirtualSize then
      Inc(pSECTHeader);
  end;

  FileOffset := RVA - pSECTHeader.VirtualAddress + pSECTHeader.PointerToRawData;

  with Memo1.Lines do begin
    Append(szFileName);
    Append('--');
    Append('ImageBase:           ' + IntToHex(pOptionalHeader.ImageBase, 8));
    Append('AddressOfEntryPoint: ' + IntToHex(pOptionalHeader.AddressOfEntryPoint, 8));
    Append('NumberOfSections:    ' + IntToHex(pNtHeader.FileHeader.NumberOfSections, 8));
    Append('--');
    Append('ProcName:            ' + szProcName);
    Append('ProcAddress:         ' + IntToHex(DWORD(pProcAddr), 8));
    Append('RelativeAddress:     ' + IntToHex(RVA, 8));
    Append('FileOffset:          ' + IntToHex(FileOffset, 8));
    Append('--');
    Append('Section name:        ' + PChar(@pSECTHeader.Name));
    Append('VirtualAddress:      ' + IntToHex(pSECTHeader.VirtualAddress, 8));
    Append('PointerToRawData:    ' + IntToHex(pSECTHeader.PointerToRawData, 8));
    Append('VirtualSize:         ' + IntToHex(pSECTHeader.Misc.VirtualSize, 8));
    Append('--');
    Append('Entry of function: memory vs file');
  end;

  CopyMemory(@arr, pProcAddr, SizeOf(arr));
  for i := 0 to SizeOf(arr) - 1 do
    buff := buff + IntToHex(arr[i], 2) + ' ';
  Memo1.Lines.Append(buff);

  buff := '';
  CopyMemory(@arr, Pointer(DWORD(pFileMap) + FileOffset), SizeOf(arr));
  for i := 0 to SizeOf(arr) - 1 do
    buff := buff + IntToHex(arr[i], 2) + ' ';
  Memo1.Lines.Append(buff);

  UnmapViewOfFile(pFileMap);
  CloseHandle(hFileMap);
  CloseHandle(hFile);
end;

end.


Понятно что всё можно автоматизировать и усовершенствовать, это для наглядности, выведет информацию в таком виде:
Код

C:\WINDOWS\system32\user32.dll
--
ImageBase:           77D30000
AddressOfEntryPoint: 00010EB9
NumberOfSections:    00000004
--
ProcName:            MessageBoxA
ProcAddress:         77D7050B
RelativeAddress:     0004050B
FileOffset:          0003F90B
--
Section name:        .text
VirtualAddress:      00001000
PointerToRawData:    00000400
VirtualSize:         0005EDA7
--
Entry of function: memory vs file
8B FF 55 8B EC 83 3D 1C 04 D9 77 00 74 24 64 A1 
8B FF 55 8B EC 83 3D 1C 04 D9 77 00 74 24 64 A1 



Это сообщение отредактировал(а) RideX - 4.9.2006, 22:46
PM   Вверх
Romikgy
Дата 4.9.2006, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



RideX, а в чужом процессе можно ли как то поменять адресса вызовов ф-ций?


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

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


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 94
Регистрация: 8.9.2004

Репутация: 4
Всего: 7



Цитата(Romikgy @  5.9.2006,  02:00 Найти цитируемый пост)
в чужом процессе можно ли как то поменять адресса вызовов ф-ций?

Вызов одной API заменить на другую? В принципе можно изменить абсолютно всё, даже константы (пример кода недавно давал),  только делать это нужно внимательно, так при подмене API функции не забывать передавать ей "новые", правильные параметры, помнить о типе возвращаемого значения, если оно используется, следить чтобы код "не поломался", т.е. чтобы, например, "старая", но нужная инструкция процессора не "разорвалась".
PM   Вверх
Romikgy
Дата 5.9.2006, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



это понятно , я имел ввиду, есть хукнутая ф-ция, как мне взяв ее реальный адресс из файла , и поменять на реальный , а не хукнутый? допустим в regedit


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

PM   Вверх
dumb
Дата 5.9.2006, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

Репутация: 13
Всего: 158



RideX,
- можно взять клещи или гвоздодер и выдернуть гвоздь.
- изврат, левые тулзы! можно взять микроскоп и в лучшем виде рассмотреть гвоздь!
- пардон, но...
- вы ошибаетесь! возму вот микроскоп, скую мини-девайс для извлечения гвоздей. и вообще, я все могу.

Цитата(Romikgy @  31.8.2006,  11:18 Найти цитируемый пост)
как мне программно (самому написать) или другим ПО, избавится от этой dll ?

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

а сэмпл добротный.
PM MAIL   Вверх
dumb
Дата 5.9.2006, 04:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

Репутация: 13
Всего: 158



Цитата(Romikgy @  5.9.2006,  00:10 Найти цитируемый пост)
есть хукнутая ф-ция, как мне взяв ее реальный адресс из файла , и поменять на реальный , а не хукнутый? допустим в regedit 

в данном случае отличаются не адреса(Romikgy - реальный программер! только почему тогда с одной "д"? ;)) а содержимое функций: в начало "правильной" функции вписывается переход на "подставную". т.е. чтобы убрать хук, достаточно заменить код перехода на считанные из файла оригинальные байтики. так как адресные пространства процессов изолированы, сие действо нужно совершать "изнутри" каждого процесса. проще всего, наверное, будет поставить глобальный хук(например WH_CBT) и реализовать код "восстановления" в dll нашего хука. к тому же получаем бонус в виде возможности довольно часто проверять наши восстановленные функции(лучше после CallNextHookEx, на случай если "зараза" тоже восстанавливается при вызове WH_CBT).

кстати, если уж так залезли в эту тему, интересно - как именно реализована подгрузка у этой "заразы". просто есть подозрение, что в режиме командной строки регедит остался бы нетронутым...
PM MAIL   Вверх
Romikgy
Дата 5.9.2006, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(dumb @  5.9.2006,  03:44 Найти цитируемый пост)
в данном случае отличаются не адреса

Я имел ввиду адреса прыжков на ф-ции


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

PM   Вверх
dumb
Дата 5.9.2006, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

Репутация: 13
Всего: 158



Romikgy, пример:
было:
Код

somefunc:
8BFF                         mov         edi,edi
55                           push        ebp
8BEC                         mov         ebp,esp
83EC18                       sub         esp,018


стало:
Код

somefunc:
E978563412                   jmp         012345678
83EC18                       sub         esp,018


тут не нужно менять адрес перехода(jmp), надо сам переход заменять на то, что было.
PM MAIL   Вверх
RideX
Дата 5.9.2006, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 94
Регистрация: 8.9.2004

Репутация: 4
Всего: 7



Цитата(Romikgy @  5.9.2006,  03:10 Найти цитируемый пост)
есть хукнутая ф-ция, как мне взяв ее реальный адресс из файла , и поменять на реальный , а не хукнутый? допустим в regedit
 В самом .ехе у тебя вообще ничего не изменяется. Все изменения только в загруженой в память DLL, но адреса функций, как уже сказал dumb, всё равно не изменяются, они так и остаются "реальными". Изменяется само содержимое ф-ции, вот его ты и можешь взять из файла и сравнить с тем, что в памяти. Как найти и рассчитать внутрифайловое смещение функции - в коде выше. Чтобы записать код из файла в системную DLL, возьми для своего процесса привилегии отладчика (SeDebugPrivilege) чтобы открыть процесс на запись. После WriteProcessMemory проверяй на GetLastError и в случае необходимости поставь доступ к странице памяти PAGE_EXECUTE_READWRITE, потом вернёшь обратно.


Цитата(dumb @  5.9.2006,  03:44 Найти цитируемый пост)
возму вот микроскоп, скую мини-девайс
 Всё, сдаюсь!  smile 

Цитата(dumb @  5.9.2006,  07:44 Найти цитируемый пост)
как именно реализована подгрузка у этой "заразы". просто есть подозрение, что в режиме командной строки регедит остался бы нетронутым

Да, возможно, скорее всего ловит процесс через создание окна, хуком на HSHELL_WINDOWCREATED, и в реализации не сложно.

dumb, не видел что ты только что уже написал  smile 

Это сообщение отредактировал(а) RideX - 5.9.2006, 12:10
PM   Вверх
Romikgy
Дата 5.9.2006, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(dumb @  5.9.2006,  10:45 Найти цитируемый пост)
было:
Выделить всёкод Ассемблера
somefunc:
E978563412                   jmp         012345678
83EC18                       sub         esp,018

это после хука такое?

Это сообщение отредактировал(а) Romikgy - 5.9.2006, 13:11


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

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


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 94
Регистрация: 8.9.2004

Репутация: 4
Всего: 7



Цитата(Romikgy @  5.9.2006,  16:10 Найти цитируемый пост)
это после хука такое?

Да, именно, хотя возможен вариант с push/ret
Код

push xxxxxxxx
ret


Вот, к примеру, похуканый MessageBox может выглядеть так:
Код

C:\WINDOWS\system32\user32.dll
--
ImageBase:           77D30000
AddressOfEntryPoint: 00010EB9
NumberOfSections:    00000004
--
ProcName:            MessageBoxExA
ProcAddress:         77D7057D
RelativeAddress:     0004057D
FileOffset:          0003F97D
--
Section name:        .text
VirtualAddress:      00001000
PointerToRawData:    00000400
VirtualSize:         0005EDA7
--
Entry of function: memory vs file
68 BC 36 B1 00 C3 FF FF 75 18 FF 75 14 FF 75 10
8B FF 55 8B EC 6A FF FF 75 18 FF 75 14 FF 75 10


Как видишь первые шесть байт кода в памяти, отличаются от того что в файле, т.е. ,без дизассемблера понятно, что фактически в памяти имеем переход "куда-то там..." по адресу 00B136BCh
Код

68 BC36B100 push 00B136BC
C3          ret


P.S. Вообще чтобы не перекомпилить каждый раз код, который я приводил, кинь на форму два TEdit, один для имени DLL, второй для имени ф-ции, конечно если ты уже не сделал TMemo/TStringList с целым списком функций для проверки smile 
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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