杀大CM脱壳
本帖最后由 月之精灵 于 2010-6-3 17:21 编辑【破文标题】杀大作业脱壳
【破文作者】yayazhi
【作者邮箱】[email protected]
【破解工具】OD
【破解平台】winxp
【软件名称】作业
【软件大小】233K
【原版下载】https://www.chinapyg.com/viewthread.php?tid=57001&extra=page%3D1
【保护方式】山寨版北掘
【软件简介】很强大的cm
【破解声明】偶是一只小菜鸟,偶的一点经验原和大家分享:)
------------------------------------------------------------------------
【破解过程】PEID查看--什么都没找到,我很好奇,OD载入跟...
00401000 >68 4B514A00 push 作业.004A514B ; 要跳向的地址
00401005 C3 retn
004A514B 68 5E510A00 push 0xA515E ; Offset,这句最后会被修改为OEP的RVA
004A5150 68 00004000 push 作业.00400000 ; 基址
004A5155 5A pop edx ; 弹到edx
004A5156 011424 add dword ptr ss:, edx ; 要执行的地址,(最后变成OEP的VA)
004A5159 C3 retn ; 跳到OEP
004A515A B3 15 mov bl, 0x15
004A515C 0000 add byte ptr ds:, al
004A515E 60 pushad ; 保护现场
004A515F E8 00000000 call 作业.004A5164 ; 获取004A5164这行的地址
004A5164 5E pop esi ; 弹到esi
004A5165 83EE 0A sub esi, 0xA ; esi-A
004A5168 8B06 mov eax, dword ptr ds: ; 获取地址004A515A中的数据
004A516A 03C2 add eax, edx ; 004015B3
004A516C 8B08 mov ecx, dword ptr ds: ; 004015B3数据
004A516E 894E F2 mov dword ptr ds:, ecx ; 修改入口代码
004A5171 83EE 10 sub esi, 0x10
004A5174 56 push esi ; 004A514A
004A5175 52 push edx ; 基址
004A5176 8BF0 mov esi, eax
004A5178 AD lods dword ptr ds: ; 4015B3出的数据放到eax中
004A5179 AD lods dword ptr ds: ; 取下一个dword,A5136
004A517A 03C2 add eax, edx ; 加上基址,获取LoadLibraryA的指针
004A517C 8BD8 mov ebx, eax ; 备份一个
004A517E 6A 04 push 0x4 ; 内存属性,可读可写
004A5180 BF 00100000 mov edi, 0x1000
004A5185 57 push edi ; 申请的内存以0 填充
004A5186 57 push edi ; 申请的大小
004A5187 6A 00 push 0x0 ; 0
004A5189 FF53 08 call dword ptr ds: ; VirtualAlloc申请内存
004A518C 5A pop edx ; 恢复edx的值400000
004A518D 59 pop ecx ; ecx4A514A
004A518E BD 00800000 mov ebp, 0x8000 ; 8000
004A5193 55 push ebp
004A5194 6A 00 push 0x0
004A5196 50 push eax ; 3A0000申请的内存地址
004A5197 51 push ecx ; 004A514A
004A5198 52 push edx ; 基址
004A5199 50 push eax ; 3A0000
004A519A 8906 mov dword ptr ds:, eax ; 目的地址,跟随下esi们可以看到一些数
据
004A519C AD lods dword ptr ds:
004A519D AD lods dword ptr ds: ; 待解密地址,eax
004A519E 03C2 add eax, edx
004A51A0 50 push eax ; 待解密数据4010B9
004A51A1 AD lods dword ptr ds: ; 偏移 100E
004A51A2 03C2 add eax, edx ; 0040100E
004A51A4 FFD0 call eax ; Aplib的解压函数,我发现解出来的是LZMA的压缩
算法
004A51A6 6A 04 push 0x4 ; 4
004A51A8 57 push edi ; Size1000
004A51A9 AD lods dword ptr ds: ; 把esi的数据填到eax去
004A51AA 50 push eax ; 0008BCAF又一个偏移地址
004A51AB 6A 00 push 0x0 ; 0
004A51AD FF53 08 call dword ptr ds: ; VirtualAlloc申请内存,4E000
004A51B0 5A pop edx ; 恢复edx的值400000
004A51B1 55 push ebp ; 8000
004A51B2 6A 00 push 0x0 ; 0
004A51B4 50 push eax ; 申请的地址4E0000
004A51B5 FF73 0C push dword ptr ds: ; VirtualFree的地址
004A51B8 52 push edx ; 400000
004A51B9 6A 04 push 0x4 ; 4
004A51BB 57 push edi ; Size1000
004A51BC 8BF8 mov edi, eax ; 目的地址
004A51BE 55 push ebp ; 8000
004A51BF 6A 00 push 0x0 ; 0
004A51C1 FF53 08 call dword ptr ds: ; VirtualAlloc申请内存,3B000
004A51C4 5A pop edx ; 400000
004A51C5 55 push ebp ; 8000
004A51C6 6A 00 push 0x0 ; 0
004A51C8 50 push eax ; 3B0000申请的内存地址
004A51C9 FF73 0C push dword ptr ds: ; 压VirtualFree的地址
004A51CC FF3424 push dword ptr ss: ; 还是VirtualFree的地址
004A51CF 8BC8 mov ecx, eax ; 把申请的内存地址传递给ecx
004A51D1 50 push eax ; 3B0000
004A51D2 54 push esp
004A51D3 FF76 FC push dword ptr ds: ; 偏移
004A51D6 57 push edi ; 4E0000申请的地址
004A51D7 AD lods dword ptr ds: ; 解压的参数吧?
004A51D8 50 push eax ; 368B5
004A51D9 AD lods dword ptr ds: ; 要解密数据的RVA000A5273
004A51DA 03C2 add eax, edx ; 要解密数据的VA,004A5273
004A51DC 50 push eax ; 004A5273
004A51DD 55 push ebp ; 8000
004A51DE 51 push ecx ; 3B0000
004A51DF 8BEA mov ebp, edx ; 把基址传给ebp
004A51E1 FF56 E8 call dword ptr ds: ; 前面解压出来的LZMA函数,我们的数据
解压到4E0000
004A51E4 58 pop eax ; 0008BCAF
004A51E5 012E add dword ptr ds:, ebp ; 区段 RVA 1000
004A51E7 8B3E mov edi, dword ptr ds: ; 放到edi
004A51E9 AD lods dword ptr ds: ; 401000区段的VA
004A51EA 50 push eax ; 401000
004A51EB AD lods dword ptr ds: ; 1,用来还原E8,E9,1要处理的区段个数为
1
004A51EC 50 push eax ; 1
004A51ED AD lods dword ptr ds:
004A51EE 50 push eax
004A51EF AD lods dword ptr ds:
004A51F0 50 push eax
004A51F1 33C0 xor eax, eax ; eax清零
004A51F3 B9 80010000 mov ecx, 0x180 ; Size,要填充数据的大小
004A51F8 F3:AB rep stos dword ptr es: ; 用0填充401000,大小为600的数据,目
的清空壳的数据
004A51FA 8B7424 28 mov esi, dword ptr ss: ; 4E0000,我们解压数据存放的地
方
004A51FE AC lods byte ptr ds: ; 取出esi地址一个byte的数据放到eax
004A51FF 8BD0 mov edx, eax ; eax=4=edx
004A5201 AD lods dword ptr ds: ; 区段的RVA,1000,6A000,7C000
004A5202 8BF8 mov edi, eax ; 区段的VA
004A5204 03FD add edi, ebp ; 加上基址=VA
004A5206 AD lods dword ptr ds: ; 要拷贝数的大小,6872E,F26F,E17C,4A0E
004A5207 8BC8 mov ecx, eax ; ecx做累加器
004A5209 F3:A4 rep movs byte ptr es:, byte ptr ds:; 拷贝
004A520B 4A dec edx ; 区段数减一
004A520C^ 75 F3 jnz short 作业.004A5201
004A520E 59 pop ecx
004A520F 5A pop edx
004A5210 58 pop eax
004A5211 8B3C24 mov edi, dword ptr ss:
004A5214 85C0 test eax, eax
004A5216 74 1B je short 作业.004A5233
004A5218 8A07 mov al, byte ptr ds:
004A521A 47 inc edi
004A521B 2C E8 sub al, 0xE8
004A521D 3C 01 cmp al, 0x1
004A521F^ 77 F7 ja short 作业.004A5218
004A5221 8B07 mov eax, dword ptr ds:
004A5223 3AC2 cmp al, dl
004A5225^ 75 F1 jnz short 作业.004A5218
004A5227 32C0 xor al, al
004A5229 0FC8 bswap eax
004A522B 030424 add eax, dword ptr ss:
004A522E 2BC7 sub eax, edi
004A5230 AB stos dword ptr es:
004A5231^ E2 E5 loopd short 作业.004A5218 ; 这段循环是修复E8的,ecx是处理的大
小
004A5233 55 push ebp ; 基址
004A5234 AD lods dword ptr ds:
004A5235 85C0 test eax, eax
004A5237 74 37 je short 作业.004A5270 ; IID的RVA64170,为空说明IAT处理完毕
004A5239 8BF8 mov edi, eax
004A523B 033C24 add edi, dword ptr ss: ; IID的VA
004A523E 56 push esi ; KERNEL32.dll
004A523F FF13 call dword ptr ds: ; LoadLibraryA装载kernel32
004A5241 8BE8 mov ebp, eax
004A5243 AC lods byte ptr ds:
004A5244 84C0 test al, al
004A5246^ 75 FB jnz short 作业.004A5243
004A5248 AD lods dword ptr ds:
004A5249 85C0 test eax, eax ; dll 中API是否获取完毕
004A524B^ 74 E7 je short 作业.004A5234 ; 完了就取下一个dll
004A524D 83EE 04 sub esi, 0x4
004A5250 AD lods dword ptr ds:
004A5251 A9 00000080 test eax, 0x80000000 ; 是不是以序号方式输入
004A5256 75 0B jnz short 作业.004A5263
004A5258 83EE 04 sub esi, 0x4 ; esi-4就是API的名字
004A525B 56 push esi ; API 函数名
004A525C 55 push ebp ; 所在dll的模块基址
004A525D FF53 04 call dword ptr ds: ; 调用GetProcAddress来货API函数的
名字
004A5260 AB stos dword ptr es: ; 填充IAT
004A5261^ EB E0 jmp short 作业.004A5243
004A5263 25 FFFFFF7F and eax, 0x7FFFFFFF
004A5268 50 push eax
004A5269 55 push ebp
004A526A FF53 04 call dword ptr ds:
004A526D AB stos dword ptr es:
004A526E^ EB D8 jmp short 作业.004A5248
004A5270 5D pop ebp ; 弹出基址
004A5271 5F pop edi ; 弹出401000
004A5272 C3 retn ; 返回到VirtualFree函数开始释放前面申请的内存
LordPE脱壳,ImportREC修复,如果想还原区段可以根据前面分析的数据来还原。输入表放在rdata段。
------------------------------------------------------------------------
【破解总结】
其实这是北掘壳的山寨版或者说是衍生版吧,就入口改了一下,其他代码都没变。
------------------------------------------------------------------------ 膜拜下丫丫兽 本帖最后由 杀很大 于 2010-6-3 17:12 编辑
是的基本没变
除了入口还改了一些特征,使不报毒
个人觉得这个壳还是很不错的
另外
这个是崛北
不是北掘 必须膜拜 yaya兽/:017 回复 3# 杀很大
这个名字我老搞错:lol: 丫丫弄壳的水平真的是眼看着一天一天的强大。膜拜 哈哈,丫丫脱壳很强的说! 膜拜YAYA啊@@ /:018yayazi,算法也很强大呀 ...我本来周末也想跟下这个壳的,不难、
好帖子,值个精华、LZ强大!
页:
[1]