Сейчас на форуме: r0lka, yashechka (+4 невидимых)

 eXeL@B —› Крэки, обсуждения —› Считывание первых байт функции из библиотеки
Посл.ответ Сообщение

Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 22 октября 2005 13:02
· Личное сообщение · #1

Прошу помочь. Нужно прочитать первые байты функции из библиотеки зная только название функции.
Библиотека лежит на диске, а не в памяти



Ранг: 186.8 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 22 октября 2005 13:41
· Личное сообщение · #2

1) сделай ей LoadLibraryA, потом GetProcAddress с названием своей функции, получишь ее адрес, а там уж и читай по этому адресу
2) Открой этот файлик на чтение, возьми оттуда адрес таблицы экспорта, в ней найди имя своей функции, сопоставь его ее адресу, пересчитывая виртуальные смещения в физические и все...



Ранг: 17.7 (новичок)
Активность: 0.010
Статус: Участник

Создано: 22 октября 2005 13:46
· Личное сообщение · #3

Так понял, что загрузить библу нельзя?
Тогда читай хедер, ищи адрес таблицы экспорта, просматривай подряд все имена и сравнивай с искомой функцией. Если есть совпадение, то получаешь адрес этой функции и читаешь от туда свои байты.
Вот те кусь сырца. Я его писал правда для поиска в памяти названия функции по ее адресу (операция обратная GetProcAddress). ReadProcessMemory замени на ReadFile и обработай напильником

ReadProcessMemory(hProc, (PVOID) (modBase + 0x3C), &t, 4, &d);
modPEOffs = modBase + t;
ReadProcessMemory(hProc, (PVOID) (modPEOffs + 0x78), &t, 4, &d);
modExpTblOffs = modBase + t;
ReadProcessMemory(hProc, (PVOID) (modExpTblOffs + 0x10), &t, 4, &d);
ordBase = t;
ReadProcessMemory(hProc, (PVOID) (modExpTblOffs + 0x14), &t, 4, &d);
numFunct = t;
ReadProcessMemory(hProc, (PVOID) (modExpTblOffs + 0x18), &t, 4, &d);
numNames = t;
ReadProcessMemory(hProc, (PVOID) (modExpTblOffs + 0x1C), &t, 4, &d);
addrTbl = modBase + t;
ReadProcessMemory(hProc, (PVOID) (modExpTblOffs + 0x20), &t, 4, &d);
nameTbl = modBase + t;
ReadProcessMemory(hProc, (PVOID) (modExpTblOffs + 0x24), &t, 4, &d);
ordTbl = modBase + t;

DWORD min = -1, ord = 0;
for(DWORD j = 0; j < numFunct; j++)
{
//а в этом цикле тебе надо сравнивать не адреса функций, а их названия
//те цикл должен обрабатывать массив имен, а не адресов
ReadProcessMemory(hProc, (PVOID) (addrTbl + j * 4), &t, 4, &d);
if(((addr - modBase - t) >= 0) && ((addr - modBase - t) < min))
{
min = addr - modBase - t;
ord = j;
}
}
WORD apiOrd;
DWORD namePtr;
for(j = 0; j < numFunct; j++)
{
//а в этом цикле ты будешь искать адрес функции
//те цикл должен обрабатывать массив адресов, а не имен
ReadProcessMemory(hProc, (PVOID) (ordTbl + j * 2), &apiOrd, 2, &d);
if(apiOrd == ord)
{
ReadProcessMemory(hProc, (PVOID) (nameTbl + j * 4), &t, 4, &d);
namePtr = modBase + t;
break;
}
}

Что-то типа этого должно быть. Если я правильно понял вопрос.
Т.ч. бери мануал по PE и вперед, на барикады

А еще вопрос к старейшинам. Есть ли какие-нибудь приблуды, чтоб с PE проще работать. Типа говотишь функции прожевать такой-то файл и срыгнуть все в виде структур, массивов и списков?


 eXeL@B —› Крэки, обсуждения —› Считывание первых байт функции из библиотеки
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати