首页
社区
课程
招聘
bambam壳的几个bug
发表于: 2010-8-10 17:44 11803

bambam壳的几个bug

2010-8-10 17:44
11803

两个壳的源代码参考的看了下,一个是《加密与解密》提供的源代码,还有就是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=


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (10)
雪    币: 47147
活跃值: (20445)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
软件加密技术内幕中的“第7章  如何让壳与程序融为一体”,可以参考一下。
这书电子版网上搜索一下。
2010-8-10 17:46
0
雪    币: 15
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
楼主基础挺好滴
2010-8-11 00:36
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢分享!!!!!!!!
2010-8-11 00:38
0
雪    币: 48
活跃值: (53)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
下载前回帖支持
2010-8-11 18:03
0
雪    币: 62
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
支持一个玩玩
2010-8-16 16:53
0
雪    币: 451
活跃值: (78)
能力值: ( LV12,RANK:470 )
在线值:
发帖
回帖
粉丝
7
支持1下研究壳的牛人
2010-8-16 19:16
0
雪    币: 21
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
谢谢~ 做起来没想象中那么复杂。

归纳了下以下步骤:
一、原程序导出函数
二、加壳程序获得程序导出函数地址并清空导出表
这儿需要一个加壳程序与壳的沟通机制
三、壳调用原程序导出函数,并传入壳中函数地址
2010-8-23 18:24
0
雪    币: 21
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
又发现了一个bug

位置:设置重定位的Virtual Address
//!sld! stub壳重定位校正
//pIBRCurrent->VirtualAddress += dwStubRVA;
pIBRCurrent->VirtualAddress = dwStubRVA;
2010-11-30 03:19
0
雪    币: 228
活跃值: (119)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
晚上3点多还在找bug ,佩服+学习
2010-11-30 11:51
0
雪    币: 21
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
没办法,有bug睡不着觉,困的时候零零星星的睡会,现在还在搞。

发现bambam004壳没有处理加壳对象的重定位表。接下来的工作就如《加密与解密》一书中所说的
模拟PE加壳器完成相应的功能,如果有重定位表,外壳对代码进行“重定位”操作。
2010-11-30 17:15
0
游客
登录 | 注册 方可回帖
返回
//