Проблема с переносом кода с Delphi на асм(перехват api).

Тема в разделе "WASM.BEGINNERS", создана пользователем Troj, 1 июл 2010.

  1. Troj

    Troj New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2010
    Сообщения:
    21
    Здравствуйте пишу приложение, которые вызывается по hot-key(соответственно я его прячу), само окно скрыл, а вот процесс - нет.
    Поизучал статьи от Ms-Rem, но исходники там на Delphi.
    Начал копать в отладчике программы и вот что вышло - проблема здесь в процедуре TProc.

    Прошу помочь разобраться!

    Код (Text):
    1. include    c:\masm32\include\windows.inc
    2. include    c:\masm32\include\kernel32.inc
    3. include    c:\masm32\include\ntdll.inc
    4. includelib c:\masm32\lib\kernel32.lib
    5. includelib c:\masm32\lib\ntdll.lib
    6.  
    7. .data
    8. procname db "ProcHideHook", 0
    9. HI       dd ?
    10.  
    11. lib      db "ntdll.dll", 0
    12. funcname db "ZwQuerySystemInformation", 0
    13. MbaAdr   dd ?
    14.  
    15. Result   dd ?
    16. Hide     db "hotgame.exe", 0
    17.  
    18. .data?
    19. OldCode STRUCT
    20. one dd ?
    21. two word ?
    22. OldCode ENDS
    23.  
    24. far_jmp STRUCT
    25. PuhsOp byte ?
    26. PushArg dd ?
    27. RetOp byte ?
    28. far_jmp ENDS
    29.  
    30. SYSTEM_PROCESSES STRUCT
    31.    NextEntryDelta dd ?
    32.    ThreadCount dd ?
    33.    Reserved1 dd ?
    34.    CreateTime dd ?
    35.    UserTime dd ?
    36.    KernelTime dd ?
    37.    ProcessName dd ?
    38.    BasePriority dd ?
    39.    ProcessId dd ?
    40.    InheritedFromProcessId dd ?
    41.    HandleCount dd ?
    42.    Reserved2 dd ?
    43.    VmCounters dd ?
    44.    IoCounters dd ?
    45.    Threads dd ?
    46. SYSTEM_PROCESSES ENDS
    47.  
    48. JmpMba far_jmp <>
    49. OldMba OldCode <>
    50. PSYSTEM_PROCESSES SYSTEM_PROCESSES <>
    51.  
    52. .code
    53. TInfo proc ASystemInformationClass: DWORD, ASystemInformation: DWORD, ASystemInformationLength: DWORD, AReturnLength: DWORD
    54. LOCAL written: DWORD
    55.  
    56. invoke WriteProcessMemory, INVALID_HANDLE_VALUE, MbaAdr, addr OldMba, sizeof OldCode, addr written
    57. invoke ZwQuerySystemInformation, ASystemInformationClass, ASystemInformation, ASystemInformationLength, AReturnLength
    58. mov Result, eax
    59. invoke WriteProcessMemory, INVALID_HANDLE_VALUE, MbaAdr, addr JmpMba, sizeof far_jmp, addr written
    60. TInfo endp
    61. ;==========================================
    62. TProc proc ASystemInformationClass: DWORD, ASystemInformation: DWORD, ASystemInformationLength: DWORD, AReturnLength: DWORD
    63. invoke TInfo, ASystemInformationClass, ASystemInformation, ASystemInformationLength, AReturnLength
    64.  
    65. cmp ASystemInformationClass, 5 ;SystemProcessesAndThreadsInformation = 5
    66. jnz @ret
    67.  
    68. cmp Result, STATUS_SUCCESS
    69. jnz @ret
    70.  
    71.  invoke lstrcpy, addr PSYSTEM_PROCESSES, ASystemInformation
    72.  .while PSYSTEM_PROCESSES.NextEntryDelta>0
    73.   invoke lstrcpy, addr PSYSTEM_PROCESSES, addr PSYSTEM_PROCESSES
    74.   ;mov PSYSTEM_PROCESSES, [DWORD PTR PSYSTEM_PROCESSES+PSYSTEM_PROCESSES.NextEntryDelta]
    75.   lea eax, DWORD PTR PSYSTEM_PROCESSES
    76.   lea edx, PSYSTEM_PROCESSES.NextEntryDelta
    77.   add edx, eax
    78.   ;mov PSYSTEM_PROCESSES, edx
    79.   invoke lstrcpy, addr PSYSTEM_PROCESSES, edx
    80.   xor edx, edx
    81.   xor eax, eax
    82.  
    83.   invoke lstrcmp, addr PSYSTEM_PROCESSES.ProcessName, addr Hide
    84.   cmp eax, 0
    85.   jnz notfound
    86.  
    87.   ;mov PSYSTEM_PROCESSES.NextEntryDelta, [PSYSTEM_PROCESSES.NextEntryDelta+PSYSTEM_PROCESSES.NextEntryDelta]
    88.   lea eax, PSYSTEM_PROCESSES.NextEntryDelta
    89.   lea edx, PSYSTEM_PROCESSES.NextEntryDelta
    90.   add edx, eax
    91.   mov PSYSTEM_PROCESSES.NextEntryDelta, edx
    92.   xor edx, edx
    93.   xor eax, eax
    94.  
    95.   notfound:
    96.  .endw
    97.  
    98. @ret:
    99. ret
    100. TProc endp
    101. ;==========================================
    102. MProc proc nCode:DWORD, wparam:DWORD, lparam:DWORD
    103. invoke CallNextHookEx, 0, nCode, wparam, lparam
    104. xor eax, eax
    105. ret
    106. MProc endp
    107. ;==========================================
    108. GHookP proc
    109. invoke SetWindowsHookEx, WH_GETMESSAGE, addr MProc, HI, 0
    110. invoke Sleep, INFINITE
    111. ret
    112. GHookP endp
    113. ;==========================================
    114. GHook proc
    115. LOCAL hMutex: dword
    116. LOCAL TrId: dword
    117.  
    118. invoke CreateMutex, 0, 0, addr procname
    119. mov hMutex, eax
    120.  
    121. invoke GetLastError
    122. test eax, eax
    123. jnz bad
    124.  
    125. invoke CreateThread, 0, 0, addr GHookP, 0, 0, addr TrId
    126. ret
    127.  
    128. bad:
    129. invoke CloseHandle, hMutex
    130. ret
    131. GHook endp
    132. ;==========================================
    133. Hook proc
    134. LOCAL hUser32: dword
    135. LOCAL Bytes: dword
    136.  
    137. invoke GetModuleHandle, addr lib
    138. mov hUser32, eax
    139. invoke GetProcAddress, hUser32, addr funcname
    140. mov MbaAdr, eax
    141.  
    142. invoke ReadProcessMemory, INVALID_HANDLE_VALUE, MbaAdr, addr OldMba, sizeof OldCode, addr Bytes
    143. mov JmpMba.PuhsOp, 068h
    144. mov JmpMba.PushArg, offset TProc
    145. mov JmpMba.RetOp, 0C3h
    146. invoke WriteProcessMemory, INVALID_HANDLE_VALUE, MbaAdr, addr JmpMba, sizeof far_jmp, addr Bytes
    147. ret
    148. Hook endp
    149. ;==========================================
    150. stealth proc
    151. invoke GHook
    152. invoke Hook
    153. stealth endp
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Troj
    Не можите корректно джамп записать ?
    Посмотрите в манах на камень как выполняются ветвления и соответственно как смещение вычисляется. Предположу что не верно смещение вычисляется как обычно.
     
  3. Troj

    Troj New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2010
    Сообщения:
    21
  4. Troj

    Troj New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2010
    Сообщения:
    21
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Troj
    Разберись с возвратом значения из TInfo: у тебя рез-т вызова ZwQuerySystemInformation пишется в переменную Result и затем в eax возвращается BOOL-рез-т вызова WriteProcessMemory, который ты в TProc снова записываешь в Result
    Нужно либо из TProc убрать строчку mov Result,eax, либо в конец TInfo добавить mov eax,Result
     
  6. Troj

    Troj New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2010
    Сообщения:
    21
    Асм-код:
    Код (Text):
    1. TInfo proc ASystemInformationClass1: DWORD, ASystemInformation1: DWORD, ASystemInformationLength1: DWORD, AReturnLength1: DWORD
    2. LOCAL written: DWORD
    3.  
    4. invoke WriteProcessMemory, INVALID_HANDLE_VALUE, MbaAdr, addr OldMba, sizeof OldCode, addr written
    5. invoke ZwQuerySystemInformation, ASystemInformationClass1, ASystemInformation1, ASystemInformationLength1, AReturnLength1
    6. mov Result, eax
    7. invoke WriteProcessMemory, INVALID_HANDLE_VALUE, MbaAdr, addr JmpMba, sizeof far_jmp, addr written
    8. ret
    9. TInfo endp
    10. ;==========================================
    11. TProc proc ASystemInformationClass: DWORD, ASystemInformation: DWORD, ASystemInformationLength: DWORD, AReturnLength: DWORD
    12. invoke TInfo, ASystemInformationClass, ASystemInformation, ASystemInformationLength, AReturnLength
    13. cmp Result, STATUS_SUCCESS
    14. jnz @ret
    15.  
    16. cmp ASystemInformationClass, 5 ;SystemProcessesAndThreadsInformation = 5
    17. jnz @ret
    18.  
    19.  invoke lstrcpy, addr PSYSTEM_PROCESSES, ASystemInformation
    20.  .while PSYSTEM_PROCESSES.NextEntryDelta>0
    21.   invoke lstrcpy, addr PSYSTEM_PROCESSES, addr PSYSTEM_PROCESSES
    22.   ;mov PSYSTEM_PROCESSES, [DWORD PTR PSYSTEM_PROCESSES+PSYSTEM_PROCESSES.NextEntryDelta]
    23.   lea eax, DWORD PTR PSYSTEM_PROCESSES
    24.   lea edx, PSYSTEM_PROCESSES.NextEntryDelta
    25.   add edx, eax
    26.   ;mov PSYSTEM_PROCESSES, edx
    27.   invoke lstrcpy, addr PSYSTEM_PROCESSES, edx
    28.   xor edx, edx
    29.   xor eax, eax
    30.  
    31.   invoke lstrcmp, addr PSYSTEM_PROCESSES.ProcessName, addr Hide
    32.   cmp eax, 0
    33.   jnz notfound
    34.  
    35.   ;mov PSYSTEM_PROCESSES.NextEntryDelta, [PSYSTEM_PROCESSES.NextEntryDelta+PSYSTEM_PROCESSES.NextEntryDelta]
    36.   lea eax, PSYSTEM_PROCESSES.NextEntryDelta
    37.   lea edx, PSYSTEM_PROCESSES.NextEntryDelta
    38.   add edx, eax
    39.   mov PSYSTEM_PROCESSES.NextEntryDelta, edx
    40.   xor edx, edx
    41.   xor eax, eax
    42.  
    43.   notfound:
    44.  .endw
    45.  
    46. @ret:
    47. ret
    48. TProc endp
     
  7. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Мда, "играл, но не отгадал ни одной буквы" ;)
    Ты, что не понимаешь, что твоя TInfo возвращает в eax результат вызова WriteProcessMemory, который в сл.успеха не равен 0 ?!! Забудь про дельфийский Result и напиши как положено:
    Код (Text):
    1. TInfo proc ...
    2.   invoke WriteProcessMemory, ...
    3.   invoke ZwQuerySystemInformation, ...
    4.   ;mov Result, eax - УБРАТЬ
    5.   push eax ;!!! <--- сохраняем eax в стеке
    6.   invoke WriteProcessMemory, ...
    7.   pop eax ;!!! <--- восстанавливаем eax
    8.   ret
    9. TInfo endp
     
  8. Troj

    Troj New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2010
    Сообщения:
    21
  9. Troj

    Troj New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2010
    Сообщения:
    21
    leo спасибо за помощь, но я с выводом из функции давно разобрался на примерей другой более простой.
    Сейчас возникла загвоздка в сдвиге записей. С масм синтаксисом не очень знаком, но другого не знаю.
    Перепись из отладчика не помогает.

    Код (Text):
    1. TInfo proc aa: DWORD, bb:DWORD, cc:DWORD, dd:DWORD
    2. invoke TProc, aa, bb, cc, dd ; здесь всё ок.
    3. test eax, eax ;STATUS_SUCCESS
    4. jnz @ret
    5.  
    6. cmp bb, 5 ;SystemProcessesAndThreadsInformation = 5
    7. jnz @ret
    8.  
    9.  lea eax, PSYSTEM_PROCESSES ;пошёл поиск процесса и сдвиг значения.
    10.  lea edx, bb
    11.  add eax, edx
    12.  xor edx, edx
    13.  xor eax, eax
    14.  
    15.  .while PSYSTEM_PROCESSES.NextEntryDelta > 0
    16.   lea eax, PSYSTEM_PROCESSES
    17.   lea edx, PSYSTEM_PROCESSES
    18.   mov eax, edx
    19.   xor edx, edx
    20.   xor eax, eax
    21.  
    22.   lea eax, DWORD PTR [PSYSTEM_PROCESSES]
    23.   lea edx, PSYSTEM_PROCESSES.NextEntryDelta
    24.   add edx, eax
    25.  
    26.   lea eax, PSYSTEM_PROCESSES
    27.   mov eax, edx
    28.   xor edx, edx
    29.   xor eax, eax
    30.  
    31.   invoke lstrcmp, addr PSYSTEM_PROCESSES.ProcessName, addr hotgame ; hotgame db "hotgame.exe", 0
    32.   cmp eax, 0
    33.   jnz notfound
    34.  
    35.   lea eax, PSYSTEM_PROCESSES.NextEntryDelta
    36.   lea edx, PSYSTEM_PROCESSES.NextEntryDelta
    37.   add edx, eax
    38.   mov PSYSTEM_PROCESSES.NextEntryDelta, edx
    39.   xor edx, edx
    40.   xor eax, eax
    41.  
    42.   notfound:
    43.  .endw
    44.  
    45. @ret:
    46. ret
    47. TInfo endp
     
  10. Troj

    Troj New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2010
    Сообщения:
    21
    Тему можно закрывать. Написал всё на си.
    Спасибо за помощь в разборе кода.