反向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);}
- VC6提供了C runtimelibrary (CRT) 的源代码,地位于“安装包\VC98\CRT\SRC”。 ↩