Сейчас на форуме: rmn, exp50848 (+7 невидимых)

 eXeL@B —› Основной форум —› Как можно под отладчиком выполнить проверку запуска сервиса
Посл.ответ Сообщение

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

Создано: 07 декабря 2012 22:42
· Личное сообщение · #1

Уважаемые участники форума!

Столкнулся с одной проблемой. Мне попался файл, упакованный Asprotect, и который запускается в системе как сервис. Никаких проблем с его распаковкой не возникло. Файл нормально распаковался, но не хочет запускаться как сервис. Я попытался его запустить под олей, и выяснил, что для запуска файла в качестве сервиса используется функция advapi32.StartServiceW, которая четко отрабатывает свою задачу, и после своего выполнения в регистре EAX показывает значение, отличное от ноля. Но вот проверка состояния сервиса с помощью функции advapi32.QueryServiceStatus показывает, что сервис не запущен. В файле имеются API Asprotect, которые проверяют зарегистрированность программы, после которых идет вызов функции kernel32.ExitProcess. Если все нормально, то вызов этой функции перепрыгивается. Но, возможно, что где-то и не перепрыгивается, поскольку я вместо грубых безусловных прыжков подставил нужные значения, требуемые программой. И, видимо, где-то что-то не работает. Захотел посмотреть процесс запуска этого сервиса, но оля этого сделать не может. Она просто тупо выполняет функцию advapi32.StartServiceW, а какой код программы при этом выполняется - она не показывает.

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

Буду признателен за подсказки и советы.




Ранг: 158.5 (ветеран), 219thx
Активность: 0.120.01
Статус: Участник

Создано: 07 декабря 2012 22:49 · Поправил: ZaZa
· Личное сообщение · #2

А если пройти в тело advapi32.StartServiceW и там посмотреть?
А может это чем поможет: --> Удобная отладка Windows служб <--
Или это: --> Как выполнить отладку службы Windows <--

HandMill пишет:
1. Жёстко прописать в точке ServiceMain int3

А ServiceMain разве не отсюда должен выполняться:
Code:
  1. int APIENTRY wWinMain(HINSTANCE hInstance,
  2.                       HINSTANCE hPrevInstance,
  3.                       LPSTR     lpCmdLine,
  4.                       int       nCmdShow)

Code:
  1.         CSCManager scm;
  2.         if (!scm.Open(SC_MANAGER_CREATE_SERVICE))
  3.         if (!scm.CreateService())

Вызовом StartServiceCtrlDispatcher(pServiceTable) процесс сообщает SCM о том, какие службы в нем содержатся, и соответствующие этим службам адреса функций ServiceMain. SCM по имени находит запускаемую службу и вызывает ее функцию ServiceMain.
ServiceMain запускается в отдельном потоке.

-----
One death is a tragedy, one million is a statistic.




Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 07 декабря 2012 22:50
· Личное сообщение · #3

Вариантов два:

1. Жёстко прописать в точке ServiceMain int3
2. Вместо OllyDBG использовать любой ring0 отладчик(bp StartServiceW)

-----
все багрепорты - в личные сообщения




Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 08 декабря 2012 00:16
· Личное сообщение · #4

mov word[ExitProcess],0FEEB
jmp OEP
приаттачиться и смотреть стек откуда вызывается.

| Сообщение посчитали полезным: vnekrilov
 eXeL@B —› Основной форум —› Как можно под отладчиком выполнить проверку запуска сервиса
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати