反向VB6的c2.exe的start函数

反向c2.exe的start函数

C2.exe是vb6编译器的一部分,其使用VC6编写(通过DIE查询),对于选择编译为完全的P-Code时,直接调用C2.exe编译后使用link.exe链接。然后对于编译成native code的选项时,会先经过vb6.exe处理,生成中间语言。

这是笔者第一次逆向软件,没有经验,只能时刻查询教材,其主要是《加密与解密第3版》、《加密与解密第4版》、《反编译技术与软件逆向分析第1版》、《IDA Pro权威指南(第2版)》、《C++反汇编与逆向分析技术揭秘 第一版 钱林松 》和MSDN。 为了减少工作量而几乎不配图,故本文可能比较难读懂。阅读本文需要汇编语言、C\C++的基础知,尽管笔者自己就是初学者。等笔者熟练逆向之后会出一系列视频,精细地讲解逆向这个软件的一切我所能用言语表达的内容。

用IDA加载本文件后按F5反编译,得到的结果和钱林松书上所述的大不一样,所以我以为启动函数是另外写的。后来觉得,把几个关键的函数名去运行时源代码1的内容里搜搜看。结果真的有,而且函数运行的顺序也是一样的,这就轻松了,虽然不需要逆向Start函数,直接看main函数即可,但是我依然很好奇start做了什么。不过,我依然不知道是什么时候采用crtexe.c的内容作为启动函数。

完成的代码:

void __noreturn start()
{
  char **argv; // [esp+10h] [ebp-2Ch] BYREF
  int startinfo; // [esp+14h] [ebp-28h] BYREF typedef struct
                 //                           {
                 //                                   int newmode;
                 //                           } _startupinfo;
  int mainret; // [esp+18h] [ebp-24h]
  char **envp; // [esp+1Ch] [ebp-20h] BYREF
  int argc; // [esp+20h] [ebp-1Ch] BYREF
  CPPEH_RECORD ms_exc; // [esp+24h] [ebp-18h]

  ms_exc.registration.TryLevel = 0;
  _set_app_type(_crt_console_app);
  dword_107ABD78 = -1;
  dword_107ABD7C = -1;
  *_p__fmode() = _fmode;
  *_p__commode() = _commode;
  dword_107ABD80 = adjust_fdiv;
  nullsub_14();
  if ( !__defaultmatherr )
    _setusermatherr((_UserMathErrorFunctionPointer)UserMathErrorFunction);
  _setdefaultprecision();
  initterm(&First, &Last);
  startinfo = newmode;
  _getmainargs(&argc, &argv, &envp, dowildcard, &startinfo);
  initterm(&dword_107A3000, &dword_107A3004);
  *(_DWORD *)_p___initenv() = envp;
  mainret = main(argc, (const char **)argv, (const char **)envp);
  exit(mainret);
}

  1. VC6提供了C runtimelibrary (CRT) 的源代码,位置于“安装包\VC98\CRT\SRC”。

你可能感兴趣的:(逆向工程vb6编译原理编译器)