Да, похоже что способ "поиска назад", приведенный в начале, равно как и начинать плясать от значения в стеке, фейлит на вин7 - натыкаюсь на access violation. Но зато можно использовать предопределенные адреса Про список - это Пшенке. По вставке асм кода - иконка между иконками кинопленки ("медиа") и перечеркнутого глаза, "вставить..", там вставить код, и выбрать asm как язык.
Не должно. Что происходит когда доходит до MZ заголовка? Обычно порченный заголовок означает применение простейшего антидампа. Тогда более глубокий анализ нужен.
Нет, потому что нужно смотреть MZ заголовок, а не PE\0\0. PE заголовок можно найти только относительно DOS-заголовка.
Я это и имел ввиду, просто не указал явно. Сначала находим "MZ" (в памяти "ZM"), от него уже add esi, [esi+03Ch]. Только вопрос почему add, а не mov, ведь в esi уже адрес MZ...
Indy_ ,не буду темнить, Ваш код для меня сложен и местами непонятен. Я вижу, что там используются списки, но что это - не понимаю. Отправьте в нужное место, где можно подробнее почитать о том, что вы показали. Я еще знаю про способ черех SEH обработчик.
psh3nka Говорю же это анстаб метод. Каждая техника должна быть стабильной, а не работать в зависимости от фазы луны. И такой подход не должен использоваться(анстаб). #25 проход по списку. Это обычный двусвязанный список.
Я все выходные провел над изучением PE формата и анстаб методами его инфицирования. Вся инфа, которая мне доступна - полупротухшие маны из 200х. Что-то запускал из под олли, чтобы понять. Сдвиги появились, как и хоть какая-то практика. Где можно найти актуальную инфу?
psh3nka Вся актуальная инфа вам по мойму не годится. Так как это для вас всё слишком сложно, сейчас всё свелось к автоматике - графы, солверы, гипервизоры етц. То что вы начали изучать - это фундаментальная инфа и она не делится на годная/негодная/недостаточная. По формату есть офф доки.
Потому что по 0x3c хранится e_lfanew - оффсет до NT-хидеров относительно базы. Если сделать mov то там будет просто оффсет, а тебе нужен адрес. Хм... Здесь нужен не PE формат, а структуры PEB, LDR_DATA_TABLE_ENTRY, LIST_ENTRY (если ты хочешь относительно PEB'а получать инфу). Вот код, правда на C++, но работает от XP До 10 на x86 и на x64. Функцию хеша лучше сделать case-insensitive: Код (C++): // // Get module handle by hash // HMODULE __fastcall ApiCaller::Caller::GetModuleHandleFromHash(UINT64 uHash) { PPEB pPEB = NULL; LDR_DATA_TABLE_ENTRY *pLDRMod = NULL; PUNICODE_STRING pszLibrary = NULL; UINT64 uLibHash = 0; #ifdef _WIN64 pPEB = (PPEB)__readgsqword(0x60); #else pPEB = (PPEB)__readfsdword(0x30); #endif pLDRMod = (LDR_DATA_TABLE_ENTRY*)(((LIST_ENTRY*)(pPEB->Ldr->Reserved2[1]))->Flink); do { pszLibrary = (PUNICODE_STRING)pLDRMod->Reserved4; uLibHash = CalcHash(pszLibrary->Buffer); if (uLibHash == uHash) { return (HMODULE)pLDRMod->DllBase; } pLDRMod = (LDR_DATA_TABLE_ENTRY*)pLDRMod->Reserved1[0]; } while (pLDRMod); return NULL; } Как вариант для хеша можно юзать такую функцию, но она только case-insensetive для латиницы: Код (C++): // // Calculate hash // template <typename char_type> UINT64 CalcHash(char_type *pName) { UINT64 uHash = 0; char ch; while (*pName) { ch = (char)*pName++; if (ch >= 'A' && ch <= 'Z') ch |= 0x20; uHash = (uHash * 199 + ch) ^ (uHash << 32); } return uHash; }
TheTrick, тупо не работает код, потому что происходит исключение при чтении, после 2-3 итерации, что на вин7-64, что на xp. Код (ASM): format PE gran EQU 65536 pop eax ; push eax ; and eax,0FFFF0000H mov ecx,1024*1024/gran @loop: cmp word [eax],'ZM' jz @found sub eax,gran loop @loop jmp @fail @found: nop @fail: retn (у меня на основной работе запара, поэтому получается косолапо) (духовным наставником служил код с душком отсюда https://xakep.ru/2004/07/22/23159/) Инди, автоматика конечно хорошо, но для ее понимания нужно сначала вручную все понять. Вчера когда по JS-кам гуглил, нашел одну фразу, не могу не согласиться, "Есть мнение , что неважно как и какой последовательности читать, можно просто читать все подряд. Главное , что твоя нейронная сеть в голове, получает сходную информацию и соответствующие связи укрепляются. " Пшенка, в ссылкоподборку я кинул 2 ссылки, на kaimi.in есть более-менее современная инфа по работе с PE.
Благодарю. Ума не хватило понять, что оно почти сразу должно находить заголовок; в моем варианте лезет дальше на недоступную память. Конечно же 'MZ'
Потому что сам очепятался, да еще источник инфы, с которым сверялся для перепроверки, с таким же еггогом )
В фасме если мы пишем что-то типа mov eax, 'abcd' то строка ложится как есть, в отличии от студийного C++ например:
Особенности компилятора. Ещё один агрумент в пользу того, что следует использовать числовые константы вместо символьных.
По существу, кое-что более современное чем 2004 год, дает поиск "get kernel32 base on win7" например, https://c0llateral.wordpress.com/2009/12/26/25/ или talks здесь http://webcache.googleusercontent.com/search?q=cache:AcKgMSli60MJ:vxheaven.org/forum/viewtopic.php?id=2046+&cd=8&hl=ru&ct=clnk&gl=ru но вообще эти CMP с 4d5a есть жирная такая сигнатура, чуть ли не статическим анализатором ловить твою "тушку" будут. -- мне нужна помощь с Immunity Debugger; кто с ним работал, отзовитесь пжл. все никак не могу уяснить, как поставить брейк на NtDeviceIoControlFile(), мне это нужно для отладки Kernel32.Beep, перевожу статью, заодно повторяю что там делают. да, в гугле забанили уже.