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

 eXeL@B —› Программирование —› получение адреса kernel32.dll в windows 7
Посл.ответ Сообщение

Ранг: 22.3 (новичок)
Активность: 0.010
Статус: Участник

Создано: 11 июня 2009 18:42
· Личное сообщение · #1

Надо получить адрес kernel32.dll в windows 7 без использования каких-либо api-вызовов.
Используемая ранее конструкция

Code:
  1. mov eax, fs:[18h] ; eax hold TIB
  2. mov eax, dword ptr[eax+30h];eax holds linear address of PEB
  3. mov eax, dword ptr[eax+0ch];PEB_LDR_DATA
  4. mov eax, dword ptr[eax+1ch]
  5. mov eax, dword ptr[eax]
  6. mov eax, dword ptr[eax+8];eax holds kernel32 address


получает почему-то адрес KernelBase.dll

где-то примерно в [eax-118] будет адрес kernel32.dll (т.к. он меняется от запуска к запуску проги)

Есть ли надёжный метод получения адреса kernel32.dll который работал бы в windows 7 ?



Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 11 июня 2009 18:48 · Поправил: Модератор
· Личное сообщение · #2

А если цепочку SEH раскрутить? Вроде этот метод должен быть универсален. Вообще лучше такой вопрос к вирмейкерам задавать, а их здесь не любят, столобыть их тут и нет (официально как минимум).




Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 11 июня 2009 18:54
· Личное сообщение · #3

Пусть Clerk-а спросит... ;) Он точно знает!

-----
aLL rIGHTS rEVERSED!




Ранг: 22.3 (новичок)
Активность: 0.010
Статус: Участник

Создано: 11 июня 2009 19:01
· Личное сообщение · #4

Если вы думаете что я вирус пишу, то вы неправы, мне надо исправить арминлайновский хендлер наномитов для работы в win7




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

Создано: 11 июня 2009 19:24 · Поправил: Coderess
· Личное сообщение · #5

Я полагаю, kernel32 по прежнему вызывает исполняемые файлы, следователь на верхушке стэка лежит
адресу, где-то в кернел, берешь выравниваешь его на страницу и парсишь по MZ/PE00

Протестируй мой код (Под XP нормально работает):


Code:
  1. main:    
  2.         call    delta
  3.                  
  4. delta:  pop     ebp                              
  5.         sub     ebp, offset delta   
  6.  
  7.         mov     esi, dword ptr[esp]
  8.         and     esi, 0FFFF0000h         
  9.  
  10.         mov     ecx, 5
  11.         call      get_kernel
  12.         ret
  13.                  
  14. get_kernel:
  15.                  
  16. __1:test    ecx, ecx
  17.         jz      Fail
  18.  
  19.         cmp     word ptr [esi], "ZM"
  20.         jz      CheckPE
  21.  
  22. __2:sub     esi,10000h                                
  23.         dec     byte ptr[ebp + ecx]
  24.         jmp     __1
  25.  
  26. CheckPE:mov     edi, dword ptr[esi + 3Ch]         ; --> получаем смещение (находится оно по адресу Esi + 3ch
  27.         add     edi, esi                                    ; --> плюсуем к нему базу модуля
  28.         cmp     dword ptr[edi], "EP"                              ; --> проверяем сигнатуру PE
  29.         jz      Succ             
  30.         jmp     __2
  31.                  
  32. Fail: xor                 esi, esi
  33.  
  34. Succ:xchg    eax, esi
  35.         ret
  36.  
  37. end main


После выполнения в Eax база кернела

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




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

Создано: 11 июня 2009 20:39
· Личное сообщение · #6

а чем собственно неустраивает KernelBase.dll экспорт почти такойже как и в kernel32.dll



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

Создано: 11 июня 2009 21:36 · Поправил: Clerk
· Личное сообщение · #7

Если при загрузке kernek32.dll в LdrpInitializeProcess() будет возвращена ошибка STATUS_DLL_NOT_FOUND, то выполняется загрузка kernelbase.dll:
Code:
  1. LdrpInitializeProcess:
  2. ...
  3. 008AA005         movzx eax,word ptr ds:[eax+5C]    ; IMAGE_NT_HEADERS.OptionalHeader.Subsystem
  4. 008AA009         cmp ax,2                          ; IMAGE_SUBSYSTEM_WINDOWS_GUI
  5. 008AA00D         je short ntdll_1.008AA015
  6. 008AA00F         cmp ax,3                          ; IMAGE_SUBSYSTEM_WINDOWS_CUI
  7. 008AA013         jnz short ntdll_1.008AA078
  8. 008AA015         lea eax,dword ptr ss:[ebp-C8]
  9. 008AA01B         push eax
  10. 008AA01C         mov esi,ntdll_1.008AA0CC           ; UNICODE "kernel32.dll"
  11. 008AA021         push esi
  12. 008AA022         push edi
  13. 008AA023         push edi
  14. 008AA024         call ntdll_1.LdrLoadDll
  15. 008AA029         cmp eax,edi
  16. 008AA02B         mov dword ptr ss:[ebp-68],eax
  17. 008AA02E         jl ntdll_1.00879035
  18. 008AA034         push ntdll_1.0094320C
  19. 008AA039         push edi
  20. 008AA03A         push ntdll_1.008ADA44                 ; ASCII "BaseThreadInitThunk"
  21. 008AA03F         push dword ptr ss:[ebp-C8]
  22. 008AA045         call ntdll_1.LdrGetProcedureAddress   ; LdrGetProcedureAddress
  23. 008AA04A         cmp eax,edi
  24. 008AA04C         mov dword ptr ss:[ebp-68],eax
  25. 008AA04F         jl ntdll_1.008ED206
  26. 008AA055         push ntdll_1.009431C8
  27. 008AA05A         push edi
  28. 008AA05B         lea eax,dword ptr ss:[ebp-E0]
  29. 008AA061         push eax
  30. 008AA062         push dword ptr ss:[ebp-C8] 
  31. 008AA068         call ntdll_1.LdrGetProcedureAddress   ; LdrGetProcedureAddress
  32. 008AA06D         cmp eax,edi
  33. 008AA06F         mov dword ptr ss:[ebp-68],eax
  34. 008AA072         jl ntdll_1.008ED245
  35. 008AA078         push ntdll_1.00943300
  36. ~~~
  37. 00879035         cmp dword ptr ss:[ebp-68],C0000135    ; STATUS_DLL_NOT_FOUND
  38. 0087903C         je ntdll_1.008ED2DC
  39. 00879042         cmp dword ptr ss:[ebp-68],edi
  40. 00879045         jge ntdll_1.008AA078
  41. ~~~
  42. 008ED2DC         lea eax,dword ptr ss:[ebp-C8]
  43. 008ED2E2         push eax
  44. 008ED2E3         push ntdll_1.008ED398                 ; UNICODE "kernelbase.dll"
  45. 008ED2E8         push edi
  46. 008ED2E9         push edi
  47. 008ED2EA         call ntdll_1.LdrLoadDll
  48. 008ED2EF         mov dword ptr ss:[ebp-68],eax
  49. 008ED2F2         jmp ntdll_1.00879042

У меня нет рабочей системы, тока ядро и модуля поддержки валяются, kernelbase.dll тоже нет, буду благодарен если кто зальёт.




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 11 июня 2009 22:32
· Личное сообщение · #8

ещё инфа по вин7:

win7dll.info (проект Nir Sofer)

Windows 7 Kernel Architecture Changes - api-ms-win-core files

Windows 7 DLL File Information - kernel32.dll

-----
EnJoy!




Ранг: 191.8 (ветеран), 46thx
Активность: 0.170
Статус: Участник

Создано: 12 октября 2009 18:46
· Личное сообщение · #9

не знаю куда, отдельную тему не хочется, может здесь

www.microsoft.com/whdc/DevTools/WDK/WDKdocs.mspx
Updated: Oct 2, 2009
download.microsoft.com/download/3/3/C/33CFEF4D-21DA-4229-BC17-3EAC7A7EABE1/WDKDocs_10022009.EXE
в формате chm пока что-то нет,
предыдущий
download.microsoft.com/download/3/3/C/33CFEF4D-21DA-4229-BC17-3EAC7A7EABE1/wdkchm_08072009.chm
download.microsoft.com/download/3/3/C/33CFEF4D-21DA-4229-BC17-3EAC7A7EABE1/wdkchm.chm



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

Создано: 11 января 2010 14:08
· Личное сообщение · #10

Code:
  1. cld                    ;; clear the direction flag for the loop
  2.   xor edx, edx           ;; zero edx
  3.  
  4.   mov edx, [fs:edx+0x30] ;; get a pointer to the PEB
  5.   mov edx, [edx+0x0C]    ;; get PEB->Ldr
  6.   mov edx, [edx+0x14]    ;; get the first module from the InMemoryOrder module list
  7. next_mod:
  8.   mov esi, [edx+0x28]    ;; get pointer to modules name (unicode string)
  9.   push 24           ;; push down the length we want to check
  10.   pop ecx                ;; set ecx to this length for the loop
  11.   xor edi, edi           ;; clear edi which will store the hash of the module name
  12. loop_modname:
  13.   xor eax, eax           ;; clear eax
  14.   lodsb                  ;; read in the next byte of the name
  15.   cmp al, 'a'            ;; some versions of Windows use lower case module names
  16.   jl not_lowercase
  17.   sub al, 0x20           ;; if so normalise to uppercase
  18. not_lowercase:
  19.   ror edi, 13            ;; rotate right our hash value
  20.   add edi, eax           ;; add the next byte of the name to the hash
  21.   loop loop_modname      ;; loop until we have read enough
  22.   cmp edi, 0x6A4ABC5B    ;; compare the hash with that of KERNEL32.DLL
  23.   mov ebx, [edx+0x10]    ;; get this modules base address
  24.   mov edx, [edx]         ;; get the next module
  25.   jne next_mod           ;; if it doesn't match, process the next module
  26.   mov eax, ebx
  27.          ret





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 11 января 2010 18:07 · Поправил: mak
· Личное сообщение · #11

Давно тема была уже , там полный набор , а эту можно закрыть

--> Link <--

П.С. дата поста доисторическая

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube





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

Создано: 11 января 2010 19:02
· Личное сообщение · #12

Топик как бы староват и вряд ли уже актуален, закрою.


 eXeL@B —› Программирование —› получение адреса kernel32.dll в windows 7
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати