<< Alex Protector 1.0 beta2 Category: 黑客技术文章 壳 自己记录2....... >>
自己记录.........    [ 2009-04-24 8:34:39 PM | Author: kyo327 | From: Original ]
PELock 1.0x -> Bartosz Wojcik
oep

这个壳oep还不算难

就内存访问断点 或者最后一次异常后再内存断点都行.

只用内存访问断的话 要pe段 代码段来回的段个五六次就到了

到了OEP后
/*40C9A0*/ call 0040DAE8
/*40C9A5*/ jmp 00920D0D
/*40C9AA*/ mov eax, edi
/*40C9AC*/ call 0040DC40

明显入口被偷了
这是堆栈
0012FFB0 00401D60
0012FFB4 00000060

那么入口处可以给补上
push 60
push 00401D60

补上后OEP为40c999

/////////////////////////////
不过IAT还是加密的
找到一个401000
dd 401000
00401000 003E0000 ASCII "h",LF
00401004 003E0033
00401008 003E0084
0040100C 003E010B
00401010 003E015B
00401014 003E01B5
00401018 003E020B
0040101C 003E023E
00401020 003E026F
00401024 003E0281
00401028 003E02E5
0040102C 003E031F


确实加密了
下个内存断点看下吧
/*38444E*/ MOV DWORD PTR DS:[ECX],EbX

在这里给填充了
而此时的eax却是正确的iat,可以改为
MOV DWORD PTR DS:[ECX],EaX

可这样改会有crc校验 我也没找到校验在哪


就比猫画虎写了一点垃圾脚本 跑一下吧
tmp1:
mov tmpreg, ebx
mov ebx, eax
sti
mov ebx, tmpreg
bprm 0038444e,1
cmp eax,77d3b144
run
jnz tmp1
mov ebx, tmpreg
sti
bprm 00384450,1

我这脚本是走到 MOV DWORD PTR DS:[ECX],EbX时才能运行的

cmp eax,77d3b144这里是最后一个函数的比较

处理完后IAT全部都正常了

可是还有一些jmp不知道怎么改

/*40C9A0*/ CALL 1.0040DAE8
/*40C9A5*/ JMP 003F0D0D ////象这样的被替换的
/*40C9AA*/ MOV EAX,EDI
/*40C9AC*/ CALL 1.0040DC40
/*40C9B1*/ MOV DWORD PTR SS:[EBP-18],ESP
/*40C9B4*/ MOV ESI,ESP
/*40C9B6*/ MOV DWORD PTR DS:[ESI],EDI
/*40C9B8*/ PUSH ESI
/*40C9B9*/ JMP 003F0D25 ////象这样的被替换的

-------------------------------------------华丽的分割线--------------------------------------------------

补区段吧

由于地址3f00000低于基址400000
避免壳申请的区段低于镜像基址的一个方法
有些壳申请的区域低于镜像基址,可以在运行前,先人为手动把镜像基址前的内存申请出来,这样壳就只能申请镜像基址以后的内存了。
下面是代码示例,本例中镜像基址为00400000,不同基址可修改相应数据实现。
00409C15 9C pushfd
00409C16 60 pushad ; 上面这两句保存现场
00409C17 6A 04 push 4
00409C19 68 00100000 push 1000
00409C1E 68 00100000 push 1000
00409C23 6A 00 push 0
00409C25 E8 a945827C call kernel32.VirtualAlloc ; 这5句是申请内存
00409C2A 3D 00003F00 cmp eax, 3F0000 ; 比较有没有申请到程序的镜像基址处
00409C2F ^ 75 E6 jnz short 00409C17 ; 没有就跳回去继续申请
00409C31 61 popad
00409C32 9D popfd ; 恢复现场
00409C33 90 nop ; 这里下个断点
00409C34 90 nop

中断后,清除这些代码,把eip回到原来的位置,就可以了。
-------------------------------------------华丽的分割线--------------------------------------------------
到OEP,并且偷代码也处理好了后 如果有对代码的替换,那么一般来说可以用补区段的方法。

打开loadpe,

/*40C9A0*/ CALL 1.0040DAE8
/*40C9A5*/ JMP 00900D0D //代码的替换
/*40C9AA*/ MOV EAX,EDI
/*40C9AC*/ CALL 1.0040DC40
/*40C9B1*/ MOV DWORD PTR SS:[EBP-18],ESP
/*40C9B4*/ MOV ESI,ESP
/*40C9B6*/ MOV DWORD PTR DS:[ESI],EDI
/*40C9B8*/ PUSH ESI
/*40C9B9*/ JMP 00900D25 //代码的替换


对00900d25所在的区段进行转存
然后用pe编辑器打开修复好但不能运行的dump_.exe。
点区段---->右键--从磁盘载入段------>编辑区段

把00900000-400000=500000添到虚拟地址那里
保存---确定
再点重键PE选择那个dump_.exe
这样就完成了。




[ Edited by kyo327 at 2009-08-27 11:09:49 AM ]

Comments RSS Feed http://www.kyospace.com/feedcomm.asp?logID=319

Quote kyo327 Posted at 2009-04-27 4:12:29 PM
脱壳也玩了一阵子了
感觉也就那样 没什么可值得研究的
基本上一些不太复杂的加密壳也都能脱了
复杂的 我也没精力弄了 毕竟好多都有脚本或者脱壳机

以后碰到再说吧
主业还是安全这块 多分析分析漏洞也许是有用的


Post Comment
Topic Locked or You don't have the Permission. No Comment Allowed.
Here is kyo's blog © 2004-2005 
Processed in 0.062500 second(s)