娱乐一下,看论坛没朋友写这个,就忽悠一下!
今天有朋友叫我帮忙脱一壳,查壳后发现是hmimys-Packer V1.2 -> hmimys,但感觉奇怪,似乎这个壳被某人修改过,代码有所不同(后面证明):
★一、OD载入目标程序:
/*1012CD8*/ call PYG脱客_.01012D72 //EP
/*1012CDD*/ add byte ptr ds:[eax],dl
/*1012CDF*/ add dword ptr ds:[eax],eax
/*1012CE1*/ add byte ptr ds:[eax],dl
/*1012CE3*/ add byte ptr ds:[ecx],al
/*1012CE5*/ in al,dx
/*1012CE6*/ dec esp
/*1012CE7*/ add byte ptr ds:[eax],al
/*1012CE9*/ iretd
★二、Alt+M 打开内存镜像:
Memory map
地址 大小 属主 区段 包含 类型 访问 初始访问 已映射为
01000000 00001000 PYG脱客_ 01000000 (自身) PE 文件头 Imag R RWE
01001000 00011000 PYG脱客_ 01000000 hmimys 代码 Imag R RWE
01012000 0000E000 PYG脱客_ 01000000 hmimys SFX,输入表,资源 Imag R RWE
01020000 00001000 PYG脱客_ 01000000 hmimys Imag R RWE
在第一“PE 文件头”区段上,F2设置访问中断,F9运行中断:
Memory map, 条目 17
地址=01000000
大小=00001000 (4096.)
属主=PYG脱客_ 01000000 (自身)
区段=
包含=PE 文件头
类型=Imag 01001002
访问=R
初始访问=RWE
中断后来到这里:
/*7C930806*/ cmp word ptr ds:[ecx],5A4D
/*7C93080B*/ jnz short ntdll.7C93082A
/*7C93080D*/ mov edx,dword ptr ds:[ecx+3C]
/*7C930810*/ cmp edx,10000000
/*7C930816*/ jnb short ntdll.7C93082A
/*7C930818*/ lea eax,dword ptr ds:[edx+ecx]
/*7C93081B*/ mov dword ptr ss:[ebp-1C],eax
/*7C93081E*/ cmp dword ptr ds:[eax],4550
/*7C930824*/ jnz ntdll.7C958BB5
/*7C93082A*/ or dword ptr ss:[ebp-4],FFFFFFFF
/*7C93082E*/ call ntdll.7C92EE02
/*7C930833*/ retn 4
★三、再次 Alt+M 打开内存镜像:
在第一区段上,F2设置访问中断,F9运行中断:
Memory map, 条目 18
地址=01001000
大小=00011000 (69632.)
属主=PYG脱客_ 01000000
区段=hmimys
包含=代码
类型=Imag 01001002
访问=R
初始访问=RWE
中断后来到这里:
/*10102D3*/ mov dword ptr ss:[esp],eax
/*10102D6*/ call PYG脱客_.010102E7
/*10102DB*/ inc ebx
/*10102DC*/ insb
/*10102DD*/ outsd
/*10102DE*/ jnb short PYG脱客_.01010345
/*10102E0*/ dec eax
/*10102E1*/ popad
/*10102E2*/ outsb
/*10102E3*/ insb
/*10102E5*/ add byte ptr gs:[ebp-1],dl
/*10102E9*/ salc
/*10102EA*/ call eax
/*10102EC*/ push 0
/*10102EE*/ call PYG脱客_.010102FE
四、Ctrl+S搜索代码:
popad
push eax
找到这里:
/*10106C9*/ popad
/*10106CA*/ push eax
/*10106CB*/ push E82BBDF5
/*10106D0*/ pushad
/*10106D1*/ push C748640E
/*10106D6*/ sub esp,-4
/*10106D9*/ popad
/*10106DA*/ sub esp,-4
/*10106DD*/ pop eax
/*10106DE*/ call PYG脱客_.010106E3
/*10106E3*/ jmp short PYG脱客_.010106E6
/*10106E5*/ outsb
/*10106E6*/ add ebx,7B30DA6E
/*10106EC*/ sub ebx,7B30DA6E
/*10106F2*/ retn //在这里F2设置断点,经过2次中断后飞向OEP
飞向OEP:
/*1006420*/ push ebp //OEP
/*1006421*/ mov ebp,esp
/*1006423*/ push -1
/*1006425*/ push PYG脱客_.01001888
/*100642A*/ push PYG脱客_.010065D0
/*100642F*/ mov eax,dword ptr fs:[0]
/*1006435*/ push eax
/*1006436*/ mov dword ptr fs:[0],esp
/*100643D*/ add esp,-68
/*1006440*/ push ebx
/*1006441*/ push esi
/*1006442*/ push edi
/*1006443*/ mov dword ptr ss:[ebp-18],esp
/*1006446*/ mov dword ptr ss:[ebp-4],0
/*100644D*/ push 2
/*100644F*/ call dword ptr ds:[1001160]
★五、LoadPE脱壳、Import REC修复即可!
OEP=1006420-1000000=0006420
为了证明我开场的观点,于是用真正的hmimys-Packer V1.2加了几个试炼程序(包括脱壳后我们的目标程序):
脱壳前三步与以上的一样,接着我们来说第四步,也就是找OEP:(这里目标为脱壳后再加壳的目标程序)
★一(略)
★二(略)
★三(略)
四、Ctrl+B搜索代码:
AB EB E4 AD 50 55 FF 53 04 AB EB E0 C3
来到:
/*1028DB8*/ lodsb
/*1028DB9*/ test al,al
/*1028DBB*/ jnz short PYG脱客_.01028DB8
/*1028DBD*/ lodsw
/*1028DBF*/ test ax,ax
/*1028DC2*/ je short PYG脱客_.01028DAD
/*1028DC4*/ lodsb
/*1028DC5*/ sub esi,3
/*1028DC8*/ test al,al
/*1028DCA*/ je short PYG脱客_.01028DD4
/*1028DCC*/ push esi
/*1028DCD*/ push ebp
/*1028DCE*/ call dword ptr ds:[ebx+4]
/*1028DD1*/ stosd //找到这里
/*1028DD2*/ jmp short PYG脱客_.01028DB8
/*1028DD4*/ lodsd
/*1028DD5*/ push eax
/*1028DD6*/ push ebp
/*1028DD7*/ call dword ptr ds:[ebx+4]
/*1028DDA*/ stosd
/*1028DDB*/ jmp short PYG脱客_.01028DBD
/*1028DDD*/ retn //在这里F2设置断点,中断后F8飞向OEP
飞向OEP:
/*1006420*/ push ebp
/*1006421*/ mov ebp,esp
/*1006423*/ push -1
/*1006425*/ push PYG脱客_.01001888
/*100642A*/ push PYG脱客_.010065D0
/*100642F*/ mov eax,dword ptr fs:[0]
/*1006435*/ push eax
/*1006436*/ mov dword ptr fs:[0],esp
/*100643D*/ add esp,-68
/*1006440*/ push ebx
/*1006441*/ push esi
/*1006442*/ push edi
/*1006443*/ mov dword ptr ss:[ebp-18],esp
/*1006446*/ mov dword ptr ss:[ebp-4],0
/*100644D*/ push 2
/*100644F*/ call dword ptr ds:[1001160]
★五(略)
原来hmimys-Packer 1.30也可以这么脱~~o(∩_∩)o...
hmimys-Packer 1.30 主程序更为简便脱法(亦可应用于附件中的试炼品):
壳主程序EP:
/*
/*418360*/ call hmiPack1.004183FA
/*418365*/ add byte ptr ds:[eax+1],al
/*418368*/ add byte ptr ds:[eax],al
/*41836A*/ adc byte ptr ds:[eax],al
/*41836D*/ xlat byte ptr ds:[ebx+al]
/*41836E*/ add byte ptr gs:[eax],al
/*418371*/ push edi
/*418372*/ mov dword ptr ds:[ecx],eax
/*418375*/ add al,dh
/*418377*/ inc ecx
/*418378*/ add byte ptr ds:[eax+6B],dh
/*41837B*/ inc eax
/*41837C*/ add byte ptr ds:[eax],al
/*41837E*/ inc eax
/*41837F*/ inc ecx
/*418380*/ add byte ptr ds:[edi+1D],dh
/*418383*/ cmp byte ptr ds:[eax-53],80
/*418388*/ jl short hmiPack1.0041838A
/*41838A*/ add byte ptr ds:[eax],al
*/
Alt+M打开内存镜像,在第一区段F2设置访问断点:
/*
Memory map, 条目 18
地址=00401000
大小=00014000 (81920.)
属主=hmiPack1 00400000
区段=hmimys
包含=代码
类型=Imag 01001002
访问=R
初始访问=RWE
*/
F9 运行中断:
/*
/*418719*/ mov byte ptr ds:[eax+ecx],bl
/*41871C*/ jge short hmiPack1.00418727
/*41871E*/ and dword ptr ss:[ebp-4],0
/*418722*/ jmp hmiPack1.00418944
/*418727*/ cmp dword ptr ss:[ebp-4],0A
/*41872B*/ jge short hmiPack1.00418736
/*41872D*/ sub dword ptr ss:[ebp-4],3
/*418731*/ jmp hmiPack1.00418944
/*418736*/ sub dword ptr ss:[ebp-4],6
/*41873A*/ jmp hmiPack1.00418944
*/
Ctrl+B搜索代码:5F 5E 5B C9 C2 14 00
/*
/*418950*/ pop edi
/*418951*/ pop esi
/*418952*/ pop ebx
/*418953*/ leave
/*418954*/ retn 14 // F2设置访问断点,F9运行中断后F7跟进
*/
Ctrl+B搜索代码:AB EB E4 AD 50 55 FF 53 04 AB EB E0 C3
/*
/*418459*/ stosd
/*41845A*/ jmp short hmiPack1.00418440
/*41845C*/ lodsd
/*41845D*/ push eax
/*41845E*/ push ebp
/*41845F*/ call dword ptr ds:[ebx+4]
/*418462*/ stosd
/*418463*/ jmp short hmiPack1.00418445
/*418465*/ retn // F2设置访问断点,F9运行中断后F7跟进,飞向OEP
*/
找到OEP,LoadPE脱壳、Import REC修复即可!
/*
/*406B70*/ push 60
/*406B72*/ push hmiPack1.0040B378
/*406B77*/ call hmiPack1.00407DFC
/*406B7C*/ mov edi,94
/*406B81*/ mov eax,edi
/*406B83*/ call hmiPack1.00407F60
/*406B88*/ mov dword ptr ss:[ebp-18],esp
/*406B8B*/ mov esi,esp
/*406B8D*/ mov dword ptr ds:[esi],edi
/*406B8F*/ push esi
*/
[课程]Android-CTF解题方法汇总!