Win16 компилер(VC++ 1.5) и отладчик...? Need help!

Тема в разделе "WASM.SOFTWARE", создана пользователем JShade, 23 окт 2007.

  1. JShade

    JShade New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2007
    Сообщения:
    42
    Народ! помогите! =)

    Нужен 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)......?
     
  2. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    наверно потому, что stdcall - единственное соглашение о вызовах, поддерживаемое TC?
     
  3. JShade

    JShade New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2007
    Сообщения:
    42
    ну вроде как PASCAL можно испльзовать...

    попробую подругому объясниться...

    вот например то что мне выдает ида...

    ; Attributes: bp-based frame

    ; int __stdcall __far EpcWKCallMessage(UINT,HWND)
    public EpcWKCallMessage
    EpcWKCallMessage proc far

    каким должен быть код объявления ф-ии чтоб получилось то же самое ?
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    JShade
    Нужен Win16 С++ компилер (конкретно Visual C++ 1.5)
    Попробуй Microsoft Visual C V1.5 [CD version] (45'388'210 байт)

    каким должен быть код объявления ф-ии чтоб получилось то же самое ?
    Скорее всего надо делать def-файл и в секции экспорта писать нужное имя.
     
  5. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    JShade
    Зайдем с другой стороны - А что за программа-то? Может быть проблема уже решена;)
     
  6. JShade

    JShade New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2007
    Сообщения:
    42
    ээ..а можно подробнее ? а тоесли честно я не особо спец в С..по крайней мере с def файлами не работал...

    очень сомневаюсь...
    Электронный каталог запчастей Honda Japan...нужно выгрузить данные оттуда...
    то что есть в инете это выдранные из Tekdoc'a и немного не те днанные...
     
  7. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    JShade
    насколько помню:
    int EpcWKCallMessage(UINT, HWND) - HWND=WORD?
    модификатор __stdcall используется в TC по умолчанию (есть ещё PASCAL для совместимости с TASM и TP/BP);
    модификатор __far выставляется в настройках проекта.
     
  8. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    JShade
    а можно подробнее ?
    В архиве, ссылку на который я дал, есть примеры.
    + в файле-справке MSCOPTS.HLP есть раздел Module-Definition Statements.

    Конкретные вопросы есть?

    Пример
    Код (Text):
    1. // testdll.cpp
    2.  
    3. #include <windows.h>
    4.  
    5. #ifdef __cplusplus
    6.   extern "C" {
    7. #endif
    8.  
    9. int _acrtused = 0x9876;
    10.  
    11.  
    12. int __export CALLBACK LibMain(HANDLE hModule, WORD wDataSeg,
    13.                               WORD cbHeapSize, LPSTR lpszCmdLine)
    14. {
    15.   hModule;
    16.   wDataSeg;
    17.   cbHeapSize;
    18.   lpszCmdLine;
    19.  
    20.   return 1;
    21. }
    22.  
    23. int __export CALLBACK WEP(int bSystemExit)
    24. {
    25.   bSystemExit;
    26.   return 1;
    27. }
    28.  
    29. int __export CALLBACK EpcWKCallMessage(UINT p1, HWND p2)
    30. {
    31.   p1;
    32.   p2;
    33.  
    34.   return 1;
    35. }
    36.  
    37. #ifdef __cplusplus
    38.   }
    39. #endif
    40.  
    41. // eof testdll.cpp
    42.  
    43.  
    44. // testdll.def
    45.  
    46. LIBRARY   TESTSDLL
    47.  
    48. EXETYPE   WINDOWS
    49.  
    50. CODE      PRELOAD MOVEABLE DISCARDABLE
    51. DATA      PRELOAD SINGLE
    52.  
    53. HEAPSIZE  1024
    54.  
    55. EXPORTS
    56.     WEP         @1
    57.     EpcWKCallMessage    @2
    58.  
    59. // eof testdll.def
    60.  
    61.  
    62.  
    63. // makeit.bat
    64.  
    65. set path=C:\MSVC15\BIN;%path%
    66. set include=C:\MSVC15\INCLUDE
    67. set lib=C:\MSVC15\LIB
    68. cl.exe /nologo /Zl /YX /G2 /Zp1 /W3 /AM /Ox /D "NDEBUG" /FR /GD /Gs /c TESTDLL.CPP
    69. link /NOLOGO /NOD /ALIGN:16 /ONERROR:NOEXE TESTDLL.OBJ,TESTDLL.DLL,,,TESTDLL.DEF
    70. implib /nowep TESTDLL.LIB TESTDLL.DLL
    71.  
    72. // eof makeit.bat
     
  9. JShade

    JShade New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2007
    Сообщения:
    42
    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 файле ? вроде бы и без этого все так же экспортируется...
     
  10. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    JShade
    Как ida видит такую dll'ку?
     
  11. JShade

    JShade New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2007
    Сообщения:
    42
    хм...как...

    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...
     
  12. JShade

    JShade New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2007
    Сообщения:
    42
    и еще вопрос мож кто знает...это правда больше по поводу работы компилера vc 1.5...

    в оригинальной dll среди экспортируемых ф-й есть ___ExportedStub
    если в vc проекте в настройках не ставить галку Disable Stack Checking то и в моей dll будет эта функция но соответственно добавится доп. код во все мои ф-ии, чего нет в оригинале...

    вопрос что это за ф-я такая и нужна ли она, т.е может это какая то системная ф-я не используемая приложениями которые работают с этой dll ?

    нужно сделать аналог оригинальной dll но так как отлаживать прогу не получается и в довесок она на японском то она мне при какой нить ошибке выплюнет просто японские иероглифы которые для меня просто японские иероглифы безо всякого смысла =)
     
  13. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    JShade
    расскажи что ты сделал то? =)
    Предположил, что ida умеет доставать типы параметров, разбирая имена cpp-функций, поэтому перенес
    Код (Text):
    1. #ifdef __cplusplus
    2.   }
    3. #endif
    с конца исходника, на место после int _acrtused = 0x9876;, т.е. до подпрограмм, изменил def-файл на
    Код (Text):
    1. LIBRARY   TESTSDLL
    2.  
    3. EXETYPE   WINDOWS
    4.  
    5. CODE      PRELOAD MOVEABLE DISCARDABLE
    6. DATA      PRELOAD SINGLE
    7.  
    8. HEAPSIZE  1024
    9.  
    10. EXPORTS
    11.     WEP         = ?WEP@@ZCHH@Z @1
    12.     EpcWKCallMessage    = ?EpcWKCallMessage@@ZCHII@Z @2
    собрал dll'ку, упаковал и прицепил на форум.


    в оригинальной dll среди экспортируемых ф-й есть ___ExportedStub ... вопрос что это за ф-я такая
    Код из MSVC\SOURCE\STARTUP\WIN\WINDGRPX.C похож:
    Код (Text):
    1. /***
    2. *windgrpx.c - defines the exported stub function for _GetDGROUP() to check.
    3. *
    4. *   Copyright (c) 1989-1992, Microsoft Corporation.  All rights reserved.
    5. *
    6. *Purpose:
    7. *   Defines an exported function.  _GetDGROUP() will check the prolog of this
    8. *   function to see if we are running in a dll or an exe.
    9. *
    10. *******************************************************************************/
    11.  
    12.  
    13. int _far _export _cdecl __ExportedStub( void );
    14.  
    15. int _far _export _cdecl __ExportedStub()
    16. {
    17.     return( 0 );
    18. }
    ps какую версию ida используешь?
     
  14. JShade

    JShade New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2007
    Сообщения:
    42
    ида 5.1
    а откуда появляется это имя - ?EpcWKCallMessage@@ZCHII@Z?
    и почему в итоге получается 2 одинаковых функции в экспорте ?

    в принципе это теоретические вопросы... dll удалось сделать и кроде как все работает... но знать на будущее не помешеат..

    и все же - есть ли какой отладчик нормальный под win16 ??
     
  15. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    JShade
    откуда появляется это имя - ?EpcWKCallMessage@@ZCHII@Z?
    Такое имя создает Си-плюс-плюс компилятор.

    почему в итоге получается 2 одинаковых функции в экспорте ?
    В экспорте по два имени/алиаса на одну и туже функцию. Получилось так, потому что я указал "нормальные" имена в def-файле.
     
  16. JShade

    JShade New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2007
    Сообщения:
    42
    ясно. большое спасибо за помощь!

    осталось найти блин отладчик хоть какойнить...=(
     
  17. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    JShade
    хоть какойнить
    CodeView из комплекта совсем плох?
    TurboDebuger от Borland C++ v3.1?
    Про отладчики точно не помню, но Borland C++ v4.x и 5.x генерируют 16-тибитные приложения, именно bcpp, а не builder.