|
自己记录.........
|
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 这样就完成了。
http://www.kyospace.com/feedcomm.asp?logID=319 |