2011年2月16日星期三

轉載:bambam壳的几个bug

http://bbs.pediy.com/showthread.php?t=118304
两个壳的源代码参考的看了下,一个是《加密与解密》提供的源代码,还有就是bambam壳。不过bambam004壳有几个bug。bambam004壳是bedrock在exetools论坛提交的,可惜没什么讨论的帖子谈到其中的bug。

http://www.pediy.com/bbshtml/bbs8/pediy8-557.htm谈到以下几个bug:
1.在对 stub 进行重定位处理时,有行代码错行了。

2.在 转换stub 中thunk 值时,搜索地址的方法有错漏。

3. 没有对pe文件中的多余数据(pe section 中未标明的)进行保留处理。

4. 没有对 stub 的VOffset 和 ROffset 进行对齐处理

5. 对 stub 的输入表起始地址处理有错

我在vs2008中编译,大致修改了以下几处bug,用dbgView测试了下,加壳之后能正常跑。
一、输入表通配符查找有错漏
PatternSearch修改如下
int CCompressDlg::PatternSearch(unsigned char *SearchString, int StringLen, unsigned char *SearchBuff, int BuffSize)
{
int i,j;

if (BuffSize < StringLen) return -64; for(i=0;i<(BuffSize-StringLen);i++) { for(j=0;jSizeOfBlock];
放在for循环外面

三、IMAGE_SIZEOF_BASE_RELOCATION没有定义
这样定义IMAGE_SIZEOF_BASE_RELOCATION
DWORD IMAGE_SIZEOF_BASE_RELOCATION = 2*sizeof(DWORD);

四、如果PE文件第一个section的尺寸为0的话,加密之后运行提示错误
bug位置:加壳程序
for(i = 0; i < wNumSections; i++) { // Reset resource flag bResource = false; pSecHdr = (PIMAGE_SECTION_HEADER)dwSecStart; pBackupSecHdr = (PIMAGE_SECTION_HEADER)dwBackupSecStart; if(strcmp((char*)pBackupSecHdr->Name, ".rsrc") == 0)
{
// we are at resource section
bResource = true;
}

// skip sections with raw size = 0
if(pBackupSecHdr->SizeOfRawData == 0)
{
// move to next section header
dwSecStart += sizeof(IMAGE_SECTION_HEADER);
pBackupSecHdr += sizeof(IMAGE_SECTION_HEADER); //!sld! 应该改为dwBackupSecStart +=sizeof(IMAGE_SECTION_HEADER);
bSkipedZeroSizeSection = true;
continue;
}
......
// move to next section header
dwSecStart += sizeof(IMAGE_SECTION_HEADER);
dwBackupSecStart += sizeof(IMAGE_SECTION_HEADER);
}

http://www.pediy.com/bbshtml/bbs8/pediy8-557.htm一文所提到的第四跟第五我检查了下不存在错误。第三个bug:没有对pe文件中的多余数据(pe section 中未标明的)进行保留处理。没注意。至少我测试dbgView能跑。

另外有几个值得注意的地方
stub项目按照源码设置,编译的话会报memcpy,memset之类的函数未定义错误,这时候不能静态链接msvcrt.lib,否则运行会报R6034错误。两条路:要么去掉/nodefaultlib配置项,要么自定义运行库,可以参考《Reduce EXE and DLL Size with LIBCTINY.LIB》

由于stub壳中不含有重定向,所以无法给DLL PE文件加壳,当然折中方案不是没有,可以在目标dll文件强制指定Image base,再加壳。运行的时候祈祷指定的Image base没有被占用。当然最终极的解决方案还是像《加密与解密》一书的壳那样转储重定位表,然后壳刚开始运行重定位。

发现看雪论坛精华壳的源代码都是汇编写的,只有这个bambam是用C/C++写的。小弟读汇编都有些吃力,更别提写汇编代码了(有学好汇编的想法)。这样的话改写壳只有在bambam基础上进行了,目前觉得bambam壳代码写的不错,还是挺有学习价值的。

ps.《加密与解密》一书加壳一章提到的壳中提供函数供源程序调用以提高壳的强度,有没有现成的例子或是更详细的参考资料?小弟冥思苦想不得其门而入。

如果使用bambam004壳支持DLL遇到困难,可以参考http://bbs.pediy.com/showthread.php?t=119570&highlight=

沒有留言:

發佈留言