Сейчас на форуме: tyns777, zds, JustLife (+3 невидимых)

 eXeL@B —› Программирование —› Ошибка в сплайс коде
Посл.ответ Сообщение

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

Создано: 19 декабря 2009 16:43 · Поправил: sterk
· Личное сообщение · #1

Пишу длл. в ней делаю сплайс функций. для теста взял функцию send.
При инъекте все проходит успешно. Но кусок кода выдает не то что хотелось бы...

Code:
  1. __asm
  2.          {
  3. Fn1:
  4.                  pushad
  5. //Вызов VirtualProtect - по идее он не нужен. но и с ним не работает
  6.          /*      lea eax, wrt
  7.                  push eax
  8.                  push 0x40
  9.                  push 0x20
  10.                  push [esp+52]
  11.                  call Protect*/
  12.                  push 0
  13.                  lea eax, wrt
  14.                  push eax
  15.                  push dword ptr [esp+52]
  16.                  push dword ptr [esp+52]
  17.                  push hPipe
  18.                  call Write//WriteFile
  19.                  call LastError//!!!!!!!!!!!!!!!!!!!!!!
  20.                  popad
  21.                  mov edi, edi
  22.                  push ebp
  23.                  mov ebp, esp
  24.                  jmp Send
  25.             }

LastError это вызов функции GetLastError. Выдает значение 5. доступ запрещен. Но я не понимаю с какого фига
Я предпологаю что доступ запрещен к пайпу. мб и нет. Подскажите как это лечится
пс: что бы было понятнее наставил каментов




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 19 декабря 2009 16:55
· Личное сообщение · #2

Этого недостаточно для точного диагноза почему это неработает!

Как вариант поставь int 3 и смотри отладчиком создаваемый удаленный тред

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




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

Создано: 19 декабря 2009 17:09
· Личное сообщение · #3

Чего недостаточно то? я написал две проги. одну с вызовом send. другая дллка.
вот дллка. Через ольку дебажу свою же прогу. перехожу на свой код. в дллке при вызове send из проги. адреса и параметры все правильно подставлено. Но код(GetLastError) выдает ERROR_ACCESS_DENIED.
Code:
  1. BOOL APIENTRY DllMain( HMODULE hModule,
  2.                        DWORD  ul_reason_for_call,
  3.                        LPVOID lpReserved
  4.                                     )
  5. {
  6.          switch (ul_reason_for_call)
  7.          {
  8.          case DLL_PROCESS_ATTACH:
  9.                  {
  10.                         hPipe = CreateFileA((LPCSTR)"\\.\pipe\bggPP", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
  11.                         if(!hPipe)return false;
  12.                         HINSTANCE gmh = GetModuleHandleA((LPCSTR)"ws2_32.dll");
  13.                         Send = (DWORD)GetProcAddress(gmh,"send");
  14.                         gmh = GetModuleHandleA((LPCSTR)"kernel32.dll");
  15.                         Write = (DWORD)GetProcAddress(gmh,"WriteFile");
  16.                         Protect = (DWORD)GetProcAddress(gmh,"VirtualProtect");
  17.                         LastError = (DWORD)GetProcAddress(gmh,"GetLastError");
  18.                         if(!Send)
  19.                         {
  20.                               CloseHandle(hPipe);
  21.                               return false;
  22.                         }
  23.                         DWORD old = 0;
  24.                         VirtualProtect((LPVOID)Send,0x20,0x40, &old);
  25.                         _asm
  26.                         {
  27.                               lea eax, Fn1
  28.                               mov ebx, Send
  29.                               sub eax, ebx
  30.                               sub eax, 5
  31.                               mov byte ptr [ebx], 0xE9
  32.                               inc ebx
  33.                               mov dword ptr [ebx], eax
  34.                         }
  35.                         Send+=5;
  36.                  }
  37.                  break;
  38.          case DLL_THREAD_ATTACH:
  39.          case DLL_THREAD_DETACH:
  40.          case DLL_PROCESS_DETACH:
  41.                  CloseHandle(hPipe);
  42.                  break;
  43.          }
  44.          return TRUE;
  45.  
  46.  
  47.          __asm
  48.          {
  49. Fn1:
  50.                  pushad
  51.          /*      lea eax, wrt
  52.                  push eax
  53.                  push 0x40
  54.                  push 0x20
  55.                  push [esp+52]
  56.                  call Protect*/
  57.                  push 0
  58.                  lea eax, wrt
  59.                  push eax
  60.                  push dword ptr [esp+52]
  61.                  push dword ptr [esp+52]
  62.                  push hPipe
  63.                  call Write
  64.                  call LastError
  65.                  popad
  66.                  mov edi, edi
  67.                  push ebp
  68.                  mov ebp, esp
  69.                  jmp Send
  70.          }
  71. }




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

Создано: 19 декабря 2009 18:29
· Личное сообщение · #4

sterk пишет:
Я предпологаю что доступ запрещен к пайпу

ага

sterk пишет:
Подскажите как это лечится

для начала можно попробовать добавить GENERIC_WRITE в
hPipe = CreateFileA((LPCSTR)"\.\pipe\bggPP", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);



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

Создано: 19 декабря 2009 18:34
· Личное сообщение · #5

Vol4ok пишет:
для начала можно попробовать добавить GENERIC_WRITE вhPipe = CreateFileA((LPCSTR)"\.\pipe\bggPP", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);

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




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

Создано: 19 декабря 2009 20:23
· Личное сообщение · #6

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

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




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

Создано: 19 декабря 2009 21:07 · Поправил: sterk
· Личное сообщение · #7

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

так же не слишком понял насчет кривезны перехвата. я с наименьшими изменениями и тд делаю перехват и исполнение своего кода. так же слежу по минимуму произвожу манипуляций. во 1 может возникнуть меньше глюков с адресами в памяти во 2 скорость выполнения в тех же онлайн игрушках выше.




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

Создано: 19 декабря 2009 21:20
· Личное сообщение · #8

sterk пишет:
во 1 может возникнуть меньше глюков с адресами в памяти
А при модификации таблицы импорта какие тут могут быть глюки? Наоборот, почитай статьи того же MS-REM, где он говорит, что сплайсинг куда опаснее. Рихтер с ним солидарен.
во 2 скорость выполнения в тех же онлайн игрушках выше
А скорость везде одинаковая (впринципе, можно поспорить, что при модификации таблицы выше, но не буду).
править всем загруженным модулям иат?
А что - это задача со звёздочкой?

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




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

Создано: 19 декабря 2009 21:34 · Поправил: sterk
· Личное сообщение · #9

Никогда не правил иат. Причем всему что движется )))
А как отслеживать если загрузится новый модуль какой нить?
кинь ссылки на подобные статьи плиз.

а насчет функции я так понимаю ты предлагаеш вот такое
Code:
  1. int Send(SOCKET s, char  * buf, int len, int flags);
  2. {
  3.     //мой код
  4.     ...
  5.     //то что доктор прописал
  6.     return send(s,buf,len,flags);
  7. }





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

Создано: 19 декабря 2009 21:49
· Личное сообщение · #10

sterk

Code:
  1. int Send(SOCKET s, char  * buf, int len, int flags);
  2. {
  3.     //мой код
  4.     ...
  5.     //то что доктор прописал
  6.     return send(s,buf,len,flags);
  7. }


Неее, рекурсию я не предлагаю ))) Хотя ладно, С различает регистр букв.

А как отслеживать если загрузится новый модуль какой нить?
А отслеживать и не надо. Когда твой код начнёт стваить перехавт, помимо правок таблиц импорта уже загруженных модулей пусть правит таблицу экспорта для того, чтоб GetProcAddress не могла правильное значение определить.

кинь ссылки на подобные статьи плиз.
Джеффри Рихтер - Windows для проффесионалов. Это не статья, а книга. Качай и читай, там всё написано.

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




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

Создано: 19 декабря 2009 21:58
· Личное сообщение · #11

дллка грузится в начале работы проги. значит для уже загруженных модулей надо исправить иат. после чего для будущих модулей достаточно исправить таблицу экспорта в ws2_32.dll?
А можно ли как нить загрузить мою длл что бы нужно было только экспорт редактировать?
+ очень большой вопрос по поводу пакеров\протектеров... что будет если программа будет защищена. а программы в основном защищены themida. для меня это не преодолимо...




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

Создано: 19 декабря 2009 22:09
· Личное сообщение · #12

sterk пишет:
А можно ли как нить загрузить мою длл что бы нужно было только экспорт редактировать?
Чисто теоретически - можно, если к ехе-файлу эта либа (ws2_32.dll) не прилинкована статически. В противном случае нельзя. Импорт всё равно - хотяб для ехе-файла - придётся править.
+ очень большой вопрос по поводу пакеров\протектеров... что будет если программа будет защищена. а программы в основном защищены themida. для меня это не преодолимо...
Ну, Фима так и разрабатывалась, чтоб не хукали все кому не лень её функции. Но всегда можно написать драйвер и хукать в ядре. Правда, для этого придётся напрячься гораздо сильнее - поисследовать, какие сервисы нужно перехватить и при каких входных параметрах и т.д.

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




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

Создано: 19 декабря 2009 22:18
· Личное сообщение · #13

всегда хотел писать драйверы и рулить на низком уровне. но не нашел хороших и понятных книг. Я например не знаю как без шаманства прикрутить разработку драйверов к VS 2008ру.

А в рихтере описывается как с помощью драйверов перехваты делать?



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

Создано: 19 декабря 2009 23:20 · Поправил: Vol4ok
· Личное сообщение · #14

sterk пишет:
всегда хотел писать драйверы и рулить на низком уровне. но не нашел хороших и понятных книг.

зато нашлись статьи:
https://www.wasm.ru/publist.php?list=21#series_9
https://www.wasm.ru/publist.php?list=21#series_8
изучайте, хорошо и понятно написано и примерами и даже картинками

sterk пишет:
Я например не знаю как без шаманства прикрутить разработку драйверов к VS 2008ру.

попробуйте это - http://dl.dropbox.com/u/159112/Dropbox/drv_signing/simple_driver.rar
только WDK не забудьте поставить и прописать переменную стреды WINDDK = "путь\к\ВДК"

sterk пишет:
как с помощью драйверов перехваты делать?

Также как и без них.

ЗЫ: у вас в начале топика был написан вполне нормальный и рабочий код, не понимаю зачем вам этот гимор с импортом/экспортом?



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

Создано: 20 декабря 2009 00:03
· Личное сообщение · #15

Вообще мне хотелось бы такой метод перехвата данных для снифера. что бы он во 1 не палился различного рода защитами. А во 2 что бы я мог редактировать проходящий трафик. была идея написать драйвер сетевой но знаний не хватает. А опыт в сплайсинге и контроле различных программ есть. вот и решил через перехват писать.



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 20 декабря 2009 04:21
· Личное сообщение · #16

Используйте ловушки на обоих кпл.




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

Создано: 20 декабря 2009 04:32 · Поправил: ARCHANGEL
· Личное сообщение · #17

Clerk
Можно перевод специально для меня - что такое кпл ????

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




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

Создано: 20 декабря 2009 06:05
· Личное сообщение · #18

+1... кстати существуют ли сборки какие нить(например WDK). что бы после установки(автоматической желательно) в студии появлялся отдельный тип проекта. Win32 Driver ну что то в этом духе.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 20 декабря 2009 09:07
· Личное сообщение · #19

КПЛ-уровень привилегий, видимо, в обоих ринг 3 и ринг 0, в общем.



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 20 декабря 2009 13:17 · Поправил: Clerk
· Личное сообщение · #20

Текущий уровень привилегий, имел ввиду оба кольца защиты. Нужно найти возможность для срабатывания ловушки(не только Trap, но и ошибка, любой сепшен) гдето до вызова целевого кода, пусть даже весьма далеко от него. В этом случае используется трассировка процедур с заменой адреса возврата после входа. Это может быть не валидный указатель, структура, селектор и пр. Упомянули LastError - на этом может быть сгенерирован останов(см. g_dwLastErrorToBreakOn). В ядре на низком иркл этот механизм может использоваться обычно.




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

Создано: 20 декабря 2009 13:54
· Личное сообщение · #21

КПЛ - Current Privilege Level, тогда уж CPL, но что-то я не въеду, как это тут можно использовать. У меня другое предложение - может, юзать отладочные регистры?

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




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

Создано: 20 декабря 2009 14:19
· Личное сообщение · #22

sterk пишет:
в студии появлялся отдельный тип проекта. Win32 Driver ну что то в этом духе.

visualddk.sysprogs.org/

sterk пишет:
во 1 не палился различного рода защитами. А во 2 что бы я мог редактировать проходящий трафик. была идея написать драйвер сетевой но знаний не хватает.

весьма противоречивые требования, вы хотите написать крутой снифер при этом не обладая необходимыми знаниями. Вы уж определитесь, либо пишите что умеете, но работать оно будет как получится, либо изучайте матчасть и пишите как надо, тогда работать будет как вы хотите. Cамый оптимальное решение для создания снифера - написание NDIS-фильтра, в WDK есть готовые шаблоны для NDIS 5 - NDIS Intermediate Driver (src\network\ndis\passthru), для NDIS 6 - NDIS Filter Driver (src\network\ndis\filter).




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

Создано: 20 декабря 2009 15:50
· Личное сообщение · #23

HiEndsoft
Тогда уж не слушайте, а догадывайтесь, что он нам хочет сказать.

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




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 20 декабря 2009 16:34
· Личное сообщение · #24

Не понимаю что не понятно


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


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