Посл.ответ |
Сообщение |
Ранг: 226.0 (наставник), 67thx Активность: 0.16↘0 Статус: Участник
|
Создано: 14 июля 2007 20:45 · Личное сообщение · #1
Вот накидал процедурку, которая ищет сигнатуру и патчит свой процесс в памяти.
Может кому пригодиться. Писал для применения в лоадере который делает инжект своего кода в загружаемый процесс.
Пока сырая. Жду критики.
Function PathInCode(Sign, Path: ShortString): Dword;
Asm //add 1 to first byte of signature before call to this proc !!!
push ebx
push ecx
push edx
push edi
push esi
mov ebx, edx
mov edx, eax
xor eax, eax
mov edi, $00400000
mov ecx, $00050000
mov al, [edx][1]
dec al
cld
@search:
repne scasb
je @compare
xor eax, eax
jmp @exit
@compare:
push edi
push ecx
mov esi, edx
add esi, 2
xor ecx, ecx
mov cl, [edx][0]
dec ecx
repe cmpsb
pop ecx
pop edi
jne @search
dec edi
@path:
mov esi, ebx
inc esi
xor ecx, ecx
mov cl, [ebx][0]
push ecx
push edx
push PAGE_EXECUTE_READWRITE
push ecx
push edi
call VirtualProtect
pop ecx
mov eax, edi
rep movsb
@exit:
pop esi
pop edi
pop edx
pop ecx
pop ebx
End;
В приложении пример использования.
29dc_14.07.2007_CRACKLAB.rU.tgz - PathInMem.zip
| Сообщение посчитали полезным: |
|
Ранг: 226.0 (наставник), 67thx Активность: 0.16↘0 Статус: Участник
|
Создано: 14 июля 2007 23:35 · Поправил: SergX · Личное сообщение · #2
Как можно получить эту инфу (о своём процессе) ?
Скопировано из Olly:
Memory map
Address Size Owner Section Contains Type Access Initial Mapped as
00400000 00001000 Project1 PE header Imag R RWE
00401000 00050000 Project1 CODE code Imag R RWE
00451000 00002000 Project1 DATA data Imag R RWE
00453000 00001000 Project1 BSS Imag R RWE
00454000 00002000 Project1 .idata imports Imag R RWE
00456000 00001000 Project1 .tls Imag R RWE
00457000 00001000 Project1 .rdata Imag R RWE
00458000 00006000 Project1 .reloc relocations Imag R RWE
0045E000 00006000 Project1 .rsrc resources Imag R RWE
Интересует CODE Address и CODE Size своего процесса.
| Сообщение посчитали полезным: |
Ранг: 340.0 (мудрец), 22thx Активность: 0.12↘0 Статус: Участник THETA
|
Создано: 14 июля 2007 23:49 · Личное сообщение · #3
В общем случае делаешь mapping файла в памяти, затем проходишь к PE-заголовку и оттуда считываешь нужную инфу.
----- Программист SkyNet | Сообщение посчитали полезным: |
Ранг: 226.0 (наставник), 67thx Активность: 0.16↘0 Статус: Участник
|
Создано: 14 июля 2007 23:54 · Личное сообщение · #4
FrenFolio я не уверен что ты меня правильно понял. Или я тебя не понял...
Я имел ввиду как получить CODE Address и CODE Size уже запущенного своего процесса.
Неужели нет более простых вариантов ?
| Сообщение посчитали полезным: |
Ранг: 1288.1 (!!!!), 273thx Активность: 1.29↘0 Статус: Участник
|
Создано: 14 июля 2007 23:55 · Личное сообщение · #5
Читай сразу из PE-заголовка нужную инфу.
| Сообщение посчитали полезным: |
Ранг: 340.0 (мудрец), 22thx Активность: 0.12↘0 Статус: Участник THETA
|
Создано: 14 июля 2007 23:58 · Личное сообщение · #6
Ara пишет:
Читай сразу из PE-заголовка нужную инфу.
Я это и подразумевал.
----- Программист SkyNet | Сообщение посчитали полезным: |
Ранг: 120.9 (ветеран), 5thx Активность: 0.08↘0 Статус: Участник Programmer and reverser
|
Создано: 15 июля 2007 00:06 · Личное сообщение · #7
FrenFolio
зачем делать маппинг, если файл уже смаппирован загрузчиком винды?
SergX
а чем тебе не нравится способ? куда уж проще)
----- Уважайте других и пишите грамотно. | Сообщение посчитали полезным: |
Ранг: 340.0 (мудрец), 22thx Активность: 0.12↘0 Статус: Участник THETA
|
Создано: 15 июля 2007 00:39 · Личное сообщение · #8
Executioner пишет:
зачем делать маппинг, если файл уже смаппирован загрузчиком винды?
Поэтому я и приписал, что в общем случае. Если же процесс уже запущен, то конечно нет смысла делать маппинг еще раз.
----- Программист SkyNet | Сообщение посчитали полезным: |
Ранг: 271.6 (наставник), 2thx Активность: 0.3↘0 Статус: Участник
|
Создано: 15 июля 2007 01:06 · Личное сообщение · #9
Решил не создавать новый топик.
Подскажите, как в масме компилить, чтоб на секцию кода был "Full Access" (E000060)
----- iNTERNATiONAL CoDE CReW | Сообщение посчитали полезным: |
Ранг: 1288.1 (!!!!), 273thx Активность: 1.29↘0 Статус: Участник
|
Создано: 15 июля 2007 02:11 · Личное сообщение · #10
Spirit пишет:
Подскажите, как в масме компилить, чтоб на секцию кода был "Full Access" (E000060)
Линкеру ключ указать типа /SECTION:.text,ERW
| Сообщение посчитали полезным: |
Ранг: 226.0 (наставник), 67thx Активность: 0.16↘0 Статус: Участник
|
Создано: 15 июля 2007 13:44 · Личное сообщение · #11
Ara пишет:
Читай сразу из PE-заголовка нужную инфу.
Ты имееш ввиду отсюда ?
Address Size Owner Section Contains Type Access Initial Mapped as
00400000 00001000 Project1 PE header Imag R RWE
А он всегда будет по адресу 00400000 ?
| Сообщение посчитали полезным: |
Ранг: 1288.1 (!!!!), 273thx Активность: 1.29↘0 Статус: Участник
|
Создано: 15 июля 2007 14:53 · Личное сообщение · #12
SergX - покури лучше доки по PE-формату. Хотя бы эту. Обрати внимание на пункт [2] Заголовок PE файла (PE Header).
Цитата: Сигнатурка того, что этот файл собственно говоря является PE - должна быть 4550h, иначе - 'PE'
Вот эта сигнатурка может быть по разным смещениям. От нее уже всё идет по фиксированным смещениям, в таблице указаны они. Т.е. для начала тебе надо определить начало PE Header'a, от него уже по фиксированным смещениям читай что хочешь, в частности Таблицу объектов (секций) файла (Object Table) (ц)
| Сообщение посчитали полезным: |
Ранг: 61.4 (постоянный), 1thx Активность: 0.02↘0 Статус: Участник
|
Создано: 15 июля 2007 15:05 · Личное сообщение · #13
лучше MZ-заголовок найти.
| Сообщение посчитали полезным: |
Ранг: 1288.1 (!!!!), 273thx Активность: 1.29↘0 Статус: Участник
|
Создано: 15 июля 2007 16:05 · Личное сообщение · #14
n0name - MZ-заголовок начинается со смещения 0х00h, зачем его искать?
| Сообщение посчитали полезным: |
Ранг: 120.9 (ветеран), 5thx Активность: 0.08↘0 Статус: Участник Programmer and reverser
|
Создано: 15 июля 2007 18:50 · Личное сообщение · #15
push 0
call GetModuleHandleA
mov edx, dword ptr [eax+3Ch]
add edx, eax
; теперь в EDX указатель на PE-заголовок
mov ebx, dword ptr [edx+2Ch]
; теперь в EBX Base of Code
mov ecx, dword ptr [edx+1Ch]
; теперь в ECX Size of Code
----- Уважайте других и пишите грамотно. | Сообщение посчитали полезным: |
Ранг: 120.9 (ветеран), 5thx Активность: 0.08↘0 Статус: Участник Programmer and reverser
|
Создано: 15 июля 2007 19:07 · Личное сообщение · #16
только Base of Code это смещение, учти! Возможно, к нему придется прибавить ImageBase (она в EAX в данном случае)
----- Уважайте других и пишите грамотно. | Сообщение посчитали полезным: |
Ранг: 1288.1 (!!!!), 273thx Активность: 1.29↘0 Статус: Участник
|
Создано: 15 июля 2007 19:46 · Личное сообщение · #17
Executioner
Зря ты так Человеку не оставляешь места для изучения доков и мыслительного процесса. Между прочим, он задает не первый вопрос про РЕ, ему бы лучше самому почитать доку и разобраться что к чему. В данном случае готовое решение сыграет негативную роль. ИМХО.
| Сообщение посчитали полезным: |
Ранг: 120.9 (ветеран), 5thx Активность: 0.08↘0 Статус: Участник Programmer and reverser
|
Создано: 15 июля 2007 21:10 · Личное сообщение · #18
Ara
Надеюсь, SergX человек разумный (он же homo sapiens), поэтому покурит доки, ибо всю жизнь ему готовые решения подкидывать не будут Не думаю, что он поймет все тонкости формата за полчаса и очень долго будет писать свой патчер А так быстренько напишет и буит доки читать
SergX
Чиатй ЭТО http://www.wasm.ru/print.php?article=green2red02 . Очень хорошая статья.
Насчет мыслительного процесса... Подумай, как работает этот код, почему именно такие смещения, прежде чем копипастить)
Кстати, твой код можно нехило упростить
{Почувствовал себя преподом) или мамой)))))}
----- Уважайте других и пишите грамотно. | Сообщение посчитали полезным: |
Ранг: 340.0 (мудрец), 22thx Активность: 0.12↘0 Статус: Участник THETA
|
Создано: 15 июля 2007 22:20 · Поправил: FrenFolio · Личное сообщение · #19
SergX
Вот код Executioner в более наглядном исполнении.
invoke GetModuleHandle, NULL ; получаем Image Base проги
ASSUME eax: ptr IMAGE_DOS_HEADER ; указатель на MZ-заголовок
mov edx, [eax].e_lfanew ; сохраняем в edx смещение на PE-заголовок
add edx, eax
ASSUME edx: ptr IMAGE_NT_HEADERS ; указатель на PE-заголовок
mov ebx, [edx].OptionalHeader.BaseOfCode ; получаем BaseOfCode из структуры Optional Header
mov ecx, [edx].OptionalHeader.SizeOfCode ; получаем SizeOfCode из структуры Optional Header
mov dwImageBase, eax ; сохраняем в переменную значение Image Base
add ebx, dwImageBase ; RVA адрес BaseOfCode с учетом Image Base
ASSUME edx: NOTHING
ASSUME eax: NOTHING
Вообще согласен с Executioner! Быстро разобраться в PE-формате довольно проблематично, а имея пример, совсем другое дело.
----- Программист SkyNet | Сообщение посчитали полезным: |
Ранг: 61.4 (постоянный), 1thx Активность: 0.02↘0 Статус: Участник
|
Создано: 15 июля 2007 23:06 · Личное сообщение · #20
Ara
дык а PE-что искать? из MZ можно взять смещение. А вот MZ заголовок искать надо, может ему надо засунуть это как базонезависимый код.
| Сообщение посчитали полезным: |
Ранг: 309.8 (мудрец), 21thx Активность: 0.17↘0 Статус: Участник
|
Создано: 16 июля 2007 00:04 · Поправил: SLV · Личное сообщение · #21
> А вот MZ заголовок искать надо
третий дворд в PEB...
----- Shalom ebanats! | Сообщение посчитали полезным: |
Ранг: 226.0 (наставник), 67thx Активность: 0.16↘0 Статус: Участник
|
Создано: 16 июля 2007 09:29 · Личное сообщение · #22
В сем спасибо за доки. Иду читать.
Executioner пишет:
Кстати, твой код можно нехило упростить
Об этом я догадываюсь...
Что стоит поменять на твой взгляд ?
| Сообщение посчитали полезным: |
Ранг: 120.9 (ветеран), 5thx Активность: 0.08↘0 Статус: Участник Programmer and reverser
|
Создано: 16 июля 2007 10:06 · Личное сообщение · #23
SLV пишет:
третий дворд в PEB...
только для Win2k - XP SP2
----- Уважайте других и пишите грамотно. | Сообщение посчитали полезным: |