能力值:
(RANK:215 )
|
-
-
2 楼
不错的东西,还没使用,先支持下分享精神。
|
能力值:
( LV13,RANK:283 )
|
-
-
3 楼
哈哈,等我写完了也拿出来晒晒,无多态变形,虚拟机不好意思拿出来啊。
|
能力值:
( 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
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
Mark
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
支持一记
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
谢谢分享。。。
|
能力值:
( LV9,RANK:290 )
|
-
-
8 楼
谢谢分享!收藏一份耍耍
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
能做壳的人都是对PE非常了解的人, 膜拜楼主。
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
支持下lz,收到工具箱了。
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
遭了,W哥宇宙第一假壳的地位受到了严重的威胁,不知W哥会肿么办 。
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
这个果断支持一下。。。。。
|
能力值:
( LV3,RANK:20 )
|
-
-
13 楼
API HOOK:实现有点小特别,只HOOK kerner32的函数。转发代码位于新建内存块。
密匙随机化:如果选中,每次加壳或者SDK后的代码都不一样。
虚拟机检测:在VMware下测试过,使用时间差检测
PE头混淆:修改EXE和DLL文件头的导入导出函数表结构,不是修改入口代码。
校验和:在PE头中填入自身的校验和。并未进行自校验
这个壳自实现了 GetProcAdress()。虽然导入表里导入API:GetProcAdress(),但未使用它,你可以改成任何其他函数。
再比较特别的地方就是SMC
|
能力值:
( 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
|
能力值:
( 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
|
能力值:
( LV15,RANK:520 )
|
-
-
16 楼
膜拜一下高手!
|
能力值:
( LV3,RANK:20 )
|
-
-
17 楼
谁有甲壳虫论坛的邀请码,发给我个?谢谢先。不会用淘宝。
|
能力值:
( LV9,RANK:140 )
|
-
-
18 楼
楼主把源也扔出来吧。。。。。。。。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
我有甲壳虫的邀请码
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
dll加壳后,文件损坏
|
能力值:
( LV3,RANK:20 )
|
-
-
21 楼
非常感谢发我邀请码的朋友。 DLL加壳后会损坏? 发给我看下么。 是不是虚拟机或者沙盒的关系?
|
能力值:
( LV5,RANK:70 )
|
-
-
22 楼
增加系统破坏性代码。反调试中RING3下的随机删除文件+蓝屏。
这个也太狠了吧.
连压缩个系统里的记事本和计算器都出错,兼容性太差了.
|
能力值:
( LV3,RANK:20 )
|
-
-
23 楼
这个版本没有加破坏性代码。
我刚刚测了下系统的记事本,一加壳果然崩溃了。 惭愧。
测自己用VC写的程序和DLL,都是OK的。
有空我再完善。 暂时没空。
|
能力值:
( LV3,RANK:20 )
|
-
-
24 楼
可以暂时只用那个SDK。
|
能力值:
( LV2,RANK:10 )
|
-
-
25 楼
支持你啊 真牛
|
|
|