-
-
[讨论]掘北壳-Dbg和Release差距很大
-
发表于: 2009-7-26 16:49 1980
-
在一网站上下载掘北壳源码来研究,有一个地方不是很明白,用Debug模式编译后的代码在运行的时候会崩溃,但是Release下却很正常。
出错的代码位于:void MakeShell()函数中。
该函数用于封装壳代码,在该函数中有很多memcpy调用,其中一处在Debug模式下运行崩溃,访问无效内存。
出错的代码为:
memcpy(MapOfShell+dwSize, &loader, (DWORD)loader_end - (DWORD)loader);
这里我有很多不明白的地方,这个调用从表面来看,是在复制壳的解压代码到目标程序中。loader函数为解码函数。
loader_end 也是一个函数,我感觉作者的意图是通过loader_end与loader做差,从而得到loader函数的长度,两个函数在同一文件中,并且loader在前,loader_end在后,如果编译的时候两个函数相连,则相减后,理应为loader的长度,最多就是多几个int3。 但是在Debug模式下,运算的结果是-75.应该是算错了。-75带入memcpy,从而导致程序崩溃。我的分析就止于此,那么如果我要在Debug模式下计算loader函数的大小,该怎么做?
出错的代码位于:void MakeShell()函数中。
该函数用于封装壳代码,在该函数中有很多memcpy调用,其中一处在Debug模式下运行崩溃,访问无效内存。
出错的代码为:
memcpy(MapOfShell+dwSize, &loader, (DWORD)loader_end - (DWORD)loader);
这里我有很多不明白的地方,这个调用从表面来看,是在复制壳的解压代码到目标程序中。loader函数为解码函数。
loader_end 也是一个函数,我感觉作者的意图是通过loader_end与loader做差,从而得到loader函数的长度,两个函数在同一文件中,并且loader在前,loader_end在后,如果编译的时候两个函数相连,则相减后,理应为loader的长度,最多就是多几个int3。 但是在Debug模式下,运算的结果是-75.应该是算错了。-75带入memcpy,从而导致程序崩溃。我的分析就止于此,那么如果我要在Debug模式下计算loader函数的大小,该怎么做?
赞赏
他的文章
- [原创]1018-第一题 3752
- [分享]某反汇编引擎bug修复 3098
- [求助]求助ntoskrnel.exe 重定位问题 7487
- 成长的道路究竟有多长? 6591
看原图
赞赏
雪币:
留言: