首页
社区
课程
招聘
[下载]自己弄的外壳PE-panzer,给大家玩玩
发表于: 2011-10-31 21:53 26846

[下载]自己弄的外壳PE-panzer,给大家玩玩

2011-10-31 21:53
26846

使用说明:
   支持EXE与DLL。
   比一般的压缩壳多一些保护,有API HOOK和简单的SDK。
   SDK的使用很简单,首先在VC工程中包含SDK.h头文件,再在需保护的代码前后加上 SDKOnlyOnceStart; 和 SDKOnlyOnceClear;具体参见附带的示例代码 Win32TestSDK(VC6.0)
   SDK 暂时只有执行后擦除。如果使用其他的编程语言,注意使代码块可写,否则会崩溃。
   业余时间弄的,刚刚完成。如果你发现问题,欢迎联系我。一起学习进步。easternjunker@hotmail.com


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 6
支持
分享
最新回复 (43)
雪    币: 3703
活跃值: (4267)
能力值: (RANK:215 )
在线值:
发帖
回帖
粉丝
2
不错的东西,还没使用,先支持下分享精神。
2011-10-31 22:02
0
雪    币: 5339
活跃值: (3739)
能力值: ( LV13,RANK:283 )
在线值:
发帖
回帖
粉丝
3
哈哈,等我写完了也拿出来晒晒,无多态变形,虚拟机不好意思拿出来啊。
2011-10-31 22:28
0
雪    币: 90
活跃值: (82)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
对壳的初步设想:
●使用SkinMagicToolkit美化界面、加入开启音效。
●生成器界面加入随机化选项。○密匙选项。
●虚拟机检测选项
●混淆文件头选项。
●自己在外壳中实现GetProcAdress。
●使用SDK、增加SMC的相关SDK。执行完擦除。
●增加系统破坏性代码。反调试中RING3下的随机删除文件+蓝屏。
●(利用空闲寄存器以及频繁的堆栈操作来混淆关键代码的阅读)
●外壳输入表钩子
====================================================================================
对原壳代码的阅读重点:
●注意外壳启动代码对DLL的处理,包括最重要的重定位节的处理。
●还原输入表、重定位表、及资源的代码。
    pResData->OffsetToData = m_nImageSize+mShell0_nSize+MoveResSize;
  输入表和重定位表的重点是新结构元素间隔的划分。
  资源部分:
  将不可压缩资源移入 pMapOfPackRes,pMapOfPackRes = new char[nNoPackResSize];。看样子pMapOfPackRes会被复制到m_nImageSize+mShell0_nSize处。
  pResData->OffsetToData = m_nImageSize+mShell0_nSize+MoveResSize; //将OffsetToData字段指向外壳引导的新资源处

▲压缩信息块的格式:
AddPackInfo(psecHeader->VirtualAddress,psecHeader->Misc.VirtualSize,psecHeader->SizeOfRawData
内存顺序: psecHeader->Misc.VirtualSize , psecHeader->VirtualAddress , psecHeader->SizeOfRawData ,原始压缩块的大小
入口点 401580
====================================================================================
具体编码步骤:
√确定使用的反调试技术                        
√确定使用的虚拟机检测:检测IDT地址,通过SIDT指令
√实现PE头混淆
√在外壳中实现自定义的GetProcAdress
√实现文件自校验:MapFileAndCheckSum()
√在原来的压缩加密基础上,套一层使用随机密匙的异或加密
√加入API HOOK
√加入简单的SDK
√加入花指令、垃圾混淆代码
√界面的优化
====================================================================================
●关于SMC保护的初步设想:
  ◎所有的SMC保护皆使用代码融入密匙技术。考虑是否使用自擦除。
  ◎对 外壳引导段使用的变量空间、由加壳程序修正的变量、变形输入表和原外壳第一层代码进行单层的简单SMC封装。
    为了便于SMC加密,将外壳自带的输入表数据结构移至外壳段头部。使后续需要SMC加密的数据及代码互相形成没有间隔的连续数据块。该改动影响到的代码:
           mShell_nSize =(DWORD) (&ShellEnd0) - (DWORD)(&ShellStart0) + m_nPackSize + nNoPackResSize;//计算整个外壳段需要尺寸
           mShell0_nSize    = (DWORD) (&ShellEnd0) - (DWORD)(&ShellStart0); //外壳第一段的大小
          
           nBasePoint     = plastsecHeader->VirtualAddress + plastsecHeader->Misc.VirtualSize;//★计算外壳区块的RVA起点
           m_pntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS].VirtualAddress =nBasePoint + (DWORD)(&TlsTable)-(DWORD)(&ShellStart0);
           //TLS数据的修正
           nImportTableOffset=(DWORD)(&ImportTableBegin)-(DWORD)(&ShellStart0);//★ImportTableBegin在外壳引导段偏移值
          
           nITRVA = nBasePoint +nImportTableOffset;//★用于校正外壳输入表的参数
           ...
           最简修改法,共修改3处:
           1.将外壳数据结构放置到外壳区块首部.
           2.修改外壳入口点: m_pntHeaders->OptionalHeader.AddressOfEntryPoint = nBasePoint+ m_pntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size ;
           3.外壳代码的自定位: sub        ebp,(RelocBase-ShellStart0)  
  ◎对 自定义的GetProcAdress()进行单层SMC加密,函数体内嵌入反调试、反虚拟机,以及混淆代码和花指令。
  ◎改进原有的lz77压缩函数,在原基础上套一层SMC加密解密。
    BOOL AddPackInfo(UINT OriginalOffset,UINT OriginalSize,UINT nPackSize, HWND hDlg)
    内存顺序:OriginalSize(原始大小)、OriginalOffset、nPackSize
  ◎用于HOOK API的自定义转发函数位于外壳第一段。双层的SMC保护,加入SMC执行完恢复技术。内嵌反调试。
  ◎原书附带的3层SMC保护代码中,第一层SMC所使用的当前解密代码融入密匙的思想和密匙逐字节变换,可完全照搬。但所使用的反调试方法测试已失效。
    鉴于第一层代码使用了SEH,较为复杂。将原书代码中SMC的第一层移至第二层。
  ◎SEH单步异常保护
  ◎代码融入密匙
●关于API HOOK的零散片段:
  外壳第二段中, API HOOK用到的变量:API_HOOK_Transfer     DD 0
                                    FunCount             DD 0   函数计数
                                                                        使用:mov        edx,dword ptr [ebp+(FunCount -ShellStart)]
                                                                       
        增添代码:   mov           API_HOOK_Transfer,dword ptr [ebp+(S_IsProtImpTable-ShellStart)]
        ★√注意最后要改进代码,以确定外壳中API转发内存的大小。
        ★注意最后修正随机密匙数值不够大、高位全为0的问题。使用真正的随机数。
        ★√最后注意保护变量:外壳第二段压缩后的大小;以及API-HOOK中原始API的地址
        ★√修改区块名,外壳区块可以改为.code
        ★√SDK确保区块可写
●SMC编码步骤
  ◎需要熟悉的全局变量及函数
    DWORD RandKEY = 23457;                 //全局变量:随机密匙
    DWORD RandKEY2 = 44221;

    /*压缩后的地址           m_pPackData  *****/
    /*压缩后数据大小  m_nPackSize; *****/
  ◎修改原S_PackSection结构,在原结构尾部增加一项压缩后的原始大小
●问题追溯
  ◎调用解密函数的指令地址:40517e; 解密函数地址:40518e;进入解密函数时的堆栈:13ff98   函数参数:4056cb,334
    密匙1:140023 、错误发现:函数体内的参数操作改变了原有EBP的值,使其不再指向当前基址。
        解决方法:不使用masm32的伪指令来建立函数体。
  ◎堆栈情况参见图片: 测试A.bmp. 进入时堆栈顶部在13ff90。
    密匙1:237d、密匙2:237c
        错误发现:取参数时用到的esp寄存器,其值不指向栈顶,而是被先前的pushad指令改写了。
  ◎堆栈情况参见图片: 测试B.bmp. 进入时堆栈顶部在13ff94。解密地址为:4056be.解密前数据:
  ◎解密函数参数:
                       0013FF98   004056BD  |Arg1 = 004056BD
                   0013FF9C   00000334  \Arg2 = 00000334
                   0013FFA0   003D0000
          eax == 3d0000
          密匙1:2161
          密匙2:21c6
  ◎证明了自定义的汇编异或加密函数是可逆的。
  ◎4056bd 334           VC测试程序断点:401030
        RandKEY = GetRandNum();
        RandKEY = 8545;
                Sleep(GetRandNum(99));
                RandKEY2 = GetRandNum();
                RandKEY2 = 8646;
        问题:创建密匙晚于外壳第二段加密及区块加密。
       
  ◎代码融入密匙,计算位置:CODE_KEY  ShellEnd0
  ◎首段外壳代码的SMC加密位置:FirstXOR,ShellEnd0
    VC加密函数:SimpleXor(char* mem,int len,int key)

  ◎处理DLL重入问题:cmp edx,0                 
                         jz NEXTSTEP
  ◎SDK问题:7f930000
  真正位置 :7f994091
  正确16进制结果:64091
2011-10-31 22:34
0
雪    币: 22
活跃值: (458)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
Mark
2011-10-31 22:49
0
雪    币: 371
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hyp
6
支持一记
2011-10-31 23:38
0
雪    币: 172
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
谢谢分享。。。
2011-11-1 01:48
0
雪    币: 301
活跃值: (300)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
8
谢谢分享!收藏一份耍耍
2011-11-1 08:28
0
雪    币: 377
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
GVU
9
能做壳的人都是对PE非常了解的人, 膜拜楼主。
2011-11-1 08:34
0
雪    币: 258
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
支持下lz,收到工具箱了。
2011-11-1 08:37
0
雪    币: 279
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
遭了,W哥宇宙第一假壳的地位受到了严重的威胁,不知W哥会肿么办
2011-11-1 08:47
0
雪    币: 94
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
这个果断支持一下。。。。。
2011-11-1 09:43
0
雪    币: 90
活跃值: (82)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
API HOOK:实现有点小特别,只HOOK kerner32的函数。转发代码位于新建内存块。
密匙随机化:如果选中,每次加壳或者SDK后的代码都不一样。
虚拟机检测:在VMware下测试过,使用时间差检测
PE头混淆:修改EXE和DLL文件头的导入导出函数表结构,不是修改入口代码。
校验和:在PE头中填入自身的校验和。并未进行自校验

这个壳自实现了 GetProcAdress()。虽然导入表里导入API:GetProcAdress(),但未使用它,你可以改成任何其他函数。
再比较特别的地方就是SMC
2011-11-1 12:50
0
雪    币: 90
活跃值: (82)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
如果勾中虚拟机检测,程序在虚拟机环境下就会崩溃。

外壳处理API HOOK的部分代码:

push ebx
                push eax
                .if dword ptr [ebp+(IsApiHook-ShellStart)] == 731   && dword ptr [ebp+(IsAimDLL-ShellStart)] != 0    ;如果 API HOOK
                    mov eax,dword ptr [ebp+(API_HOOK_Transfer-ShellStart)]
                    mov bl,96                                           ;pushad instruction's code
            ;mov bl,144                                         ;nop instruction's code
                        mov byte ptr [eax],bl

            mov bl,232                                          ;call instruction's code
            mov byte ptr [eax+1],bl
                lea ebx,[ebp + (offset API_HOOK - ShellStart) -5]               
                sub ebx,eax
                        dec ebx                                             ;call's offset
            mov dword ptr [eax+2],ebx
            mov ebx,dword ptr [edi]

                        push ebx
                        xor ebx,dword ptr [ebp+(shell2_dwkey-ShellStart)]   ;¶ÔÕæÕýº¯ÊýµØÖ·½øÐÐÒì»ò¼ÓÃÜ
                        mov dword ptr [eax+6],ebx                           ;±£´æÒì»òºóµÄº¯ÊýµÄµØÖ·
            pop ebx

                    mov        dword ptr [edi],eax                             ;Modify FirstThunk
            add eax, 10
            mov dword ptr [ebp+(API_HOOK_Transfer-ShellStart)],eax

                        mov  eax,dword ptr [ebp+(FunCount-ShellStart)]      ;FunCount
                        .if eax == 0
                            push eax
                mov  eax,dword ptr [ebp+(API_HOOK_Transfer-ShellStart)]
                                sub eax,10
                                mov  dword ptr [ebp+(API_HOOK_Transfer_raw-ShellStart)],eax
                                pop  eax
                        .endif
                        inc eax
                        mov dword ptr [ebp+(FunCount-ShellStart)],eax
        .endif
            pop eax
        pop ebx

                add        edi,4h        ;ediÖ¸ÏòÏÂÒ»¸öFristThunk
                pop        ecx
                ;loop        GetNextFuncAddr2
                dec ecx
        cmp ecx,0
            jne GetNextFuncAddr2
            jmp         GetNextDllFuncAddr2
            AllDllFuncAddrGeted2:
        .endif
2011-11-1 12:55
0
雪    币: 414
活跃值: (10)
能力值: ( LV9,RANK:460 )
在线值:
发帖
回帖
粉丝
15
玩了下,不错,支持继续改进,兼容性有待提高,加了几个程序
只成功一个
hook api

003D0332     8907              MOV DWORD PTR DS:[EDI],EAX
003D0334     83C0 0A           ADD EAX,0A
003D0337     8985 D4050000     MOV DWORD PTR SS:[EBP+5D4],EAX
003D033D     8B85 E0050000     MOV EAX,DWORD PTR SS:[EBP+5E0]
003D0343     0BC0              OR EAX,EAX
003D0345     75 11             JNZ SHORT 003D0358
003D0347     50                PUSH EAX
003D0348     8B85 D4050000     MOV EAX,DWORD PTR SS:[EBP+5D4]
003D034E     83E8 0A           SUB EAX,0A
003D0351     8985 D8050000     MOV DWORD PTR SS:[EBP+5D8],EAX
003D0357     58                POP EAX
003D0358     40                INC EAX
003D0359     8985 E0050000     MOV DWORD PTR SS:[EBP+5E0],EAX
003D035F     58                POP EAX
003D0360     5B                POP EBX
2011-11-9 21:51
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
16
膜拜一下高手!
2011-11-10 10:21
0
雪    币: 90
活跃值: (82)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
17
谁有甲壳虫论坛的邀请码,发给我个?谢谢先。不会用淘宝。
2011-11-11 10:10
0
雪    币: 603
活跃值: (40)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
18
楼主把源也扔出来吧。。。。。。。。。。
2011-11-11 10:36
0
雪    币: 252
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pxf
19
我有甲壳虫的邀请码
2011-11-12 11:06
0
雪    币: 252
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pxf
20
dll加壳后,文件损坏
2011-11-12 13:26
0
雪    币: 90
活跃值: (82)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
21
非常感谢发我邀请码的朋友。

DLL加壳后会损坏? 发给我看下么。 是不是虚拟机或者沙盒的关系?
2011-11-14 09:37
0
雪    币: 394
活跃值: (131)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
22
增加系统破坏性代码。反调试中RING3下的随机删除文件+蓝屏。

这个也太狠了吧.

连压缩个系统里的记事本和计算器都出错,兼容性太差了.
2011-11-14 10:29
0
雪    币: 90
活跃值: (82)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
23
这个版本没有加破坏性代码。

我刚刚测了下系统的记事本,一加壳果然崩溃了。 惭愧。

测自己用VC写的程序和DLL,都是OK的。
有空我再完善。 暂时没空。
2011-11-15 03:00
0
雪    币: 90
活跃值: (82)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
24
可以暂时只用那个SDK。
2011-11-15 03:04
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
支持你啊  真牛
2011-11-19 13:05
0
游客
登录 | 注册 方可回帖
返回
//