[原创]masm32开发包与VC6.0之间存在的Bug的体现及解决办法
发表于:
2018-2-8 23:29
6096
[原创]masm32开发包与VC6.0之间存在的Bug的体现及解决办法
概览:本文做了个Demo测试小程序来体现masm32开发包的库与VC6.0存在的一些不兼容的问题,如下即为所描述的问题及列举的对应的解决办法:
1、在RadASM环境下连接VC6.0生成的.obj时,找不到_main符号的问题及解决办法。
2、VC6.0对GetEnvironmentStrings这个函数的ASCII版本和UNICODE版本的宏替换与masm32的不一致的问题及解决办法。
一、Bug的触发:
创建VC6.0工程,声明和定义ShowHello()函数,然后编译生成.obj目标文件:
创建RadASM控制台工程。由于VC6.0编译好的代码都会被生成在.obj里面,所以就能在RadASM工程直接调用.obj里面的函数。将编译好的StdAfx.obj扔到RadASM工程文件夹下,并添加到RadASM工程里面。然后就可以调用了,以下就是调用ShowHell()这个函数。
编译可通过,但是连接的时候报了两个错误:
二、错误一:
提示缺少_main符号,为什么会缺少_main符号?是因为在VC6.0生成的.obj会把LIBCD.LIB一块连接进去(LIBCD.LIB在VC6.0安装目录的VC98下的LIB文件夹里面)。在 LIBCD.LIB中有一个crt0.obj,这个crt0.obj就是VC6的入口代码,我们用IDA打开LIBCD.LIB查看:
双击这个crt0.obj进去后发现,就会看到的即是VC6.0的入口代码:
入口代码做完一些初始化工作后,就调用了main函数
由于连接了LIBCD.LIB,而LIBCD.LIB又有入口函数被连接,而拷贝到RadASM工程下的StdAfx.obj并没有入口函数的定义,于是就报错第一个错误:缺少_main符号。
解决办法一:将RadASM的程序入口改为main:
再连接,第一个错误解决了!
解决办法二:直接定一个的空函数,使RadASM连接时能检测到_main符号:
这个方法同样可以解决第一个错误!
三、错误二:
缺少一个函数定义:__imp__GetEnvironmentStrings
首先,在VC6.0下我们看看GetEnvironmentStrings这个函数在何时被调用。通过栈回溯定位到VC的mainCRTStartup,然后往下就会看到:是mainCRTStartup调用了这个函数:
关键点:在RadASM连接时会报错,是由于识别不出.obj下的这个函数,即masm32对这个声明的与VC6.0声明的不一致。
问题的体现:
1、我们先看masm32对ASCII与UNICODE版本的实现。打开masm32的include目录,找到kernel32.inc
打开并定位到GetEnvironmentStrings这个函数:
masm32调用该函数时如果是ASCII版,则用GetEnvironmentStringsA宏替换,如果是UNICODE版,则用GetEnvironmentStringsW宏替换。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
上传的附件: