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

 eXeL@B —› Программирование —› Программа работает только внутри отладчика
<< . 1 . 2 . 3 . 4 . >>
Посл.ответ Сообщение

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

Создано: 23 сентября 2013 20:27 · Поправил: Envy12
· Личное сообщение · #1

Есть код:
Code:
  1. proc check
  2. ;invoke RegisterHotKey,0,1,0x0004,0x41
  3. ;invoke RegisterHotKey,0,2,0x0004,0x4c
  4. start3:
  5.         invoke AdjustTokenPrivileges,[phToken],0,PrivilegeCount ,0,0,0
  6.         mov    [prcs.dwSize],sizeof.PROCESSENTRY32
  7.         invoke CreateToolhelp32Snapshot, TH32CS_SNAPPROCESS, 0
  8.         mov    [hSnapshot], eax
  9.         invoke Process32First,eax,prcs
  10.         mov edi,[memhandle2]
  11.  
  12. loop1:
  13.         invoke GetMessage,msg,0,0,0
  14.         cmp ecx,1
  15.         je stop
  16.         mov eax,[edi]
  17.         cmp dword [prcs.szExeFile],eax
  18.         jnz kill2
  19.         add edi,4
  20. next:
  21.         invoke Process32Next,[hSnapshot],prcs
  22.         cmp    eax,0
  23.         jne    loop1
  24.         jmp start3
  25. kill2:
  26. stdcall kill1
  27. jmp next
  28. stop:
  29. invoke GetMessage,msg,0,0,0
  30. cmp ecx,2
  31. jnz next
  32. invoke Sleep,1200000
  33. jmp next
  34. ret
  35. endp

Первые 2 стркои закоментил тк с ними функция отказывается работать вне отладчика, без них все ок, как в отладчике так и без. В чем тут дело?



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

Создано: 12 октября 2013 21:36
· Личное сообщение · #2

DenCoder пишет:
1. Где код инжекта с CreateRemoteThread() ?

0x6873114000c3




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

Создано: 12 октября 2013 22:18 · Поправил: DenCoder
· Личное сообщение · #3

Envy12 пишет:
0x6873114000c3


это
Code:
  1. push 00401173
  2. retn


Не вижу ничего общего с инжектом. Кто-нибудь видит? )

-----
IZ.RU





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

Создано: 13 октября 2013 01:22
· Личное сообщение · #4

DenCoder

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




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

Создано: 13 октября 2013 01:22
· Личное сообщение · #5

Envy12

Вам что запилить нормальный код для инжекта ?




Ранг: 568.2 (!), 465thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 13 октября 2013 02:18
· Личное сообщение · #6

Dr0pЗапели,запели покажи нам кузькину мать!

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.





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

Создано: 13 октября 2013 02:28
· Личное сообщение · #7

ClockMan

Что это значит ?

Я щас трезвый(к сожаленью всюду обломы :s9, так что можем обсудить норм что хотите.




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

Создано: 13 октября 2013 02:32
· Личное сообщение · #8

Запилить любой из нас может. А вот научить

-----
IZ.RU


| Сообщение посчитали полезным: Dr0p, ClockMan


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

Создано: 13 октября 2013 02:39
· Личное сообщение · #9

DenCoder

Для этого нужно терпение, которое есть не у всех. Особенно у меня




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

Создано: 13 октября 2013 04:38 · Поправил: DenCoder
· Личное сообщение · #10

Envy12
А собственно по сабжу (с 29го поста 1й страницы) наиболее вероятный ответ - ты отлаживаешь пошагово, поэтому получается отлаживаешь один поток. И естественно, всё будет работать правильно, пока не переключиться на другой поток(не тот, который удалённый)

Чтобы убедиться в этом, проведём эксперимент:
грузим в олли notepad.exe(часто люблю его мучать), инлайним такой код
Code:
  1. CPU Disasm
  2. Address   Hex dump          Command                                  Comments
  3. 0100739D      31C0          XOR     EAX, EAX
  4. 0100739F      8D4CE4 E4     LEA     ECX, [ESP-1C]
  5. 010073A3      51            PUSH    ECX
  6. 010073A4      50            PUSH    EAX
  7. 010073A5      50            PUSH    EAX
  8. 010073A6      50            PUSH    EAX
  9. 010073A7      68 C6730001   PUSH    notepad.010073C6
  10. 010073AC      50            PUSH    EAX
  11. 010073AD      50            PUSH    EAX
  12. 010073AE      E8 2493807B   CALL    CreateThread
  13. 010073B3      5C            POP     ESP
  14. 010073B4      8344E4 08 08  ADD     DWORD PTR [ESP+8], 8
  15. 010073B9      E8 1993807B   CALL    CreateThread
  16. 010073BE      FF05 00900001 INC     DWORD PTR [1009000]
  17. 010073C4    ^ EB F8         JMP     SHORT 010073BE
  18. 010073C6      FF05 04900001 INC     DWORD PTR [1009004]
  19. 010073CC    ^ EB F8         JMP     SHORT 010073C6
  20. 010073CE      FF05 08900001 INC     DWORD PTR [1009008]
  21. 010073D4    ^ EB F8         JMP     SHORT 010073CE


Что мы должны получить, делая всё время Step Over? По идее значения по трём адресам должны увеличиваться. Но на деле это оказывается совсем не так, когда доходим до адреса 010073BE - продолжает увеличиваться только значение по адресу 1009000, и даже более того - создан второй поток, а третий никак не появится, сколько бы мы шагов не делали. Но поставим бряк на 10073ce и отпустим - третий поток создался и даже увеличилсь две переменных. Отпустим ещё раз - значение одной переменной увеличится на один, а у второй может как вообще не измениться, так измениться на несколько больше. Продолжим опять по шагу - увеличиваться будет только одна переменная... Забавляйся и скажи почему?

P.S. Всё будет так, наверное только если кол-во ядер > 1

-----
IZ.RU





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

Создано: 13 октября 2013 14:14
· Личное сообщение · #11

DenCoder

> Всё будет так, наверное только если кол-во ядер > 1

Не имеет значения сколько камней(какой аффинитет).



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

Создано: 13 октября 2013 15:20 · Поправил: Envy12
· Личное сообщение · #12

DenCoder пишет:
Не вижу ничего общего с инжектом. Кто-нибудь видит? )

Этот код я записываю в память процесса и запускаю с помощью CreateRemoteThread.
Dr0p пишет:
Вам что запилить нормальный код для инжекта ?

Было бы неплохо
DenCoder пишет:
инлайним такой код

Понятие инлайн имеет что-нибудь общее с тем что я делаю(createremotethread), или это совсем не то?




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

Создано: 13 октября 2013 15:38
· Личное сообщение · #13

Envy12 пишет:
Этот код я записываю в память процесса и запускаю с помощью CreateRemoteThread.

Так пока ты не покажешь полностью код, все части, тебе никто не сможет сказать точно, где ошибка. Чего ты стремаешься, думаешь твою разработку украдут? Таких "разработок" полно, у каждого своих по 2-3. Сами по себе в данный момент они уже ни имеют никакой ценности.

Envy12 пишет:
Dr0p пишет:Вам что запилить нормальный код для инжекта ? Было бы неплохо

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

Envy12 пишет:
Понятие инлайн имеет что-нибудь общее с тем что я делаю(createremotethread)

для проверки небольших кусков кода на асме мне удобно прямо в ольке писать

-----
IZ.RU




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

Создано: 13 октября 2013 16:10
· Личное сообщение · #14

DenCoder
Всмысле полный код? Если код инжекта, то я могу показать:
Code:
  1. Func _injectstop()
  2.          $pid = ProcessExists('checker1.exe')
  3.          $hopen = DllCall("Kernel32.dll", "int", "OpenProcess", "int", 0x1F0FFF, "int", 1, "int", $pid)
  4.          $halloc = DllCall('kernel32.dll', "ptr", "VirtualAllocEx", "HANDLE", $hopen[0], "ptr", 0, "ULONG_PTR", '6', "DWORD", 0x00001000, "DWORD", 0x40)
  5.          $code = '0x6873114000c3'
  6.          $inject = DllStructCreate('byte[6]')
  7.          DllStructSetData($inject, 1, $code)
  8.          $write = DllCall('kernel32.dll', "bool", "WriteProcessMemory", "int", $hopen[0], "int", $halloc[0], "int", DllStructGetPtr($inject), "int", DllStructGetSize($inject), "int", 0)
  9.          DllCall('kernel32.dll', "int", "CreateRemoteThread", "int", $hopen[0], "int", 0, "int", 0, "int", $halloc[0], "ptr", 0, "int", 0, "int", 0)
  10. EndFunc

Конечно, лучше разобраться, но и против готового результата я ничего не имею.




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

Создано: 13 октября 2013 16:38
· Личное сообщение · #15

Какой-то скрипт... перевожу на понятный
Code:
  1. /*Код проверки, есть ли процесс checker1.exe и получения его ид*/
  2. DWORD pid = ProcessExists(checker1.exe);
  3. HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, pid);
  4. void* halloc = VirtualAllocEx(hProcess, NULL, 6/*длина кода инжекта*/, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  5. WriteProcessMemory(hProcess, halloc, "\x68\x73\x11\x40\x00\xc3"/*push 00401173; retn*/, 6, NULL);
  6. CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)halloc, NULL, 0, NULL);


С натяжкой можно назвать инжектом То есть то, что было в коде, мы извне создаём для этого ещё один поток, чтобы оно выполнялось в двух потоках ))
401173 - это адрес какой функции?

-----
IZ.RU




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

Создано: 13 октября 2013 16:51
· Личное сообщение · #16

DenCoder пишет:
401173 - это адрес какой функции?

Это адрес функции pause1.




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

Создано: 13 октября 2013 17:03
· Личное сообщение · #17

Ну а теперь скажи, чего ты хочешь добиться этим кодом? И в чём по-твоему ошибка?

-----
IZ.RU




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

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

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




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

Создано: 13 октября 2013 17:21 · Поправил: DenCoder
· Личное сообщение · #19

У тебя нет потоков, которые бы нельзя было остановить. Подумай, прав ли Archer --> здесь <-- ?

Самый элементарный способ проверки удачи инжекта - в диспетчере задач посмотреть, сколько потоков у checker1.exe

-----
IZ.RU




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

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

как вариант:
Code:
  1. hThread := CreateRemoteThread(....);
  2.    if WaitForSingleObject(hThread, 1000) = WAIT_OBJECT_0 then
  3.      if GetExitCodeThread(hThread, ExitCode) then
  4.  Result := ExitCode;




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

Создано: 13 октября 2013 17:36
· Личное сообщение · #21

Щас глянул, потоков после инжекта - 2. Тогда я думал что мимо проходит, щас я понял, просто поток не останавливается и все.




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

Создано: 13 октября 2013 17:56
· Личное сообщение · #22

Приаттачься отладчиком к чекеру, посмотри, что каждый поток в данный момент делает.

-----
IZ.RU




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

Создано: 14 октября 2013 15:51
· Личное сообщение · #23

Может я не так смотрю, но у меня в отладчике все ок.




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

Создано: 18 октября 2013 13:16
· Личное сообщение · #24

Если отладчик вносит изменения в ход выполнения программы, логируй

-----
IZ.RU





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

Создано: 19 октября 2013 10:53
· Личное сообщение · #25

Вот простейший инжект в блокнот.

db8e_19.10.2013_EXELAB.rU.tgz - Ij.zip




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

Создано: 19 октября 2013 11:05 · Поправил: DenCoder
· Личное сообщение · #26

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

Я понял, что надо автору
Изначально хоткиями автор хотел, чтобы нажал клавишу и - программа остановилась, нажал другую - поехала дальше. Но ввиду недостатков знаний не вышло. Поэтому решил сделать без хоткиев (но видимо также по нажатию клавиш), на инжектах - та же самая история.
Ну реальное решение, и правда, NtSuspendProcess. Хотя у него всего один поток - тогда и SuspendThread сойдёт.

Хотя я так никогда не делаю. Весь код, который нуждается в своевременной паузе или полной остановке, выношу в отдельный поток. Для паузы и стопа создаю 2 евента (hEvtPause = CreateEvent(...)), а также ещё один, чтобы снять с паузы и уже по нажатию кнопок один из евентов сигналит о нужном действии(SetEvent(hEvtPause)), что принимает работающий поток
Code:
  1. HANDLES EventHandles[2];
  2. EventHandles[0] = hEvtPause;
  3. EventHandles[1] = hEvtStop;
  4.  
  5. do
  6. {
  7.   DWORD dwObj = WaitForMultipleObjects(2, EventHandles, FALSE, 0);
  8.   if(dwObj != WAIT_TIMEOUT)
  9.     if(dwObj == WAIT_OBJECT_0)
  10.       WaitForSingleObject(hEvtResume, INFINITE);
  11.     else break;
  12. }while(true);
  13. //...
  14. //...


-----
IZ.RU




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

Создано: 19 октября 2013 14:16 · Поправил: dosprog
· Личное сообщение · #27

DenCoder пишет:
Я понял, что надо автору


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




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

Создано: 19 октября 2013 20:30 · Поправил: Dr0p
· Личное сообщение · #28

DenCoder

> NtSuspendProcess. Хотя у него всего один поток - тогда и SuspendThread сойдёт.

Второй раз повторяю, останавливать треды нельзя. У вас второй поток с большой вероятностью вызовет дедлок. Это отладочные апи.

> создаю 2 евента

Прежде чем лезть в ось, ознакомся с её обьектами. Хотя бы с синхропримитивами. EventPair есть, хотя вам он не знаком




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

Создано: 19 октября 2013 20:36
· Личное сообщение · #29

Envy12

> Я хочу чтобы прога останавливалась

И зачем это нужно ?

Можно и ось остановить, но что делать дальше ?




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

Создано: 21 октября 2013 10:13
· Личное сообщение · #30

Dr0p пишет:
Прежде чем лезть в ось, ознакомся с её обьектами. Хотя бы с синхропримитивами. EventPair есть, хотя вам он не знаком

Да, адекватности тебе не занимать. Изыди, троль

-----
IZ.RU





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

Создано: 21 октября 2013 16:09 · Поправил: Модератор
· Личное сообщение · #31

DenCoder

Это ты троль. У тебя самые поверхностные знания, ты бро обычо советуешь фигню, не шаря в вопросах. Я это очень давно заметил.

Никто вменяемый треды суспендить не посоветует. И вручную реализовать обьекты ядра тоже.

Code:
  1. NTSYSCALLAPI
  2. NTSTATUS
  3. NTAPI
  4. NtCreateEventPair (
  5.     __out PHANDLE EventPairHandle,
  6.     __in ACCESS_MASK DesiredAccess,
  7.     __in_opt POBJECT_ATTRIBUTES ObjectAttributes
  8.     );
  9.  
  10. NTSYSCALLAPI
  11. NTSTATUS
  12. NTAPI
  13. NtOpenEventPair (
  14.     __out PHANDLE EventPairHandle,
  15.     __in ACCESS_MASK DesiredAccess,
  16.     __in POBJECT_ATTRIBUTES ObjectAttributes
  17.     );
  18.  
  19. NTSYSCALLAPI
  20. NTSTATUS
  21. NTAPI
  22. NtWaitLowEventPair ( 
  23.     __in HANDLE EventPairHandle
  24.     );
  25.  
  26. NTSYSCALLAPI
  27. NTSTATUS
  28. NTAPI
  29. NtWaitHighEventPair (
  30.     __in HANDLE EventPairHandle
  31.     );
  32.  
  33. NTSYSCALLAPI
  34. NTSTATUS
  35. NTAPI
  36. NtSetLowWaitHighEventPair (
  37.     __in HANDLE EventPairHandle
  38.     );
  39.  
  40. NTSYSCALLAPI
  41. NTSTATUS
  42. NTAPI
  43. NtSetHighWaitLowEventPair (
  44.     __in HANDLE EventPairHandle
  45.     );
  46.  
  47. NTSYSCALLAPI
  48. NTSTATUS
  49. NTAPI
  50. NtSetLowEventPair (
  51.     __in HANDLE EventPairHandle
  52.     );
  53.  
  54. NTSYSCALLAPI
  55. NTSTATUS
  56. NTAPI
  57. NtSetHighEventPair (
  58.     __in HANDLE EventPairHandle
  59.     );


Это базовый примитив синхронизации и апи для его юзания. Они никогда не менялись и никогда не изменются. А андоки и прочая ... это сугубо твоя паранойя.

ps: GetProcAddress(ntdll, "Zw*") нормальным считают тока те, кто ваще ... не понимает в нашей теме


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


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