Сейчас на форуме: zombi-vadim, zds (+4 невидимых)

 eXeL@B —› Программирование —› Перехват API
. 1 . 2 . 3 . >>
Посл.ответ Сообщение

Ранг: 9.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 06 мая 2007 20:16
· Личное сообщение · #1

люди добрые помогите!Задача такая нада при вызове определенной API передать управление моей проге.
Если у кого есть исходники на masm залейте куданить плизз.
зарание сенкс и извините за возможное повторение темы но в поиске я ниче нинашел!




Ранг: 420.3 (мудрец)
Активность: 0.240
Статус: Участник

Создано: 06 мая 2007 20:25
· Личное сообщение · #2

bitmaster
Почитай тут http://wasm.ru/publist.php?list=6 и тут http://wasm.ru/publist.php?list=21 .

-----
Сколько ни наталкивали на мысль – все равно сумел увернуться





Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 06 мая 2007 20:48
· Личное сообщение · #3

bitmaster
Посмотри эту статью http://www.rsdn.ru/article/baseserv/IntercetionAPI.xml .Там,правда,на Cи,но не разберётся там только ленивый.

-----
the Power of Reversing team




Ранг: 6.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 09 мая 2007 05:33
· Личное сообщение · #4

Держи и разбирайся.

aa77_08.05.2007_CRACKLAB.rU.tgz - Inject.rar




Ранг: 307.9 (мудрец), 196thx
Активность: 0.180
Статус: Участник

Создано: 10 мая 2007 07:59
· Личное сообщение · #5

а можно тоже самое на Делфях ?

-----
Don_t hate the cracker - hate the code.





Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 10 мая 2007 19:13
· Личное сообщение · #6

mysterio
Дык,Ms-Rem же писал как раз на Дельфях:
Перехват API функций в Windows NT (часть 1). Основы перехвата. http://www.wasm.ru/article.php?article=apihook_1

-----
the Power of Reversing team





Ранг: 307.9 (мудрец), 196thx
Активность: 0.180
Статус: Участник

Создано: 10 мая 2007 19:35
· Личное сообщение · #7

Перехват API функций в Windows NT (часть 1). Основы перехвата.
Давно качал... совсем забыл про это... спс что напомнил. Старею - чертов склероз.

-----
Don_t hate the cracker - hate the code.




Ранг: 25.7 (посетитель), 4thx
Активность: 0.030
Статус: Участник

Создано: 26 июля 2012 13:23 · Поправил: g3r0n1m0
· Личное сообщение · #8

Из "Перехват API функций в Windows NT (часть 2)":
В среде Borland C++ Builder некоторые приведенные приёмы неосуществимы (в связи с особенностями генерации кода компилятором).
1) с чем это связано;
2)изменилась ли ситуация в следующих версиях(Codegear или Embarcadero RAD Studio ). Я так понимаю здесь имелся в виду C++Builder 6
3)"особенностями генерации кода компилятором" - можно ли это исправить, например ассемблерными вставками.
Просто привык сильно к этой среде




Ранг: 392.8 (мудрец), 108thx
Активность: 0.260.01
Статус: Участник
REVENGE сила, БеХоЦе могила

Создано: 26 июля 2012 16:42 · Поправил: Maximus
· Личное сообщение · #9

g3r0n1m0 все осуществимо. Я делаю все proxy dll в дельфе 5.

Во вложении пример, заготовка для всех basic программ.
3738_26.07.2012_EXELAB.rU.tgz - 1.rar

Там остается только сделать перехват любой API, какой вздумается.
Для примера я перехватил RegQueryValueExA

-----
StarForce и Themida ацтой!




Ранг: 6.8 (гость), 1thx
Активность: 0.020
Статус: Участник

Создано: 24 июня 2013 19:57 · Поправил: volopas
· Личное сообщение · #10

В Перехват API функций в Windows NT (часть 2) есть архив с примерами. Пример InjectDllEx.dpr работает , но если применять CreateProcessWithDllEx , то Блокнот не выходит из приостановленного состояния. После ResumeThread на точку входа в Блокнот попадает, но дальше CreateWindowExW возвращает 0 и завершается. Сразу после возврата CreateWindowExW попробовал перескочить на GetLastError . Выдало 7F. Что означает The specified procedure could not be found. Но все равно причина не ясна. В чем причина?



Ранг: 6.8 (гость), 1thx
Активность: 0.020
Статус: Участник

Создано: 25 июня 2013 17:00 · Поправил: volopas
· Личное сообщение · #11

Похоже, проблема в создании удаленных потоков и запуске их, пока главный поток стоит. Если процесс создается с флагом CREATE_SUSPENDED , то процесс не отображается в списке процессов , по крайней мере Ольга не видит его в окне Attach (Кстати , как приаттатчиться к такому процессу Ольгой? ), но как только создается удаленный поток, то процесс notepad.exe появляется.

Здесь у топикстартер пишет, что тоже если стартует не основной поток , то потом нифига не работает.



Ранг: 17.7 (новичок), 13thx
Активность: 0.010
Статус: Участник

Создано: 25 июня 2013 17:08
· Личное сообщение · #12

При CREATE_SUSPENDED даже импорт не парсится и никакие внешние dll'ки не загружаются в процесс. Соответственно, приаттачиться в таком состоянии невозможно.



Ранг: 6.8 (гость), 1thx
Активность: 0.020
Статус: Участник

Создано: 25 июня 2013 17:21
· Личное сообщение · #13

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



Ранг: 17.7 (новичок), 13thx
Активность: 0.010
Статус: Участник

Создано: 25 июня 2013 17:49
· Личное сообщение · #14

А что мешает использовать DEBUG_PROCESS с int3 в Entry Point, например?



Ранг: 6.8 (гость), 1thx
Активность: 0.020
Статус: Участник

Создано: 25 июня 2013 18:01
· Личное сообщение · #15

>> А что мешает использовать DEBUG_PROCESS с int3 в Entry Point, например?

После инжекта мой процесс закроется и убьет созданный процесс. Смысла тогда не вижу в инжекте длл.



Ранг: 17.7 (новичок), 13thx
Активность: 0.010
Статус: Участник

Создано: 25 июня 2013 18:12
· Личное сообщение · #16

volopas пишет:
После инжекта мой процесс закроется и убьет созданный процесс.

Твой процесс будет выступать отладчиком для запускаемого процесса. Ничего не закроется и ничего не убьётся.



Ранг: 6.8 (гость), 1thx
Активность: 0.020
Статус: Участник

Создано: 25 июня 2013 18:15
· Личное сообщение · #17

>>Твой процесс будет выступать отладчиком для запускаемого процесса
А разве после закрытия отладчика, отлажываемый процесс не убивается? Этим приемом автор статьи кстати убивает Касперского (кслову противодействовать этому очень просто, если в драйвер сам запустит отладку касперского)



Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 25 июня 2013 18:57
· Личное сообщение · #18

volopas
--> Link <--



Ранг: 6.8 (гость), 1thx
Активность: 0.020
Статус: Участник

Создано: 25 июня 2013 19:26 · Поправил: volopas
· Личное сообщение · #19

Про отладчик - это всё костыли. Тогда уж проще написать отладчик или написать прогу , которая будет нажимать на кнопки в стороннем отладчике (напр. Ольге) и этот отладчик будет перехватывать API через родные приемы бряков. Я же хочу понять суть ошибки в применении CreateProcessWithDllEx и хочу добиться перехвата через инжекцию длл без костылей и отладчиков.

Подскажите , в какую сторону копать. Почему если стартует неосновной поток, то потом ничего не работает? Если приаттатчится к процессу с отработавшими неосновными потоками, но остановленным основным (теперь он будетт виден в Ольге), то в окне Потоков в столбике Entry основной поток имеет 00000000. А если запускать блокнот в Ольге , то там стоит точка входа



Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 25 июня 2013 20:18
· Личное сообщение · #20

volopas
а в чем проблема я не понимаю отладить свой код и посмотреть что и почему не воркает/падает? может что то не так делаешь? где твои сорцы?




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 25 июня 2013 20:20
· Личное сообщение · #21

volopas пишет:
Похоже, проблема в создании удаленных потоков и запуске их, пока главный поток стоит

Проблема в том, что кто-то как нихрена не читал и не хотел делать, так и продолжает в том же духе. Кстати, как там старфорс - уже распаковался?

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 6.8 (гость), 1thx
Активность: 0.020
Статус: Участник

Создано: 25 июня 2013 20:45 · Поправил: volopas
· Личное сообщение · #22

>>а в чем проблема я не понимаю отладить свой код и посмотреть что и почему не воркает/падает? может что то не так делаешь? где твои сорцы?

Все исходники в файле advApiHook.rar к второй части статьи:

TestDll.dll вообще не компилировал , взял готовую
InjectDllEx.dpr Переписал следующим образом:
Code:
  1. {
  2.  Демонстрация внедрения Dll альтернативным способом.
  3.  Copyright by Ms-Rem (Ms-Rem@yandex.ru) ICQ 286370715
  4. }
  5. program aInjectDllEx;
  6.  
  7. uses
  8.   Windows,
  9.   advApiHook;
  10.   
  11. var
  12.   StartInfo: TStartupInfo;
  13.   ProcInfo: TProcessInformation;
  14.   sFile: dword;
  15.   Size: dword;
  16.   Buff: pointer;
  17.   BytesReaded: dword;
  18.  
  19. begin
  20.  
  21.   //считываем Dll в память
  22.   sFile := CreateFile('TestDll.dll', GENERIC_READ, FILE_SHARE_READ,
  23.                       nil, OPEN_EXISTING, 0, 0);
  24.   Size := GetFileSize(sFile, nil);
  25.   GetMem(Buff, Size);
  26.   ReadFile(sFile, Buff^, Size, BytesReaded, nil);
  27.   CloseHandle(sFile);
  28.  
  29.  
  30.  
  31.   //Запускаем процесс
  32.   ZeroMemory(@StartInfo, SizeOf(TStartupInfo));
  33.   StartInfo.cb := SizeOf(TStartupInfo);
  34.   CreateProcessWithDllEx(nil, 'notepad.exe', nil, nil, False, 0,
  35.                 nil, nil, StartInfo, ProcInfo, Buff);
  36.  
  37.   FreeMem(Buff);
  38. end.



advApiHook.pas не менял:
Code:
  1. ...
  2. {
  3.  Запуск процесса с загрузкой в него Dll альтернативным методом.
  4.  Обеспечивается высокая скрытность загрузки Dll.
  5. }
  6. function CreateProcessWithDllEx(lpApplicationName: PChar;
  7.                                 lpCommandLine: PChar;
  8.                                 lpProcessAttributes,
  9.                                 lpThreadAttributes: PSecurityAttributes;
  10.                                 bInheritHandles: boolean;
  11.                                 dwCreationFlags: dword;
  12.                                 lpEnvironment: pointer;
  13.                                 lpCurrentDirectory: PChar;
  14.                                 const lpStartupInfo: TStartupInfo;
  15.                                 var lpProcessInformation:
  16.                                 TProcessInformation;
  17.                                 Src: pointer): boolean;
  18. begin
  19.   Result := False;
  20.   if not CreateProcess(lpApplicationName,
  21.                        lpCommandLine,
  22.                        lpProcessAttributes,
  23.                        lpThreadAttributes,
  24.                        bInheritHandles,
  25.                        dwCreationFlags or CREATE_SUSPENDED,
  26.                        lpEnvironment,
  27.                        lpCurrentDirectory,
  28.                        lpStartupInfo,
  29.                        lpProcessInformation) then Exit;
  30.                        
  31.   Result := InjectDllEx(lpProcessInformation.hProcess, Src);
  32.   if (dwCreationFlags and CREATE_SUSPENDED) = 0 then
  33.        ResumeThread(lpProcessInformation.hThread);
  34. end;
  35. ...


Все прекрасно работает в моем приложении и DLL отрабатывать (правда окна не видно, так как процесс приостановлен , но если делать инжект после старта Блокнота, то Messagebox вылетает аж бегом). Проблема в уже Блокноте, который не может выйти из SUSPENDED. Я отлаживал его , CreateWindowExW при создании окна класса Edit возвращает 0. А 0 возвращает потому что по адресу $ 00090010 стоит 0, а должно быть 00090010 60 00 00 40 . У вас адрес может быть другой . По-моему это основная куча процесса. Но что это означает, не понял. Методом тыка попробовал закомментировать все процедуры , использующие CreateRemoteThread и блокнот нормально начал работать (естественно, без инжекта)

TЕсли вместо блокнота прописать путь к Пэйнту, то Пэйнт не закрывается , а все таки стартует. Но видно только основное окно , строку меню и полотно, ничего нарисовать нельзя.

da44_25.06.2013_EXELAB.rU.tgz - advApiHook.rar



Ранг: 6.8 (гость), 1thx
Активность: 0.020
Статус: Участник

Создано: 25 июня 2013 20:52
· Личное сообщение · #23

TЕсли вместо блокнота прописать путь к Пэйнту, то Пэйнт не закрывается , а все таки стартует. Но видно только основное окно , строку меню и полотно, ничего нарисовать нельзя.



Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 25 июня 2013 21:04 · Поправил: SReg
· Личное сообщение · #24

volopas компилишь я надеюсь не в юникодной дельфи?

volopas пишет:
Нет , да это вообще не проблема этих исходников. Хотите сказать, у вас работает? Наверняка же не работает. (Я имею в виду восстанавливается ли приложение из suspended-состояния? Сам инжект работает)

я не пойму, какая стоит задача вообще? тупо заинжектить либу или что?



Ранг: 6.8 (гость), 1thx
Активность: 0.020
Статус: Участник

Создано: 25 июня 2013 21:16 · Поправил: volopas
· Личное сообщение · #25

>>volopas компилишь я надеюсь не в юникодной дельфи?

Нет , да это вообще не проблема этих исходников. Хотите сказать, у вас работает? Наверняка же не работает. (Я имею в виду восстанавливается ли приложение из suspended-состояния? Сам инжект работает)
В родном файле InjectDllEx.dpr:
begin
//Запускаем процесс
ZeroMemory(@StartInfo, SizeOf(TStartupInfo));
StartInfo.cb := SizeOf(TStartupInfo);
CreateProcess(nil, 'notepad.exe', nil, nil, False, 0,
nil, nil, StartInfo, ProcInfo);
//считываем Dll в память
sFile := CreateFile('TestDll.dll', GENERIC_READ, FILE_SHARE_READ,
nil, OPEN_EXISTING, 0, 0);
Size := GetFileSize(sFile, nil);
GetMem(Buff, Size);
ReadFile(sFile, Buff^, Size, BytesReaded, nil);
CloseHandle(sFile);

Sleep(2000);

InjectDllEx(ProcInfo.hProcess, Buff);
FreeMem(Buff);
end.

Для чего здесь Sleep(2000); ? Явно и у автора самого не работает. Поэтому он решил исключить пример с использованием CreateProcessWithDllEx, и ограничелся инжектом в уже действующий процесс. Но такой инжект бесполезен, так как целевой процес будет с момента старта беспрепятственно использовать неперехваченные процедуры.




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 26 июня 2013 00:10
· Личное сообщение · #26

volopas
Открою вам правду и истену. Задача должна решаться на основе требований и механизмов, они должны быть изначально чётко определены. Соответственно решенье должно удовлетворять эти требования. Допиливать фундаментально кривое гавно не годится.

Вам нужно загрузить из памяти модуль - не нужен экзешник, он от длл отличается всего лишь одним битом в хидере и релоками(обычно их нет, ибо ядро мапит). Так вот и используйте уже существующие лодеры(лучше вы написать не способны на данный момент), билдите с /dll(фиксапы). Ежели это конечно не зарипанный целиком модуль..

Инжект - бесчисленное количество метод есть. А дедлоки у вас походу на кс нтлдр, вполне вероятно. Низя окна и треды создавать из дллмэйн. Она защищена критической секцией. Обойти есно можно, но вы вначале разберитесь с простейшими вещами.

Самое элементарное решенье - создаём процесс остановленным, загружаем в контекст ссыль на стаб(в rEax вродь, не помню точно). Либо ставим апк в очередь треду. Стандартные методы. А дельфя это уёбищная среда, не удивительно что у вас чота отваливается - она слишком много говна по дефолту линкует.



Ранг: 6.8 (гость), 1thx
Активность: 0.020
Статус: Участник

Создано: 26 июня 2013 07:41 · Поправил: volopas
· Личное сообщение · #27

>>Задача должна решаться на основе требований и механизмов, они должны быть изначально чётко определены.

Задача состоит в перехвате функции ReadFile в целевом приложении, которое практически сразу после запуска использует функцию ReadFile . Лоадер тоже пытается успеть: сначала ReadProcessMemory и если байты есть, то замениь их через WriteProcessMemory , если байтов нет, то sleep(100). А где гарантия, что во время проверки ReadProcessMemory или sleep(100), целевой процесс не успеет обратиться к функции.

Метод четко определен: использовать CreateProcessWithDllEx




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 26 июня 2013 07:57
· Личное сообщение · #28

volopas

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

В любом другом случае придётся с нэйтивом работать. NtReadFile вам же не годится ?

Ну а в цикле вращаться ожидая когда промапится кернел - мусье знает толк в извратах




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 26 июня 2013 09:58
· Личное сообщение · #29

Dr0p
Да что вы с ним возитесь - это ж гроза старфорса свиновод. Уже больше года старфорс анпакает, и всё никак функции перехватывать не научился. Даже блог есть --> вот он <--. Ржака ещё та. А вы ему кернел, отладочный порт.

-----
Stuck to the plan, always think that we would stand up, never ran.


| Сообщение посчитали полезным: Dart Sergius, plutos

Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 26 июня 2013 12:40
· Личное сообщение · #30

volopas пишет:
Задача состоит в перехвате функции ReadFile в целевом приложении, которое практически сразу после запуска использует функцию ReadFile

Создай процесс остановленным, выдели в нем память, поменяй контекст регистра Eip на эту область и запиши туда шеллкод(рипни со стронга), который и вызовет LoadLibrary.


. 1 . 2 . 3 . >>
 eXeL@B —› Программирование —› Перехват API
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати