Сейчас на форуме: UniSoft, laslo, bartolomeo (+5 невидимых)

 eXeL@B —› Программирование —› Подскажите новичку по перехвату Api функций
<< . 1 . 2 . 3 . >>
Посл.ответ Сообщение

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

Создано: 17 ноября 2011 17:16
· Личное сообщение · #1

Доброго времени суток.
Разбираюсь с перехватом API функций через dll инъекцию.
В сети нашел интересный пример и на нем сделал библиотечку которая подменяет нужные функции.
В частности: GetDriveTypeA, GetVolumeInformationA, GetVersion, GetVersionExA
Все они находятся в kernel32.dll, что усложняет задачку
GetDriveTypeA и GetVersion удалось подменить выводы на нужные, а вот
GetVolumeInformationA и GetVersionExA проблемы
GetVolumeInformationA возвращает 0 (наверное потому что не знаю в какой регистр писать и в один ли )
А с GetVersionExA вообще труба каким образом и как там идет возврат.
К сожалению приходится пользоватся почти наугад, завести на 64 битном 4 ядерном проце SoftIce не удалось а в виртуалке проблемы с видеодрайвером.
Да и мешает еще одна проблема последний раз на асме писал лет 10 назад (уже с трудом что-то вспоминается).

Прошу помощи подсказками:
Каким софтом можно подсмотреть саму функцию kernel32
Советами по поводу вовратов от функции, примером или чем нибудь еще.

В архиве программка мишень, библиотека, flat assembler и исходники всего.

http://narod.ru/disk/31656508001/project.zip.html



Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 19 ноября 2011 12:25
· Личное сообщение · #2

bowrouco пишет:
Я не знаю что такое двач.


Гм, ну bowrouco может и нет, а какой-нибудь из твоих 100500 клонов видимо да.





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

Создано: 19 ноября 2011 12:30
· Личное сообщение · #3

Alchemistry
Моя деограмка. Но на 2ch.so я никада не ходил. Есть немного форумов, которые я читаю и есчо меньше где я пишу. Двачей, вконтактов и прочей ереси в том списке нет.




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

Создано: 19 ноября 2011 12:31
· Личное сообщение · #4

bowrouco
Давай проще. ПЕКилл до мозга костей практик. На его счету несколько автораспоковщиков самых крутых протекторов, 5000 сломанных и закейгененых программ. Он РЕАЛЬНО делал все то, о чем пишет.
Ты же теоретик, который на практике никогда не делал то, о чем пишешь и все твои теории навсегда останутся теориями.
Кстати в шапке есть прога, можешь на ее примере показать нам "патч от Инде"?

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




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

Создано: 19 ноября 2011 12:37 · Поправил: bowrouco
· Личное сообщение · #5

Maximus

> Он РЕАЛЬНО делал все то, о чем пишет.

Дык в том и проблема. Может он делал то о чём пишет гдето там, но то о чём он пишет тут он даже не понимает. Я ничего не кейгеню и не пишу что я это делал.

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

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

> Кстати в шапке есть прога, можешь на ее примере показать нам "патч от Инде"?

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



Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 19 ноября 2011 12:45 · Поправил: Alchemistry
· Личное сообщение · #6

bowrouco

Я знаю PE_Kill по его программам, а тебя только по срачам на васме, который я иногда читаю.

У тебя сейчас прекрасная возможность показать себя и свои техники на практике как и предложил Maximus. Возьми задачу из шапки и сделай. А потом объясни это ТС, так чтобы он понял. Сделаешь - респект. Опять начнешь генерить бред или свалишь из темы - шито поделать десу.

Блджад Клерк, сколько же у тебя свободного времени.

upd.

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

Ну все ясно, очередной слив.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 19 ноября 2011 13:00
· Личное сообщение · #7

Клерк на дваче, ох епт. Что вообще с ним разговаривать. Клерк - есть еще башорг, не пробовал туда ресечить?

-----
Yann Tiersen best and do not fuck




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

Создано: 19 ноября 2011 13:04
· Личное сообщение · #8

Alchemistry

Есть же LdrHotPatchRoutine() - готовый системный функционал, зачем велосипед изобретать.

Вдобавок главное идея, потом алгоритм для её реализации, потом уже реализация в виде кода. Первое и второе тут никому не нужно, нужен готовый код. Алго то там как такового и нет - енумим потоки, проверяем что ни один из них не стоит на изменяемых инструкциях(чтобы на середине новой не оказался), если это так, то копируем код в буфер, пишем туда стаб и далее изменяем код. До тупого примитивно, что там реализовать, да и зачем мне это. Кстати давным давно, когда я был таким наивным и нубом как вы, я реализовал сие в виде либы. У меня есчо эти древние кодесы остались:
Code:
  1. WaitForSplaysReady proc ProcessHandle:HANDLE, Loops:ULONG, SplaysAddress:PVOID, SplaysSize:ULONG
  2. Local LocalTimeout:LARGE_INTEGER
  3. Local CurrentFlag:BOOLEAN;, LastThread:BOOLEAN
  4.          invoke IsCurrentProcessHandle, ProcessHandle, addr CurrentFlag
  5.          test eax,eax
  6.          jnz exit_
  7.          cmp CurrentFlag,eax
  8.          mov eax,STATUS_INVALID_HANDLE
  9.          jnz exit_
  10.          ;invoke ZwQueryInformationThread, NtCurrentThread, ThreadAmILastThread, addr LastThread, SizeOf BOOLEAN, NULL
  11.          ;test eax,eax
  12.          ;jnz exit_
  13.          ;cmp LastThread,eax
  14.          ;mov eax,STATUS_INVALID_PARAMETER_1
  15.          ;jz exit_
  16. valid_:
  17.          invoke InitializeTimeout, 20, addr LocalTimeout
  18. loop_:
  19.          invoke ZwSuspendProcess, ProcessHandle
  20.          invoke IsSplaysReady, ProcessHandle, SplaysAddress, SplaysSize
  21.          test eax,eax
  22.          jz exit_
  23.          push eax
  24.          invoke ZwResumeProcess, ProcessHandle
  25.          pop eax
  26.          cmp eax,STATUS_CONFLICTING_ADDRESSES
  27.          jnz exit_
  28.          invoke ZwDelayExecution, FALSE, addr LocalTimeout
  29.          dec Loops
  30.          jnz loop_
  31.          mov eax,STATUS_TIMEOUT
  32. exit_:
  33.          ret
  34. WaitForSplaysReady endp

Code:
  1. NtSplaysFunction proc uses ebx esi edi SectionHandle:HANDLE, Function:PVOID, Handler:PVOID, CallbackBuffer:PVOID, CallbackBufferSize:PULONG, SavePoint:BOOLEAN, RestoreInformation:PULONG
  2. Local MapAddress:PVOID, MapSize:ULONG
  3. Local SystemInformation:SYSTEM_BASIC_INFORMATION
  4. Local DecodeInformation:DECODE_MACRO
  5. Local LocalCallbackBuffer[SPLAYS_MINIMUM_SIZE]:BYTE
  6.          _setseh_
  7.          _IsSupportedCx8_
  8.          invoke ZwQuerySystemInformation, SystemBasicInformation, addr SystemInformation, SizeOf SYSTEM_BASIC_INFORMATION, NULL       ;PAGE_SIZE
  9.          test eax,eax
  10.          mov edx,RestoreInformation
  11.          mov ecx,CallbackBufferSize
  12.          jnz exit_
  13.          mov dword ptr [edx],eax   ;Test write
  14.          mov dword ptr [edx+4],eax
  15.          mov dword ptr [ecx],eax
  16.          mov MapAddress,eax
  17.          mov ebx,Function
  18.          lea ecx,MapSize
  19.          lea edx,MapAddress
  20.          _VirtualToPhysicalEbx_
  21.          push PAGE_READWRITE
  22.          dec SystemInformation.PhysicalPageSize
  23.          push edx
  24.          push ecx
  25.          push ebx
  26.          and ebx,SystemInformation.PhysicalPageSize  ;Offset
  27.          push SectionHandle        
  28.          lea eax,[ebx+4]
  29.          push NtCurrentProcess     
  30.          mov MapSize,eax
  31.          Call MapViewOfPhysicalMemorySection
  32.          test eax,eax
  33.          jnz exit_
  34.          _subsetseh_
  35.          add ebx,MapAddress
  36. ;Jump and Call -> chain handling
  37.          cld
  38.          mov eax,6
  39.          cmp byte ptr [ebx],OPCODE_JUMP
  40.          lea edi,LocalCallbackBuffer
  41.          mov ecx,Function
  42.          mov edx,dword ptr [ebx+1] ;displacement
  43.          lea edx,[edx + ecx + 5]
  44.          je write_callback_
  45.          cmp byte ptr [ebx],OPCODE_CALL
  46.          jne decode_
  47.          mov byte ptr [edi],OPCODE_PUSH
  48.          lea ecx,[ecx + 5]
  49.          mov dword ptr [edi+1],ecx
  50.          lea edi,[edi+5]
  51.          jmp write_callback_
  52. ;Address_Jmp_E9=@+Disp+5
  53. ;Disp=Address-@-5
  54. decode_:
  55.          invoke DecodeMacroSize, ebx, SIZEOF_JUMP, addr DecodeInformation
  56.          test eax,eax
  57.          cld
  58.          jnz err_decode_
  59.          cmp DecodeInformation.IpFlag,eax   ;IP_IGNORE
  60.          mov eax,STATUS_DECRYPTION_FAILED
  61.          jne err_decode_
  62.          mov edx,Function
  63.          mov ecx,DecodeInformation._Length
  64.          mov esi,ebx
  65.          add edx,ecx
  66.          mov eax,ecx
  67.          rep movsb
  68.          add eax,6
  69. write_callback_:
  70.          mov ecx,CallbackBufferSize
  71.          mov byte ptr [edi],OPCODE_PUSH
  72.          mov dword ptr [edi+1],edx
  73.          mov byte ptr [edi+5],OPCODE_RET
  74.          mov edx,CallbackBuffer
  75.          mov dword ptr [ecx],eax
  76.          _VirtualToPhysicalEdx_
  77.          invoke PhysicalMemoryOperation, SectionHandle, OPERATION_WRITE, edx, addr LocalCallbackBuffer, eax
  78.          test eax,eax
  79.          mov esi,ebx
  80.          jnz err_decode_
  81.          xor edx,edx
  82.          xor eax,eax
  83.          xor ebx,ebx
  84.          xor ecx,ecx
  85.          mov edi,RestoreInformation
  86.          lock cmpxchg8b qword ptr [Esi]     ;Edx:Eax
  87.          mov ebx,Handler
  88.          sub ebx,Function
  89.          sub ebx,5
  90.          mov ecx,ebx
  91.          shl ebx,8
  92.          rol ecx,8
  93.          .if SavePoint==NULL
  94.          or ebx,OPCODE_JUMP
  95.          .else
  96.          or ebx,OPCODE_CALL
  97.          .endif
  98.          and ecx,11111111b
  99.          lock cmpxchg8b qword ptr [Esi]     ;Edx:Eax
  100.          mov dword ptr [edi],eax
  101.          mov dword ptr [edi+4],edx
  102. ;[Mem64]==Edx:Eax [Mem64]<-Ecx:Ebx
  103. ;[Mem64]<>Edx:Eax Edx:Eax<-[Mem64]
  104.          xor eax,eax
  105. err_decode_:
  106.          _subendseh_
  107.          push eax
  108.          invoke ZwUnmapViewOfSection, NtCurrentProcess, MapAddress
  109.          pop eax
  110. exit_:
  111.          _endseh_
  112.          ret
  113. NtSplaysFunction endp

Code:
  1. PsBreakpointControlReady proc ProcessHandle:HANDLE, TestOrWaitReady:ULONG, Address:PVOID, BpValue:PCHAR
  2. Local ReturnLength:ULONG
  3. Local ReturnByte:BYTE
  4.          _setseh_
  5.          lea eax,ReturnLength
  6.          push eax
  7.          xor eax,eax
  8.          inc eax
  9.          push eax
  10.          lea eax,ReturnByte
  11.          push eax
  12.          push Address
  13.          push ProcessHandle
  14.          Call PsReadVirtualMemoryProtected
  15.          .if !Eax
  16.          lea eax,ReturnLength
  17.          push eax
  18.          xor eax,eax
  19.          inc eax
  20.          push eax
  21.          push BpValue
  22.          push Address
  23.          push TestOrWaitReady
  24.          push ProcessHandle
  25.          Call PsWriteVirtualMemoryProtectedReady
  26.          .if !Eax
  27.          mov edx,BpValue
  28.          mov cl,ReturnByte
  29.          mov byte ptr [edx],cl
  30.          .endif
  31.          .endif
  32.          _endseh_
  33.          ret
  34. PsBreakpointControlReady endp

Code:
  1. PsWriteVirtualMemoryProtectedReady proc ProcessHandle:HANDLE, TestOrWaitReady:ULONG, BaseAddress:PVOID, Buffer:PVOID, BufferLength:ULONG, ReturnLength:PULONG
  2. Local Protect:ULONG, ProtectBaseAddress:PVOID, ProtectBufferLength:ULONG
  3. Local AffinityMask:ULONG
  4.          _setseh_
  5.          mov AffinityMask,1
  6.          invoke SetProcessAffinityMaskEx, ProcessHandle, addr AffinityMask
  7.          .if !Eax
  8.          .if TestOrWaitReady==SPLAYS_READY_TEST
  9.          invoke IsSplaysReady, ProcessHandle, BaseAddress, BufferLength
  10.          .elseif TestOrWaitReady==SPLAYS_READY_WAIT  
  11.          invoke WaitForSplaysReady, ProcessHandle, 50, BaseAddress, BufferLength
  12.          .endif
  13.          mov eax,BaseAddress
  14.          mov ProtectBaseAddress,eax
  15.          mov eax,BufferLength
  16.          mov ProtectBufferLength,eax
  17.          invoke ZwProtectVirtualMemory, ProcessHandle, addr ProtectBaseAddress, addr ProtectBufferLength, PAGE_EXECUTE_READWRITE, addr Protect
  18.          .if !Eax
  19.          invoke ZwWriteVirtualMemory, ProcessHandle, BaseAddress, Buffer, BufferLength, ReturnLength       
  20.          push eax
  21.          invoke ZwFlushInstructionCache, ProcessHandle, BaseAddress, BufferLength
  22.          invoke ZwProtectVirtualMemory, ProcessHandle, addr ProtectBaseAddress, addr ProtectBufferLength, Protect, addr Protect
  23.          pop eax
  24.          .endif
  25.          push eax
  26.          invoke SetProcessAffinityMaskEx, ProcessHandle, addr AffinityMask
  27.          pop eax
  28.          .endif
  29.          _endseh_
  30.          ret
  31. PsWriteVirtualMemoryProtectedReady  endp

Code:
  1. NtInstallCallGate proc uses ebx esi SectionHandle:HANDLE, Processor:ULONG, GateRoutine:PVOID, ResultSelector:PULONG
  2. Local MappingSize:ULONG, MappingAddress:PVOID
  3. Local SystemInformation:SYSTEM_BASIC_INFORMATION
  4. Local ProcessorGdt:GDTR_FIELD
  5. Local Status:NTSTATUS
  6.          _setseh_
  7.          invoke ZwQuerySystemInformation, SystemBasicInformation, addr SystemInformation, SizeOf SYSTEM_BASIC_INFORMATION, NULL       ;PAGE_SIZE
  8.          test eax,eax
  9.          jnz exit_        
  10.          dec SystemInformation.PhysicalPageSize
  11.          invoke ExecuteOnProcessor, Processor, addr QueryProcessorGdtCallback, addr Status, SystemInformation.PhysicalPageSize, addr ProcessorGdt
  12.          test eax,eax
  13.          mov esi,ResultSelector
  14.          jnz exit_
  15.          mov eax,Status
  16.          test eax,eax
  17.          jnz exit_
  18.          mov dword ptr [esi],eax
  19.          lea edx,MappingAddress
  20.          push PAGE_READWRITE
  21.          mov dword ptr [edx],eax
  22.          lea ecx,MappingSize
  23.          push edx
  24.          push ecx
  25.          push ProcessorGdt._Base
  26.          and edx,SystemInformation.PhysicalPageSize  ;Offset
  27.          push SectionHandle        
  28.          lea eax,[edx+8192*8]
  29.          push NtCurrentProcess
  30.          mov dword ptr [ecx],eax
  31.          Call MapViewOfPhysicalMemorySection
  32.          test eax,eax
  33.          jnz exit_
  34.          mov ebx,MappingAddress
  35.          _subsetseh_
  36.          movzx ecx,ProcessorGdt._Limit
  37.          inc ecx
  38.          add ebx,8               ;Искл. нулевой дескриптор
  39.          shr ecx,3               ;Число дескрипторов
  40.          assume ebx:PCALL_GATE_DESCRIPTOR
  41. ;Ищем первый свободный дескриптор
  42. search_:
  43.          test [ebx].AccessRights,10000000b  ;Bit P: Present
  44.          jnz next_gate_
  45.          cmp [ebx].OffsetLo,ax
  46.          jnz next_gate_
  47.          cmp [ebx].OffsetHi,ax
  48.          jnz next_gate_
  49.          mov eax,GateRoutine       
  50.          movzx edx,ax
  51.          or edx,10000000000000000000b       ;(2^16)*08h ;селектор
  52.          and eax,11111111111111110000000000000000b
  53.          or eax,1110110000000000b
  54.          lock xchg dword ptr [ebx],edx
  55.          lock xchg dword ptr [ebx+4],eax
  56.          sub ebx,MappingAddress
  57.          mov dword ptr [esi],ebx
  58.          xor eax,eax
  59.          jmp return_
  60. next_gate_:
  61.          add ebx,8
  62.          loop search_
  63.          mov eax,STATUS_NOT_FOUND
  64. return_:
  65.          _subendseh_
  66.          push eax
  67.          invoke ZwUnmapViewOfSection, NtCurrentProcess, MappingAddress
  68.          pop eax
  69. exit_:
  70.          _endseh_
  71.          ret
  72. NtInstallCallGate endp

Code:
  1. PhysicalMemoryLockExchange8b proc uses esi edi ebx SectionHandle:HANDLE, PhysicalAddress:PVOID, InOutValue:PLARGE_INTEGER
  2. Local MappingSize:ULONG, MappingAddress:PVOID
  3. Local SystemInformation:SYSTEM_BASIC_INFORMATION
  4.          _setseh_
  5.          _IsSupportedCx8_
  6.          mov esi,PhysicalAddress
  7.          invoke ZwQuerySystemInformation, SystemBasicInformation, addr SystemInformation, SizeOf SYSTEM_BASIC_INFORMATION, NULL       ;PAGE_SIZE
  8.          test eax,eax
  9.          jnz exit_
  10.          lea edx,MappingAddress
  11.          push PAGE_READWRITE
  12.          mov dword ptr [edx],eax
  13.          lea ecx,MappingSize       
  14.          dec SystemInformation.PhysicalPageSize
  15.          push edx
  16.          push ecx
  17.          push esi
  18.          and esi,SystemInformation.PhysicalPageSize  ;Offset
  19.          push SectionHandle        
  20.          lea eax,[esi+8]
  21.          push NtCurrentProcess     
  22.          mov dword ptr [ecx],eax
  23.          Call MapViewOfPhysicalMemorySection
  24.          test eax,eax
  25.          jnz exit_
  26.          _subsetseh_
  27.          mov edi,InOutValue
  28.          add esi,MappingAddress
  29.          xor edx,edx
  30.          xor eax,eax
  31.          xor ebx,ebx
  32.          xor ecx,ecx
  33.          lock cmpxchg8b qword ptr [Esi]     ;Edx:Eax
  34.          mov ebx,dword ptr [edi]
  35.          mov ecx,dword ptr [edi+4]
  36.          lock cmpxchg8b qword ptr [Esi]     ;Edx:Eax
  37.          mov dword ptr [edi],eax
  38.          mov dword ptr [edi+4],edx
  39. ;[Mem64]==Edx:Eax [Mem64]<-Ecx:Ebx
  40. ;[Mem64]<>Edx:Eax Edx:Eax<-[Mem64]
  41.          xor eax,eax
  42.          _subendseh_
  43.          push eax
  44.          invoke ZwUnmapViewOfSection, NtCurrentProcess, MappingAddress
  45.          pop eax
  46. exit_:
  47.          _endseh_
  48.          ret
  49. PhysicalMemoryLockExchange8b endp

И есчо с пол мегабайта такого дерьма.

PE_Kill
Жирно тролите товарищ.



Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 19 ноября 2011 13:10 · Поправил: Alchemistry
· Личное сообщение · #9

bowrouco



Конкретика, Клерк, конкретика.

Дано: задача в шапке, двиг IDP + ворох тобой придуманных терминов.
Требуется: реализовать православный перехват Инде, объяснить ТС решение.
Ах да, решение должно быть рабочим, а не "для идеи".



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

Создано: 19 ноября 2011 13:10 · Поправил: bowrouco
· Личное сообщение · #10

Code:
  1. PsSplaysSystemService proc uses ebx esi ProcessHandle:HANDLE, MapInformation:PFILE_MAP_INFORMATION, FunctionName:PCHAR, ServiceRva:ULONG, NewFunctionReference:PVOID, ServiceInformation:PSERVICE_INFORMATION, FunctionInformation:PFUNCTION_INFORMATION
  2.          _setseh_
  3.          mov esi,MapInformation
  4.          assume esi:PFILE_MAP_INFORMATION
  5.          invoke RtlImageNtHeader, [esi].ImageBase
  6.          test eax,eax
  7.          jz err_format_
  8.          assume eax:PIMAGE_NT_HEADERS
  9.          mov ebx,[eax].OptionalHeader.ImageBase
  10.          test ebx,ebx
  11.          jz err_format_
  12.          mov eax,ServiceRva
  13.          .if !Eax
  14.          invoke ImageQueryFunctionRvaFromName, [esi].ImageBase, FunctionName, addr ServiceRva
  15.          test eax,eax
  16.          jnz exit_
  17.          mov eax,ServiceRva
  18.          .endif
  19.          cmp [esi].ViewSize,eax
  20.          jbe err_format_
  21.          add ebx,eax           ;Адрес функции
  22.          invoke IsValidSystemService, ebx
  23.          test eax,eax
  24.          jnz exit_
  25.          
  26.          assume ebx:PSERVICE_CALL_INFORMATION
  27.          mov edx,ServiceInformation
  28.          assume edx:PSERVICE_INFORMATION
  29.          .if Edx
  30.          mov eax,[ebx].ServiceCode
  31.          xor ecx,ecx
  32.          mov [edx].ServiceCode,ax
  33.          .if [ebx].OpReturn==0C2h
  34.          mov ax,[ebx].RetBytes
  35.          .endif
  36.          mov [edx].SizeOfData,ax
  37.          .endif
  38.          
  39.          mov edx,FunctionInformation
  40.          assume edx:PFUNCTION_INFORMATION
  41.          .if Edx
  42.          mov eax,ServiceRva
  43.          mov [edx].FunctionAddress,ebx
  44.          mov [edx].FunctionRva,eax
  45.          .endif
  46.          lea ebx,[ebx].SystemKi
  47.          
  48.          invoke PsWriteVirtualMemoryProtected, ProcessHandle, ebx, addr NewFunctionReference, SizeOf PVOID, addr FunctionName
  49. exit_:
  50.          _endseh_                 
  51.          ret
  52. err_format_:
  53.          mov eax,STATUS_INVALID_IMAGE_FORMAT
  54.          jmp exit_
  55. err_code_:
  56.          mov eax,STATUS_INVALID_SYSTEM_SERVICE
  57.          jmp exit_
  58. PsSplaysSystemService endp

Code:
  1. ROUTINE_DATA struct
  2. pExAllocatePool     PVOID ?
  3. TotalBytes                     ULONG ?
  4. DataForCopy                  PVOID ?
  5. LoadBytes                              ULONG ?
  6. Space          PKERNEL_SPACE ?
  7. ROUTINE_DATA ends
  8. PROUTINE_DATA typedef ptr ROUTINE_DATA
  9.  
  10. ALLOCATOR_SIZE       equ (offset AllocatorRoutineData - offset AllocatorRoutine)
  11. ALLOCATOR_FULL_SIZE        equ ((ALLOCATOR_SIZE + SizeOf ROUTINE_DATA) + 3) And not(3)
  12.  
  13. AllocatorRoutine proc C
  14.          enter_km
  15.          _GetDeltaOffsetHid_
  16.          lea ebx,[ebx + offset AllocatorRoutineData]
  17.          assume ebx:PROUTINE_DATA
  18.          push [ebx].TotalBytes
  19.          push NonPagedPool
  20.          Call [ebx].pExAllocatePool
  21.          .if !Eax
  22.          mov eax,STATUS_INTERNAL_ERROR
  23.          jmp exit_
  24.          .endif
  25.          mov edi,eax
  26.          push eax
  27.          mov esi,[ebx].DataForCopy
  28.          mov ecx,[ebx].LoadBytes
  29.          .if Esi && Ecx
  30.          cld
  31.          rep movsb
  32.          .endif
  33.          mov edx,[ebx].TotalBytes
  34.          mov ebx,[ebx].Space
  35.          assume ebx:PKERNEL_SPACE
  36.          pop [ebx].VirtualAddress
  37.          mov [ebx].SizeOfSpace,edx
  38.          xor eax,eax
  39. exit_:   
  40.          exit_km
  41. AllocatorRoutine endp
  42. AllocatorRoutineData ROUTINE_DATA <>
  43.  
  44. NtAllocateSpaceAndLoadData proc uses ebx esi edi SectionHandle:HANDLE, NtosMapInformation:PFILE_MAP_INFORMATION, Selector:ULONG, TotalBytes:ULONG, DataForCopy:PVOID, LoadBytes:ULONG, Space:PKERNEL_SPACE
  45. Local LoadedInformation:FILE_MAP_INFORMATION, NtosLoadedBase:PVOID
  46. Local Gate:CALL_GATE
  47. Local Buffer[ALLOCATOR_FULL_SIZE]:BYTE
  48.          _setseh_
  49.          mov ebx,NtosMapInformation
  50.          assume ebx:PFILE_MAP_INFORMATION
  51.          mov edx,LoadBytes
  52.          mov eax,STATUS_INVALID_PARAMETER_4
  53.          test edx,edx
  54.          mov esi,DataForCopy
  55.          mov ecx,LoadBytes
  56.          jz exit_
  57.          cld
  58.          .if Esi && Ecx
  59.                  .if TotalBytes<Edx
  60.                  mov eax,STATUS_BUFFER_TOO_SMALL
  61.                  jmp exit_
  62.                  .endif
  63.          rep lodsb        ;Test read
  64.          .endif
  65.          lea edi,Buffer
  66.          mov ecx,ALLOCATOR_SIZE
  67.          lea esi,AllocatorRoutine
  68.          cld
  69.          lea edx,NtosLoadedBase
  70.          rep movsb
  71.          mov eax,TotalBytes
  72.          assume edi:PROUTINE_DATA
  73.          push edx
  74.          push edi
  75.          push offset FunctionNameList
  76.          push [ebx].ImageBase
  77.          mov [edi].TotalBytes,eax
  78.          Call NtosQueryProcedureAddress
  79.          test eax,eax
  80.          mov esi,Space
  81.          assume esi:PKERNEL_SPACE
  82.          jnz exit_
  83.          mov edx,DataForCopy
  84.          mov ecx,LoadBytes
  85.          mov [edi].Space,esi
  86.          mov [esi].VirtualAddress,eax
  87.          mov [esi].SizeOfSpace,eax ;Test write
  88.          mov [edi].DataForCopy,edx
  89.          mov [edi].LoadBytes,ecx
  90.          invoke NtExecuteCodeInKernelMode, SectionHandle, ebx, Selector, NtosLoadedBase, addr Buffer, ALLOCATOR_FULL_SIZE, NULL, addr NtosLoadedBase
  91.          .if !Eax
  92.          mov eax,NtosLoadedBase
  93.          .endif
  94. exit_:
  95.          _endseh_
  96.          ret
  97. FunctionNameList:
  98.          CHAR "ExAllocatePool",0
  99.          CHAR 0
  100. NtAllocateSpaceAndLoadData endp

Хм, занятный кодес последний

> Требуется: реализовать православный перехват Инде, объяснить ТС решение.

ТС нужен универсальный, сие не реализуемо, ибо решение зависит от кода. Кстате вы говорили про не православные патчи в моей реализации, а не про кошерные решения. У меня небыло задач, где я не знал вызываемых апи заранее




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

Создано: 19 ноября 2011 13:15
· Личное сообщение · #11

bowrouco
Нефига ты коды постишь раз в 3 сек,ты чё батарейки на прямую к мозгу подключил?

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




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

Создано: 19 ноября 2011 13:19
· Личное сообщение · #12

ClockMan

Выбрал по теме и запостил, есчо нашёл и опять запостил. Чтоб вы не ждали.



Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 19 ноября 2011 13:37
· Личное сообщение · #13

bowrouco

ТС нужен универсальный, сие не реализуемо, ибо решение зависит от кода. Кстате вы говорили про не православные патчи в моей реализации, а не про кошерные решения. У меня небыло задач, где я не знал вызываемых апи заранее

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

Идем дальше. Смотрю я твой двиг (один из вариантов) и вижу море x86 хардкода, не портируемого. А следовательно негодно.

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

Тут остановимся.

Покажи мне авера, который орет на какие-то там перехваты и на основании этого выдает вердикт - малварь. Что касается разнообразного треша типа твоего любимого гмера - как правило до таких вещей доходит уже тогда когда юзер знает, что у него малварь. То бишь малвари так и так уже не жить - комп отрубается от инета - пейлоада от ботов нету, TTL бота стремительно приближается к нулю. А в энтерпрайз таким хукалкам ход заказан по объективным причинам, ибо там нужна стабильность и куча других вещей не свойственных твоим кодесам.

Итоги:

Непортируемый, не универсальный движок, документации внятной нет, статей (даже на васме) по нему нет, цели движка непонятны. Огромное количество хардкода для выполнения банальных операций.

С другой стороны имеем "не тру" патч с трамплином, поддерживаемый на 100% мс и лишенный всех недостатков "тру патча Инде".

Библа их называется Detours. Помимо нее существует туча других движков (некоторые кросс-платформ даже!), между прочим куда надежнее в плане стабильности, чем то что описывается в линках, что накидал PE_Kill во втором посте.

Ну и че в итоге? А в итоге, православный патч от Инде то негодный оказывается. Потому и никто до сих пор не заюзал. Как и большинство из того что у тебя в log.txt (да я его читаю иногда)

p.s.

А между прочим ТС выдал список API для перехвата, для тренировки как сам написал.



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

Создано: 19 ноября 2011 13:56 · Поправил: bowrouco
· Личное сообщение · #14

Alchemistry
> Вот ты и сам признал негодность своего двига.

Я признаю что это не годно для вас и ваших дадач. Мне не нужно универсальное. Вы хотите функу Patch(ModuleName$, EntryName$). Чтобы можно было юзать это не зная даже что делает EntryName$ и как реализована. Когда я чтото реализую то чётко знаю все функи< которые мне нужно отслеживать. Вы это считаете не годным, пусть будет так. Проблема в том, что для использования тогоже IDP нужно знать реализацию кода, который будет отслеживаться. Есть средства автоматизации, но также не универсальные. Вдобавок IDP причём тут совершенно не понятно, в том семпле это только как один из множества способов получить управление внутри апи, это опорное место для дальнейшей маршрутизации.

> Смотрю я твой двиг (один из вариантов) и вижу море x86 хардкода, не портируемого. А следовательно негодно.

Там нет вообще хардкода(хотя кто знает что вы под этим понимаете). Если бы вы посмотрели сурс, то нашли бы там в хидере "MI" - это именно и значит что хардкода нет, нет привязки расстоянию между инструкциями, нет статических данных.
Портабельность - это нельзя портировать на x64, там нет LDT. Но замена сегментов не единственное решение, можно использовать дизасм, но так как это тяжёлый код и я не юзаю x64, то мне достаточно текущего движка.

> GetVersion
Это нет смысла даже патчить, версия и её копия лежат в PEB.

> GetDriveType & GetVolInfo
Они наверно использует ProcessDeviceMap и NTRTL для манипуляции путями, например юзают хип. Есть стопяцот способов это отслеживать.

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

Так бы решал я. Вам же сие не годно, ибо не универсально.

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




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 19 ноября 2011 14:33
· Личное сообщение · #15

bowrouco епта, какого хрена ты всё на свои задачи переводишь? Этот топик создавал не ты, раз отписался, помоги ТС решить его проблему, закодь функционал. Не можешь - иди на*й с этого топика и с этого форума, твои илитные сорсы ни кому не уперлись.

-----
Yann Tiersen best and do not fuck


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

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

Создано: 19 ноября 2011 14:37
· Личное сообщение · #16

PE_Kill

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



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

Создано: 19 ноября 2011 14:43
· Личное сообщение · #17

bowrouco пишет:
Кстати давным давно, когда я был таким наивным и нубом

C тех пор ничего не изменилось.



Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 19 ноября 2011 14:52
· Личное сообщение · #18

bowrouco

Стоп приехали. Ты под верификатором понимаешь AVrf/RTL_VERIFIER?

Ну ты даешь, Инде. ТС нужно простое решение, а ты предлагаешь значит пилить в реестр Image Executions Options параметры загрузки длл-ки, потом пилить собственно калбек и все это дело на нативе лишь для того чтобы менеджер тебе запилил IAT на интересующие тебя API.

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



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

Создано: 19 ноября 2011 14:57
· Личное сообщение · #19

Alchemistry

Да, AVRF. Опции в конфиг писать не обязательно, можно в обход этого заюзать. Сам пользовательский провайдер предельно прост. Я не предлагаю сложное, как например я грузил провайдер из ресурсов(длл), разбирал апи его инициализации, в зависимости от версии и дёргал вручную. Это сложно. А просто длл запилить куда уж проще.

Не нравится провайдер - хотпатч есть.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 19 ноября 2011 15:02
· Личное сообщение · #20

bowrouco пишет:
Не нравится провайдер - хотпатч есть.

Так хотпатч же не илитно, и кто его юзает - гавно. Тебя не понять.

bowrouco пишет:
У нас с вами разные цели и разные методы.

Так есть проблема в шапке, реши. Не можешь, какого хера тут делаешь тогда?

-----
Yann Tiersen best and do not fuck




Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 19 ноября 2011 15:06 · Поправил: Alchemistry
· Личное сообщение · #21

bowrouco пишет:
Не нравится провайдер - хотпатч есть


Оно самое вообще-то ТС и предлагается, если конечно под хотпатчем понимается решение МС, а не какой-нибудь твой термин.

А насчет верифера - у него специфическое применение как средства диагностики системы самой же системой. Зачем его использовать ТС? Мало того что андок (андок в нормальных приложениях должен отсутствовать нафиг вообще), так еще с тем же успехом, но гораздо проще можно реализовать тот же баянистый IAT, на который дофига примеров в гугле.



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

Создано: 19 ноября 2011 15:15 · Поправил: bowrouco
· Личное сообщение · #22

PE_Kill

> Так есть проблема в шапке, реши. Не можешь, какого хера тут делаешь тогда?

Я решил. И привёл код.

> Так хотпатч же не илитно, и кто его юзает - гавно. Тебя не понять.

ТС нужен именно патч как сказали. Это его задача и без разницы элитно или нет.

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

Alchemistry

> Оно самое вообще-то ТС и предлагается, если конечно под хотпатчем понимается решение МС, а не какой-нибудь твой термин.

То самое, что реализуется самой осью. Имеется для этого интерфейс - LdrHotPatchRoutine().




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 19 ноября 2011 15:23
· Личное сообщение · #23

Клерк, не соскакивай с темы, дай номер колбека, может таr ты не проигноришь: http://exelab.ru/f/action=vthread&forum=7&topic=18520&page=3#9

-----
Yann Tiersen best and do not fuck




Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 19 ноября 2011 15:26
· Личное сообщение · #24

bowrouco

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

В общем я давно заметил, что Инди всегда предлагает рвать гланды через вне зависимости от задачи. Будь проще епт.



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

Создано: 19 ноября 2011 15:59
· Личное сообщение · #25

PE_Kill

Если вы всё про колбеки, то в конце эмуляции дёргается нулевой. И в процессе обработки иногда тоже. CB_DumpCPUContext - видимо вы авер, раз гдето нашли эти константы, хотя не удивительно, я давно подозревал.

Alchemistry

Какая разница что андок, главное чтоб во всей линейке работала. Хотя я не смотрел как там у неё с совметсимостью, ибо для меня этот функционал интереса не представляет. В любом случае код NT закрыт и всякая попытка его потыкать это андок, мс не приводило бинарный код тойже GetVersion().. Вот теперь и я уже как троль



Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 19 ноября 2011 16:12
· Личное сообщение · #26

bowrouco

hotpatching появился начиная Win2003 SP1, вместе с какой-то версией компилера, не помню точно.

В любом случае код NT закрыт и всякая попытка его потыкать это андок

Ложь, п..оно самое и провокация.

МС сделала такую замечательную штуку как "документация". Причем она как правило исчерпывающая по всем необходимым программистам вещам. Плюс Microsoft Press, целое издательство, где печатаются такие авторы как Рихтер, которого ты окрестил ламером и Руссинович.

Документация и поддержка - то чего у твоих поделий отсутствует в принципе, текстовый документ на народе не вариант.

MSDN

+

http://www.microsoft.com/resources/sharedsource/windowsacademic/researchkernelkit.mspx

+

WinDBG

+

политика по отношению к символам.

+

еще и еще


Да Инде ты тролль, я знаю.



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

Создано: 19 ноября 2011 16:17 · Поправил: bowrouco
· Личное сообщение · #27

Alchemistry

WRK это код ядра. Там нету винапи. А пижженый код, когда то утёкший - его балмер не одобряет. С таким же успехом я могу утверждать что всё чего нет в легальной документации, но есть в тех утёкших сурсах легально и документировано. Хотя последнее я и раньше утверждал.

А с символами + дебуггер + есчо любой нужный инструмент всё становится документированным. Теперь вы понимаете что я должен понимать когда вы мне про документированность говорите.



Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 19 ноября 2011 16:23 · Поправил: Alchemistry
· Личное сообщение · #28

bowrouco

Ты слышал звон, да не понял где он. Все эти инструменты идут в довесок к легальной документации, а не взамен ее. А что думает Балмер мне по три буквы, мне важно что думают клиенты моего софта. Нет андока - нет проблем с портом, со следующими версиями винды и т.д.

А ты хочешь сказать я не могу перехватить GetVersion не зная как она реализована внутрене что-ли? Что за бред? Как раз твое илитное двигло тут навернется медным тазом, а вот старые как мир и стабильные методы сработают на ура.



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

Создано: 19 ноября 2011 16:26
· Личное сообщение · #29

Alchemistry

Я хочу сказать что андок понятие слишком расплывчатое. Вы привели пример инструментов ресерча, которые делают всё документированным. Реализация GetVersion() не описана, её можно получить ресерчем. Также и эту ExApplyCodePatch() и LdrHP.



Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 19 ноября 2011 16:31 · Поправил: Alchemistry
· Личное сообщение · #30

bowrouco

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

Undocumented function - функция не описанная в оф. документации. Ничего расплывчатого тут нет. Не придумывай.




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

Создано: 19 ноября 2011 16:35
· Личное сообщение · #31

Перешлибы уже в личку

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



<< . 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 » Выход » ЛС
   Для печати Для печати