关于逆向工程:反向VB6的c2exe的start函数

43次阅读

共计 1418 个字符,预计需要花费 4 分钟才能阅读完成。

反向 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”。↩

正文完
 0