Я уже давно любитель покопаться в чужих прогах, но постоянно спотыкаюсь на тех из них, которые написаны с помощью MFC. Помогите пожалуйста разобраться, как лучше исследовать MFC-программы. Собственно вот: Код (Text): .text:0041B5D6 ; int __stdcall wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd) .text:0041B5D6 _wWinMain@16 proc near ; CODE XREF: ___tmainCRTStartup+14Bp .text:0041B5D6 .text:0041B5D6 var_18 = dword ptr -18h .text:0041B5D6 var_10 = dword ptr -10h .text:0041B5D6 var_8 = dword ptr -8 .text:0041B5D6 var_4 = dword ptr -4 .text:0041B5D6 hInstance = dword ptr 8 .text:0041B5D6 hPrevInstance = dword ptr 0Ch .text:0041B5D6 lpCmdLine = dword ptr 10h .text:0041B5D6 nShowCmd = dword ptr 14h .text:0041B5D6 .text:0041B5D6 mov edi, edi .text:0041B5D8 push ebp .text:0041B5D9 mov ebp, esp .text:0041B5DB pop ebp .text:0041B5DC jmp loc_41B72C .text:0041B5E1 ; --------------------------------------------------------------------------- ............................................................................................................................................. .text:0041B72C loc_41B72C: ; CODE XREF: wWinMain(x,x,x,x)+6j .text:0041B72C jmp ds:mfc90u_1272 .text:0041B72C _wWinMain@16 endp ; sp-analysis failed .text:0041B72C .text:0041B72C ; --------------------------------------------------------------------------- Тут явно видно, что истинная точка входа - не WinMain, тогда как её найти? Ну и в кратце просветите про структуру MFC-программ, дайте полезных ссылочек, где можно почерпнуть нужную информацию быстро. Спасибо.
Artem_N Вторая ссылка: А вообще я удивлён, - на запрос "дизассемблирование MFC-программ" гугл выдаёт воду про дизассемблирование в целом. Что, не ужели в России MFC-приложения не хакают? Или отечественное движение реверсеров вырождается? Судя по активности участников WASM.RESEARCH, это похоже на правду Всё равно продолжаю поиски, ну и естественно надеюсь на Вашу помощь. Не верю, что ссылка, данная Artem_N'ом (и которая привела хз куда), единственная.
LShadow77 Отключите антивирус, скачайте, там скрипт для олли и сэмпл, который и определяется как Malware, на самом деле является обычным crackme.
Как я погляжу, вы в камасутре преуспели гораздо больше, чем в реверсинге. Я рад за вас! Что касается меня, то я не претендую на звание гения дизассемблирования и создал эту тему в расчёте на реальную помощь, а не поток флуда. Вот, пока что набрёл на эту статью: http://www.woodmann.com/forum/entry.php?134-Guidelines-to-MFC-reversing, уже хоть что-то...
LShadow77 Подумаешь, какое-то ложное срабатывание. PDF-файла в том архиве хватит для входа в тему MFC сложная штука, чтобы вот так вот сразу.
Так какие проблемы? Напишите собственное простейшее MFC-приложение (в Интернете можно найти прогу размером менее 20 строчек), скомпилируйте его в отладочном режиме и начинайте исследовать структуру вашего бинарника (с отладочными символами). А вообще-то, как по мне, то это и не особенно нужно, если, конечно, вас не интересует собственно системный MFC-менеджер. Достаточно понимать, что WinMain просто передает управление MFC-менеджеру, а тот уже рано или поздно вызовет все ваши подпрограммы и функции. А во всем остальном вы будете иметь дело с «сишным» ассемблером. P.S. Кстати, вот нашел у себя простейшую MFC-прогу: Код (Text): #include <afxwin.h> #define IDR_MAINFRAME 128 class CMainApp : public CWinApp { public: virtual BOOL InitInstance() { //*** Первый вариант //* //CFrameWnd *pFrameWnd = new CFrameWnd; //pFrameWnd->Create(NULL, _T("Дикий век, грубые нравы, романтизма нет!")); //m_pMainWnd = pFrameWnd; //m_nCmdShow = SW_MAXIMIZE; //m_pMainWnd->ShowWindow(m_nCmdShow); //return TRUE; //* //*** Первый вариант //*** Второй вариант //* CFrameWnd *pFrameWnd = new CFrameWnd; pFrameWnd->Create(NULL, _T("Мелодия для флейты без фортепиано")); m_pMainWnd = pFrameWnd; int cx = ::GetSystemMetrics(SM_CXSCREEN)/12; int cy = ::GetSystemMetrics(SM_CYSCREEN)/8; m_pMainWnd->SetWindowPos(NULL, cx, cy, 10*cx, 6*cy, SWP_NOZORDER | SWP_SHOWWINDOW); return TRUE; //* //*** Второй вариант }; }; CMainApp theApp;
Вот же ж пипец! Уже 5-й час качаю MS Visual Studio 2008, и всё только для того, чтобы получить исходники MFC90 и def-файл, без которого не получится связать ординалы с символьными именами Про дзен реверса можете мне не рассказывать. В своё время просиживал в дизассемблере по 16 часов в сутки, забывая пожрать. Модифицировал множество игр, расшифровал несколько форматов PACK-файлов, копался в прогах, чтобы понять "как это сделано". Это к тому, что кое-какой опыт дизассемблирования у меня всё же имеется. MFC это не C++, - это навороченная объектноориентированная надстройка над Win32 API. А C++ - это язык программирования и знаю я его на достаточном уровне, уж поверте. Вот конкретно в MFC - плаваю, потому и создал эту тему.
Прочитайте статью «Создание универсальных def и lib-файлов для «чужих» dll», уверен, что тогда уже можно будет не качать 5 часов MS Visual Studio 2008 .