两个壳的源代码参考的看了下,一个是《加密与解密》提供的源代码,还有就是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;j<StringLen;j++)
        {
            if (
                 (SearchString[j] != _XX_) && 
                 (SearchString[j] != SearchBuff[i+j]) &&
         (j==2 || SearchString[j]+1 != SearchBuff[i+j]) 
               )
            break;      
        }
        if (j==StringLen) 
    {
      return i;
    }
    }

    return -100;
}

二、在对 stub 进行重定位处理时,有行代码错行了。
pIBRCurrent = (PIMAGE_BASE_RELOCATION)&((BYTE*)pIBRCurrent)[pIBRCurrent->SizeOfBlock];
放在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=