eXeL@B —› Крэки, обсуждения —› Считывание первых байт функции из библиотеки |
Посл.ответ | Сообщение |
|
Создано: 22 октября 2005 13:02 · Личное сообщение · #1 |
|
Создано: 22 октября 2005 13:41 · Личное сообщение · #2 1) сделай ей LoadLibraryA, потом GetProcAddress с названием своей функции, получишь ее адрес, а там уж и читай по этому адресу 2) Открой этот файлик на чтение, возьми оттуда адрес таблицы экспорта, в ней найди имя своей функции, сопоставь его ее адресу, пересчитывая виртуальные смещения в физические и все... |
|
Создано: 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 —› Крэки, обсуждения —› Считывание первых байт функции из библиотеки |