Русский / Russian English / Английский

Сейчас на форуме: Storage (+3 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

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

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

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

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

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

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

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

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

Создано: 22 октября 2005 13:46 New!
Цитата · Личное сообщение · #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 —› Крэки, обсуждения —› Считывание первых байт функции из библиотеки

Видеокурс ВЗЛОМ