Установка прав на запись в секцию во время выполнения
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Установка прав на запись в секцию во время выполнения - 2009-10-02 11:37:21.613333
|
|
|
quester
Сообщений: 78
Оценки: 0
Присоединился: 2008-10-17 10:09:21.190000
|
Как установить права на запись в секцию (вероятно, используя VirtualProtect), в случае, если: 1.) Импорт в отдельной секции, там, естественно, есть kernel32.dll. 2.) Импорта вообще нет. Как это сделать, не используя SEH и поиск kernel32 в АП, чтобы не увеличивать размер кода?
|
|
|
RE: Установка прав на запись в секцию во время выполнения - 2009-10-02 17:43:35.660000
|
|
|
quester
Сообщений: 78
Оценки: 0
Присоединился: 2008-10-17 10:09:21.190000
|
Так, постараюсь нормально написать. 1.) Мне надо установить разрешение на запись для области памяти, в которую спроецирована секция. Код выполняется в этой секции. Секция в характеристиках не имеет разрешения на запись. Мне надо записывать в эту область памяти. Для этого надо установить разрешение на запись. Я предполагаю, что это возможно сделать функцией VirtualProtect. Все параметры функции известны. Неизвестен адрес функции. 2.) Размер кода ограничен. В принципе, возможно использовать код поиска kernel32, с которым я ещё не разбирался. Но код достаточно объёмный. Он использует SEH, поиск по имени и т.д. 3.) Есть две ситуации. В первой ситуации, таблицы импорта нет вообще. Во второй ситуации таблица импорта имеется в отдельной секции. Больше всего интересует второй вариант. Вопросы: 1.) Как получить адрес VirtualProtect максимально простым и компактным способом? 2.) Есть ли варианты, помимо VirtualProtect?
|
|
|
RE: Установка прав на запись в секцию во время выполнения - 2009-10-02 17:45:32.176666
|
|
|
Sunzer
Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
|
Ищи базу кернеля, дальше парси таблицу экспорта, ищи там VirtualProtect, в чем проблема?
|
|
|
RE: Установка прав на запись в секцию во время выполнения - 2009-10-02 17:49:31.076666
|
|
|
quester
Сообщений: 78
Оценки: 0
Присоединился: 2008-10-17 10:09:21.190000
|
Проблема в поиске базы kernel32. Каким образом? Функция поиска наводит уныние своим размером и SEH. :-( Разбор экспорта тоже не очень маленький (но ещё куда ни шло). Всё упирается в поиск базы.
|
|
|
RE: Установка прав на запись в секцию во время выполнения - 2009-10-02 17:51:42.003333
|
|
|
Sunzer
Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
|
POP EAX PUSH EAX find: DEC EAX CMP DWORD PTR DS:[EAX],905A4D JNZ find На EP этот код поставь, работает под всеми окнами. Вот еще, но под Win7 не работает ; Get kernel32.dll ImageBase GetKernelBase proc PUSH EBP MOV EBP,ESP XOR EAX,EAX MOV EAX,FS:[EAX+30h] TEST EAX,EAX JS win9x MOV EAX,[EAX+0Ch] MOV ESI,[EAX+1Ch] LODSD MOV EAX,[EAX+8] JMP KernelBaseEnd win9x: mov EAX,[EAX+34h] ADD EAX,7Ch MOV EAX,[EAX+3Ch] KernelBaseEnd: LEAVE ret GetKernelBase endp
|
|
|
RE: Установка прав на запись в секцию во время выполнения - 2009-10-02 17:56:42.156666
|
|
|
quester
Сообщений: 78
Оценки: 0
Присоединился: 2008-10-17 10:09:21.190000
|
o.O И усё?! Спасибо. А как он работает? Что такое 905A4D? И что в eax? На W7 тоже работает? И зачем тогда такое?:
SEH_Block_0000 macro
add esp,-cPushad
jnz GNtBA_L1
endm
IGetNtBaseAddr: @SEH_SetupFrame <SEH_Block_0000>
mov ecx,edx
xchg ax,cx
GNtBA_L0: dec cx
jz GNtBA_L2
add eax,-10000h
pushad
mov bx,-IMAGE_DOS_SIGNATURE
add bx,word ptr [eax]
mov esi,eax
jnz GNtBA_L1
mov ebx,-IMAGE_NT_SIGNATURE
add eax,dword ptr [esi.MZ_lfanew]
mov edx,esi
add ebx,dword ptr [eax]
jnz GNtBA_L1
add edx,[eax.NT_OptionalHeader.OH_DirectoryEntries. \
DE_Export.DD_VirtualAddress]
add esi,dword ptr [edx.ED_Name]
lea edi,dword ptr [ebp+BufStrFilename]
call parse_filename
mov esi,edx
call get_str_crc32
cmp edx,dword ptr [ebp+CrcKernel32] ;Is KERNEL32.DLL ?
je k32_f
GNtBA_L1: popad
jmp GNtBA_L0
k32_f: popad
xchg ecx,eax
inc eax
GNtBA_L2: @SEH_RemoveFrame
ret
|
|
|
RE: Установка прав на запись в секцию во время выполнения - 2009-10-02 17:59:46.673333
|
|
|
quester
Сообщений: 78
Оценки: 0
Присоединился: 2008-10-17 10:09:21.190000
|
А в GetKernelBase что по адресу FS:[EAX+30h]?
|
|
|
RE: Установка прав на запись в секцию во время выполнения - 2009-10-02 18:00:49.026666
|
|
|
Sunzer
Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
|
quote:
Что такое 905A4D? MZ надо же базу найти, в EAX адрес кернеля, но не база.
|
|
|
RE: Установка прав на запись в секцию во время выполнения - 2009-10-02 18:05:29.296666
|
|
|
quester
Сообщений: 78
Оценки: 0
Присоединился: 2008-10-17 10:09:21.190000
|
4d5a, блин! Не заметил сразу. Понял. :-) Почему в eax адрес? По идее, он же должен в 0 устанавливаться? А эмуляторы, например, что пишут в eax?
|
|
|
RE: Установка прав на запись в секцию во время выполнения - 2009-10-02 18:05:56.320000
|
|
|
Flint_ta
Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
|
Мой кусочек кода для поиска VirtualProtect, вернет адрес в eax
db 064h, 0A1h, 030h, 000h, 000h, 000h, 08Bh, 040h, 00Ch, 08Bh, 070h, 01Ch, 0ADh, 08Bh, 040h, 008h
db 08Bh, 0D8h, 003h, 058h, 03Ch, 083h, 0C3h, 078h, 08Bh, 01Bh, 003h, 0D8h, 08Bh, 053h, 020h, 003h
db 0D0h, 053h, 033h, 0DBh, 068h, 063h, 074h, 000h, 000h, 068h, 072h, 06Fh, 074h, 065h, 068h, 075h
db 061h, 06Ch, 050h, 068h, 056h, 069h, 072h, 074h, 06Ah, 000h, 083h, 0C4h, 004h, 08Bh, 0F4h, 0B9h
db 00Eh, 000h, 000h, 000h, 056h, 051h, 08Bh, 03Ah, 003h, 0F8h, 0F3h, 0A6h, 074h, 008h, 059h, 05Eh
db 083h, 0C2h, 004h, 043h, 0EBh, 0EEh, 083h, 0EFh, 00Eh, 083h, 0C4h, 018h, 059h, 0D1h, 0E3h, 08Bh
db 051h, 024h, 003h, 0D0h, 003h, 0D3h, 08Bh, 012h, 081h, 0E2h, 0FFh, 0FFh, 000h, 000h, 08Bh, 059h
db 01Ch, 003h, 0D8h, 0C1h, 0E2h, 002h, 003h, 0DAh, 08Bh, 013h, 003h, 0D0h, 08Bh, 0C2h
|
|
|
RE: Установка прав на запись в секцию во время выполнения - 2009-10-02 18:12:00.290000
|
|
|
quester
Сообщений: 78
Оценки: 0
Присоединился: 2008-10-17 10:09:21.190000
|
Опять же, а что в fs:[30]?
|
|
|
RE: Установка прав на запись в секцию во время выполнения - 2009-10-02 18:16:55.193333
|
|
|
Flint_ta
Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
|
адрес PEB fs указывает на TEB структура TEB:
typedef struct _TEB
{
NT_TIB NtTib;
PVOID EnvironmentPointer;
CLIENT_ID ClientId;
PVOID ActiveRpcHandle;
PVOID ThreadLocalStoragePointer;
PPEB ProcessEnvironmentBlock;
ULONG LastErrorValue;
ULONG CountOfOwnedCriticalSections;
PVOID CsrClientThread;
PVOID Win32ThreadInfo;
ULONG User32Reserved[26];
ULONG UserReserved[5];
PVOID WOW32Reserved;
ULONG CurrentLocale;
ULONG FpSoftwareStatusRegister;
VOID * SystemReserved1[54];
LONG ExceptionCode;
PACTIVATION_CONTEXT_STACK ActivationContextStackPointer;
UCHAR SpareBytes1[36];
ULONG TxFsContext;
GDI_TEB_BATCH GdiTebBatch;
CLIENT_ID RealClientId;
PVOID GdiCachedProcessHandle;
ULONG GdiClientPID;
ULONG GdiClientTID;
PVOID GdiThreadLocalInfo;
ULONG Win32ClientInfo[62];
VOID * glDispatchTable[233];
ULONG glReserved1[29];
PVOID glReserved2;
PVOID glSectionInfo;
PVOID glSection;
PVOID glTable;
PVOID glCurrentRC;
PVOID glContext;
ULONG LastStatusValue;
UNICODE_STRING StaticUnicodeString;
WCHAR StaticUnicodeBuffer[261];
PVOID DeallocationStack;
VOID * TlsSlots[64];
LIST_ENTRY TlsLinks;
PVOID Vdm;
PVOID ReservedForNtRpc;
VOID * DbgSsReserved[2];
ULONG HardErrorMode;
VOID * Instrumentation[9];
GUID ActivityId;
PVOID SubProcessTag;
PVOID EtwLocalData;
PVOID EtwTraceData;
PVOID WinSockData;
ULONG GdiBatchCount;
UCHAR SpareBool0;
UCHAR SpareBool1;
UCHAR SpareBool2;
UCHAR IdealProcessor;
ULONG GuaranteedStackBytes;
PVOID ReservedForPerf;
PVOID ReservedForOle;
ULONG WaitingOnLoaderLock;
PVOID SavedPriorityState;
ULONG SoftPatchPtr1;
PVOID ThreadPoolData;
VOID * * TlsExpansionSlots;
ULONG ImpersonationLocale;
ULONG IsImpersonating;
PVOID NlsCache;
PVOID pShimData;
ULONG HeapVirtualAffinity;
PVOID CurrentTransactionHandle;
PTEB_ACTIVE_FRAME ActiveFrame;
PVOID FlsData;
PVOID PreferredLanguages;
PVOID UserPrefLanguages;
PVOID MergedPrefLanguages;
ULONG MuiImpersonation;
WORD CrossTebFlags;
ULONG SpareCrossTebBits: 16;
WORD SameTebFlags;
ULONG DbgSafeThunkCall: 1;
ULONG DbgInDebugPrint: 1;
ULONG DbgHasFiberData: 1;
ULONG DbgSkipThreadAttach: 1;
ULONG DbgWerInShipAssertCode: 1;
ULONG DbgRanProcessInit: 1;
ULONG DbgClonedThread: 1;
ULONG DbgSuppressDebugMsg: 1;
ULONG SpareSameTebBits: 8;
PVOID TxnScopeEnterCallback;
PVOID TxnScopeExitCallback;
PVOID TxnScopeContext;
ULONG LockCount;
ULONG ProcessRundown;
UINT64 LastSwitchTime;
UINT64 TotalSwitchOutTime;
LARGE_INTEGER WaitReasonBitMap;
} TEB, *PTEB;
|
|
|
RE: Установка прав на запись в секцию во время выполнения - 2009-10-02 18:20:52.230000
|
|
|
quester
Сообщений: 78
Оценки: 0
Присоединился: 2008-10-17 10:09:21.190000
|
И сложно, достаточно. Мне самый маленький код как раз подходит:
POP EAX
PUSH EAX
find:
DEC EAX
CMP DWORD PTR DS:[EAX],905A4D
JNZ find Остаётся правда несколько вопросов: 1.) Если в eax адрес kernel32, не может ли очередной багфикс винды это "исправить"? Тогда всё рухнет. Или это специально так сделано? 2.) Эмуляторы тоже самое закидывают в eax? 3.) У кого-то код работает через SEH, у Sunzer нет, у Flint_ta тоже не через SEH, но я пока не разобрался. Почему код у всех такой разный?
|
|
|
RE: Установка прав на запись в секцию во время выполнения - 2009-10-02 18:25:30.650000
|
|
|
Sunzer
Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
|
quote:
Остаётся правда несколько вопросов: 1.) Если в eax адрес kernel32, не может ли очередной багфикс винды это "исправить"? Тогда всё рухнет. Или это специально так сделано? 2.) Эмуляторы тоже самое закидывают в eax? 3.) У кого-то код работает через SEH, у Sunzer нет, у Flint_ta тоже не через SEH, но я пока не разобрался. Почему код у всех такой разный? 1) После виндового загрузчика там адрес кернеля всегда лежит, проверял вплоть до Win7. 2) х.з. смотря какой, может да, может нет. 3) Код разный, потому что люди разные, а через seh тоже можно.
|
|
|
RE: Установка прав на запись в секцию во время выполнения - 2009-10-02 18:31:19.973333
|
|
|
quester
Сообщений: 78
Оценки: 0
Присоединился: 2008-10-17 10:09:21.190000
|
2Flint_ta: А это строка для сравнения: PUSH 7463 PUSH 65746F72 PUSH 506C6175 PUSH 74726956 PUSH 0 ? Или что это? Не очень понимаю, как работает (вообще не понимаю). И без критических секций… Разьве не будет работать? Сейчас пойду искать что почитать. :-) 2Sunzer: quote:
1) После виндового загрузчика там адрес кернеля всегда лежит, проверял вплоть до Win7. А не может быть такое, что они - бац, и отрубят это в очередной версии сервис пака сразу для нескольких версий винды? Или на это много больших программ закладывается?
|
|
|
RE: Установка прав на запись в секцию во время выполнения - 2009-10-02 18:41:27.476666
|
|
|
Flint_ta
Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
|
quote:
ORIGINAL: quester 2Flint_ta: А это строка для сравнения: PUSH 7463 PUSH 65746F72 PUSH 506C6175 PUSH 74726956 PUSH 0 ? Это мои извращения, это так я в стэк кидаю имя функции :)
|
|
|
RE: Установка прав на запись в секцию во время выполнения - 2009-10-02 18:57:47.770000
|
|
|
Flint_ta
Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
|
Так там его пост [sm=ag.gif]
|
|
|
RE: Установка прав на запись в секцию во время выполнения - 2009-10-02 19:07:28.016666
|
|
|
quester
Сообщений: 78
Оценки: 0
Присоединился: 2008-10-17 10:09:21.190000
|
Гы, и правда, ник я не прочитал. [sm=ag.gif] Мда, возник ещё вопрос: как разбирать таблицу экспорта. Я почитал уже не только исходники. В исходниках функция казалась маленькой. Поскольку использовала CRC, вместо строк. :-( Может есть вариант менее "кодо-затратный", чем простой поиск?
|
|
|
RE: Установка прав на запись в секцию во время выполнения - 2009-10-02 19:13:38.556666
|
|
|
Flint_ta
Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
|
Самый простой способ это как минимум получить адреса GetProcAddress и LoadLibraryA а далее зная их получать все остальные необходимые функции стандартным способом без извращений.
|
|
|
RE: Установка прав на запись в секцию во время выполнения - 2009-10-02 19:19:34.070000
|
|
|
quester
Сообщений: 78
Оценки: 0
Присоединился: 2008-10-17 10:09:21.190000
|
Так мне сейчас нужна-то только VirtualProtect. Больно уж долго и муторно - прямым поиском. :-/ Интересно, загрузчик делает так же..?
|
|
|
RE: Установка прав на запись в секцию во время выполнения - 2009-10-02 20:47:12.690000
|
|
|
quester
Сообщений: 78
Оценки: 0
Присоединился: 2008-10-17 10:09:21.190000
|
Нашёл на wasm. Поиск по хэшам, но не CRC32. http://www.wasm.ru/article.php?article=searchapi
|
|
|
RE: Установка прав на запись в секцию во время выполнения - 2009-10-03 02:06:44.320000
|
|
|
quester
Сообщений: 78
Оценки: 0
Присоединился: 2008-10-17 10:09:21.190000
|
Теперь вываливается с ошибкой VirtualProtect. Вызываю так:
; В return - мусор
; VirtualProtect([code_pointer + edx], decryptor_end - code_pointer,
; PAGE_EXECUTE_READWRITE, [return + edx]);
; Адрес для старого атрибута
push offset return
add [esp - 4], edx
push PAGE_EXECUTE_READWRITE
; Размер области
push ecx
; Начало области
push ebx
call dword ptr [eax] return - запрещена для записи. Вылетает ошибка. Но, если делать так:
; Адрес для старого атрибута
; push offset return
push 0
push esp
;add [esp - 4], edx
push PAGE_EXECUTE_READWRITE
; Размер области
push ecx
; Начало области
push ebx
call dword ptr [eax] Тоже вылетает ошибка. Где я напортачил?
|
|
|
RE: Установка прав на запись в секцию во время выполнения - 2009-10-03 10:45:59.013333
|
|
|
quester
Сообщений: 78
Оценки: 0
Присоединился: 2008-10-17 10:09:21.190000
|
О, блин! У меня обострение тупости. call eax. P.S.: Кажется я разговариваю сам с собою… Вслух?
|
|
|
RE: Установка прав на запись в секцию во время выполнения - 2009-10-04 21:31:38.416666
|
|
|
Sunzer
Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
|
Нет, просто твой топик не мониторится круглосуточно. Остались еще какие то вопросы? Спрашивай.
|
|
|
RE: Установка прав на запись в секцию во время выполнения - 2009-10-05 13:37:28.150000
|
|
|
quester
Сообщений: 78
Оценки: 0
Присоединился: 2008-10-17 10:09:21.190000
|
quote:
Нет, просто твой топик не мониторится круглосуточно. Не, я не жалуюсь. Ответили по делу и очень оперативно. Спасибо большое. Просто я действительно начал разговаривать сам собою вслух… :D Хм… Мда, это мне не очень нравится. Первый шаг на пути …? Чего-то не так. [>:] Вопросы будут, спрошу. :)
|
|
|
|
|