Народ! помогите! =) Нужен Win16 С++ компилер (конкретно Visual C++ 1.5) и/или отладчик... нигде ничего найти не могу =(( Вообще задача следующая: есть win16 приложение использующее кучу своих dll нужно разобрать структуру данных с которыми она работает (БД собственного формата) и вытащить оттуда эти данные...еще хуже то что программа японская...данные - тоже основная работа с файлами идет через dll файлы...но разобраться в том что дизассемблировалось очень сложно...есть мысль загнать это в отладчик или сделать fake dlls через которые я могу посмотреть все параметры вызываемых ф-ий... или может есть какая прога позволяющая подсмотреть вызовы функций и значения параметров ? где то чтото читал что вроде как BoundsChecker может в этом помочь но как и что это вообще в подробностях - не нашел... пмогите умными советами plz. ps еще вопрос на засыпку - Turbo C++ 4.5 при объявлении экспортируемых функций в dll не поддерживает директиву stdcall ?? =( ругается ("size of "_stdcall" is unknown or zero)......?
ну вроде как PASCAL можно испльзовать... попробую подругому объясниться... вот например то что мне выдает ида... ; Attributes: bp-based frame ; int __stdcall __far EpcWKCallMessage(UINT,HWND) public EpcWKCallMessage EpcWKCallMessage proc far каким должен быть код объявления ф-ии чтоб получилось то же самое ?
JShade Нужен Win16 С++ компилер (конкретно Visual C++ 1.5) Попробуй Microsoft Visual C V1.5 [CD version] (45'388'210 байт) каким должен быть код объявления ф-ии чтоб получилось то же самое ? Скорее всего надо делать def-файл и в секции экспорта писать нужное имя.
ээ..а можно подробнее ? а тоесли честно я не особо спец в С..по крайней мере с def файлами не работал... очень сомневаюсь... Электронный каталог запчастей Honda Japan...нужно выгрузить данные оттуда... то что есть в инете это выдранные из Tekdoc'a и немного не те днанные...
JShade насколько помню: int EpcWKCallMessage(UINT, HWND) - HWND=WORD? модификатор __stdcall используется в TC по умолчанию (есть ещё PASCAL для совместимости с TASM и TP/BP); модификатор __far выставляется в настройках проекта.
JShade а можно подробнее ? В архиве, ссылку на который я дал, есть примеры. + в файле-справке MSCOPTS.HLP есть раздел Module-Definition Statements. Конкретные вопросы есть? Пример Код (Text): // testdll.cpp #include <windows.h> #ifdef __cplusplus extern "C" { #endif int _acrtused = 0x9876; int __export CALLBACK LibMain(HANDLE hModule, WORD wDataSeg, WORD cbHeapSize, LPSTR lpszCmdLine) { hModule; wDataSeg; cbHeapSize; lpszCmdLine; return 1; } int __export CALLBACK WEP(int bSystemExit) { bSystemExit; return 1; } int __export CALLBACK EpcWKCallMessage(UINT p1, HWND p2) { p1; p2; return 1; } #ifdef __cplusplus } #endif // eof testdll.cpp // testdll.def LIBRARY TESTSDLL EXETYPE WINDOWS CODE PRELOAD MOVEABLE DISCARDABLE DATA PRELOAD SINGLE HEAPSIZE 1024 EXPORTS WEP @1 EpcWKCallMessage @2 // eof testdll.def // makeit.bat set path=C:\MSVC15\BIN;%path% set include=C:\MSVC15\INCLUDE set lib=C:\MSVC15\LIB cl.exe /nologo /Zl /YX /G2 /Zp1 /W3 /AM /Ox /D "NDEBUG" /FR /GD /Gs /c TESTDLL.CPP link /NOLOGO /NOD /ALIGN:16 /ONERROR:NOEXE TESTDLL.OBJ,TESTDLL.DLL,,,TESTDLL.DEF implib /nowep TESTDLL.LIB TESTDLL.DLL // eof makeit.bat
q_q ну вот функцию EpcWKCallMessage из твоего примера ида понимает так public EPCWKCALLMESSAGE EPCWKCALLMESSAGE proc far mov ax, seg dseg02 ; TESTSDLL_2 push bp mov bp, sp push ds mov ds, ax mov ax, 1 pop ds leave retf 4 EPCWKCALLMESSAGE endp все просто и понятно... но мне интересно откуда ида в оригинале берет ; int __stdcall __far EpcWKCallMessage(UINT,HWND) откуда она это понмает ? как она понимает тип переменных ? в каких случаях ида пишет или не пишет этот комментарий? что вообще дают записи в секции exports в def файле ? вроде бы и без этого все так же экспортируется...
хм...как... public EPCWKCALLMESSAGE EPCWKCALLMESSAGE proc far mov ax, seg dseg02 ; TESTSDLL_2 ; TESTSDLL_5 ; ?EPCWKCALLMESSAGE@@ZCHII@Z push bp mov bp, sp push ds mov ds, ax mov ax, 1 pop ds leave retf 4 EPCWKCALLMESSAGE endp при этом в списке экспортируемых функций эта ф-я представлена 2 раза под разными номерами но с одним адресом EPCWKCALLMESSAGE 2 EPCWKCALLMESSAGE(uint,uint) 5 так же и WEP расскажи что ты сделал то? =) с ; int __stdcall __far EpcWKCallMessage(UINT,HWND) вроде как разобрался если иде насильно скормить FLIRT от VC++ runtime (почему автоматом не понимает? типа совсем маленькая dll и мало данных для анализа? =) ) и потом в описании функции ткнуть Y (set function type) тогда все получается как надо... как я понял тип параметров она находит из того где эти параметры используются внутри функции...например p1 используется первым в MessageBox следовательно у него явно тип HWND...
и еще вопрос мож кто знает...это правда больше по поводу работы компилера vc 1.5... в оригинальной dll среди экспортируемых ф-й есть ___ExportedStub если в vc проекте в настройках не ставить галку Disable Stack Checking то и в моей dll будет эта функция но соответственно добавится доп. код во все мои ф-ии, чего нет в оригинале... вопрос что это за ф-я такая и нужна ли она, т.е может это какая то системная ф-я не используемая приложениями которые работают с этой dll ? нужно сделать аналог оригинальной dll но так как отлаживать прогу не получается и в довесок она на японском то она мне при какой нить ошибке выплюнет просто японские иероглифы которые для меня просто японские иероглифы безо всякого смысла =)
JShade расскажи что ты сделал то? =) Предположил, что ida умеет доставать типы параметров, разбирая имена cpp-функций, поэтому перенес Код (Text): #ifdef __cplusplus } #endif с конца исходника, на место после int _acrtused = 0x9876;, т.е. до подпрограмм, изменил def-файл на Код (Text): LIBRARY TESTSDLL EXETYPE WINDOWS CODE PRELOAD MOVEABLE DISCARDABLE DATA PRELOAD SINGLE HEAPSIZE 1024 EXPORTS WEP = ?WEP@@ZCHH@Z @1 EpcWKCallMessage = ?EpcWKCallMessage@@ZCHII@Z @2 собрал dll'ку, упаковал и прицепил на форум. в оригинальной dll среди экспортируемых ф-й есть ___ExportedStub ... вопрос что это за ф-я такая Код из MSVC\SOURCE\STARTUP\WIN\WINDGRPX.C похож: Код (Text): /*** *windgrpx.c - defines the exported stub function for _GetDGROUP() to check. * * Copyright (c) 1989-1992, Microsoft Corporation. All rights reserved. * *Purpose: * Defines an exported function. _GetDGROUP() will check the prolog of this * function to see if we are running in a dll or an exe. * *******************************************************************************/ int _far _export _cdecl __ExportedStub( void ); int _far _export _cdecl __ExportedStub() { return( 0 ); } ps какую версию ida используешь?
ида 5.1 а откуда появляется это имя - ?EpcWKCallMessage@@ZCHII@Z? и почему в итоге получается 2 одинаковых функции в экспорте ? в принципе это теоретические вопросы... dll удалось сделать и кроде как все работает... но знать на будущее не помешеат.. и все же - есть ли какой отладчик нормальный под win16 ??
JShade откуда появляется это имя - ?EpcWKCallMessage@@ZCHII@Z? Такое имя создает Си-плюс-плюс компилятор. почему в итоге получается 2 одинаковых функции в экспорте ? В экспорте по два имени/алиаса на одну и туже функцию. Получилось так, потому что я указал "нормальные" имена в def-файле.
JShade хоть какойнить CodeView из комплекта совсем плох? TurboDebuger от Borland C++ v3.1? Про отладчики точно не помню, но Borland C++ v4.x и 5.x генерируют 16-тибитные приложения, именно bcpp, а не builder.