Borland C++ 运行时启动

逆向工程 视窗 C++
2021-07-07 13:22:50

我正在尝试对 1995 年用 Borland C++ 编译的古老游戏进行逆向工程。到目前为止,我发现 start @0x401000 传递给 cw3220.dll(显然是 Borland 的 C++ 运行时 dll)中的 __startup 如下:

  1. 指向全局静态构造函数列表开头的指针 ( { char flag0; char flag1; void* fun})

  2. 指向所述列表末尾的指针

  3. 指向析构函数列表开头的指针(如上)
  4. 指向 dtor 列表末尾的指针
  5. int 标志 - GUI 应用程序与否(应 __startup 调用main(argc,argv,env)WinMain(hInstance,hPrevInstance,lpCmdLine,nShowCmd)
  6. 未知 int flag1
  7. 指向入口函数的指针
  8. 指向 IDA 自动命名的函数的指针 matherr
  9. 指向函数的指针 matherrl
  10. 未知 int flag2
  11. 未知 int flag3

是否有任何可用的文档可以说明信息结构中 flag1/2/3 的含义、ctor 列表条目中的 flag0/1 以及 Borland C++ 如何处理异常 - 使用类的函数总是调用__InitExceptBlock,但我从未看到在函数之后检查异常调用,try/catch 是如何处理的?

1个回答

cw3220.dll表示您正在查看 BC++ 5.0。AFAICS 关于启动代码的唯一官方文档是BC5/source/RTL/source/startup/Win32/c0nt.asm,加上_startup.hstartup.c(也在 下某处source/RTL)。该结构定义在_startup.h

typedef struct module_data
{
    INIT *init_start;           /* start of a module's _INIT_ segment */
    INIT *init_end;             /* end of a module's _INIT_ segment */
    INIT *exit_start;           /* start of a module's _EXIT_ segment */
    INIT *exit_end;             /* end of a module's _EXIT_ segment */
    int  flags;                 /* flags (see below) */
    int  hmod;                  /* module handle */
    int  (*main)();             /* main/WinMain/_dllmain function */
    int  (*matherr)(void *);    /* (EXE only) _matherr function */
    int  (*matherrl)(void *);   /* (EXE only) _matherrl function */
    long stackbase;             /* (EXE only) base of stack */
    int  *fmode;                /* (EXE only) address of _fmode variable */
} MODULE_DATA;

/* MODULE_DATA flags.
 */
#define MF_WINDOWS  1           /* this is a Windows application */

如果您从 PAK 安装,那么即使您选择了所有内容,也可能不会安装 RTL 源,但 RTL 源存在于安装 CD 的 BC5 目录中(至少在我的副本中)。这至少记录了调用方。

Borland 开放架构手册中记录了许多 BC++ 4 内部组件,这些组件必须以名义成本(一张软盘)单独订购。我无法在 ATM 机上找到这些东西,但我看到网上到处都是复制品,名字是bc4boa.zip……