好友
阅读权限40
听众
最后登录1970-1-1
|
00417000 > /E9 5D010000 jmp ORiEN_V1.00417162 //程序载入OD
00417005 |CE into //单步一步F8
00417006 |D1CE ror esi,1
00417008 |CE into
00417009 |0D 0A2D2D2D or eax,2D2D2D0A
━━━━━━━━━━━━━━━━━━━━━━━━━━
00417162 60 pushad //我们继续单步一步F8
00417163 E8 783B0000 call ORiEN_V1.0041ACE0 //我们在这里执行ESP定律
00417168 BF A420AE05 mov edi,5AE20A4 //设置好断点F9运行
0041716D F2: prefix repne:
━━━━━━━━━━━━━━━━━━━━━━━━━━
00418ADB B8 CC100000 mov eax,10CC //停在了这里,可以发现此时是把OEP的地址赋值EAX
00418AE0 83F8 00 cmp eax,0
00418AE3 74 13 je short ORiEN_V1.00418AF8
00418AE5 05 00004000 add eax,ORiEN_V1.00400000 //这里把我们的基址和当前EAX里的值相加
00418AEA EB 08 jmp short ORiEN_V1.00418AF4 //上面计算出来的即是我们的OEP
━━━━━━━━━━━━━━━━━━━━━━━━━━
00418AF1 - FFE0 jmp eax ; ORiEN_V1.004010CC //一路单步来到这里004010CC这里即我们的OEP
00418AF3 CD EB int 0EB //单步一步F8跟进去
00418AF5 FB sti
00418AF6 EB 10 jmp short ORiEN_V1.00418B08
━━━━━━━━━━━━━━━━━━━━━━━━━━
004010CC 55 push ebp //我们的OEP
004010CD 8BEC mov ebp,esp //运行LordPE把程序DUMP
004010CF 83EC 44 sub esp,44 //在运行importRCE修复我们的IAT指针
004010D2 56 push esi //发现我们的指针有两个指针是无效的,如下图
004010D3 FF15 E4634000 call dword ptr ds:[4063E4] //纪录下我们的两个无效指针
004010D9 8BF0 mov esi,eax
004010DB 8A00 mov al,byte ptr ds:[eax]
━━━━━━━━━数据窗口━━━━━━━━━━━━━
000063A0+我们的基址00400000等于我们指针被加密的地址004063A0
在命令提示行输入D 004063A0,如下
004063A0 00418F21 ORiEN_V1.00418F21 //指针被加密,我们在这里右键下硬件访问断点
004063A4 7C80BDD6 kernel32.lstrlenA //在我们的OEP:004010CC处同样下上硬件访问断点
004063A8 7C810131 kernel32.lstrcpynA //Ctrl+F2从新载入程序
004063AC 7C923151 ntdll.RtlMoveMemory
━━━━━━━━━━━━━━━━━━━━━━━━━━
00417000 > /E9 5D010000 jmp ORiEN_V1.00417162 //程序从新载入后
00417005 |CE into //由于全部已经下上了硬件断点,我们shift+f9直接运行
00417006 |D1CE ror esi,1
00417008 |CE into
00417009 |0D 0A2D2D2D or eax,2D2D2D0A
━━━━━━━━━━━━━━━━━━━━━━━━━━
00419B65 /EB 06 jmp short ORiEN_V1.00419B6D //shift+f9第6次时发现我们的加密指针已经出现
00419B67 |43 inc ebx //我们F8单步向下走吧
00419B68 |66:B8 83C7 mov ax,0C783 //由于太多的花指令,这里我直接就复制关键代码部分啦
00419B6C |0083 EFFF83C7 add byte ptr ds:[ebx+C783FFEF],al
00419B72 0183 C50083EF add dword ptr ds:[ebx+EF8300C5],eax
━━━━━━━━━数据窗口━━━━━━━━━━━━
004063A0 7C81CA82 kernel32.ExitProcess //第6次时发现我们被加密的指针已经出现
004063A4 BFF77429
004063A8 BFF773B2
━━━━━━━━━━━━━━━━━━━━━━━━━━
004187D1 50 push eax ; kernel32.ExitProcess //当我们走到这里时发现取出了我们加密地址IAT
004187D2 E8 E9FFFFFF call ORiEN_V1.004187C0 //很容易可以联想到上面既然把我们的IAT压入EAX,这里的CALL一定跟进
004187D7 FF25 83C404EB jmp dword ptr ds:[EB04C483]
004187DD 01A8 8D83211F add dword ptr ds:[eax+1F21838D],ebp
004187E3 0000 add byte ptr ds:[eax],al
004187E5 EB 64 jmp short ORiEN_V1.0041884B
━━━━━━━━━━━━━━━━━━━━━━━━━━
004187C0 /EB 02 jmp short ORiEN_V1.004187C4 //继续向下走,太多花指令
004187C2 |6996 83C700EB 0>imul edx,dword ptr ds:[esi+EB00C783],C48>
004187CC 04 EB add al,0EB
004187CE 0ACD or cl,ch
004187D0 2050 E8 and byte ptr ds:[eax-18],dl
━━━━━━━━━━━━━━━━━━━━━━━━━━
0041884F 8907 mov dword ptr ds:[edi],eax //到了这里后我们可以发现要把我们的IAT加密啦
00418851 EB 06 jmp short ORiEN_V1.00418859 //留意我们的信息窗口和寄存器窗口
00418853 43 inc ebx
00418854 66:B8 83C7 mov ax,0C783
━━━━━━━━━信息窗口━━━━━━━━━━━━
eax=00418F21 (ORiEN_V1.00418F21) //EAX已经显示出我们的加密地址00418F21
ds:[004063A0]=7C81CA82 (kernel32.ExitProcess)
━━━━━━━━━━━━━━━━━━━━━━━━━━
上面的指令已经告诉我们把EAX的加密指令传送给我们EDI里的地址。而EDI的地址即为我们当前的IAT的地址
EAX 00418F21 ORiEN_V1.00418F21 //EAX的值是加密后的值
ECX 000008F0
EDX 00406014 ORiEN_V1.00406014
EBX 00417000 offset ORiEN_V1.<ModuleEntryPoint>
ESP 0012FFA4
EBP 0012FFF0
ESI 004063A4 ORiEN_V1.004063A4
EDI 004063A0 ORiEN_V1.004063A0 //EDI的值就是我们当前IAT地址
EIP 0041884F ORiEN_V1.0041884F
━━━━━━━━━━━━━━━━━━━━━━━━━━
0041884F 8907 mov dword ptr ds:[edi],eax //直接把这里NOP掉即可解决掉我们的加密
00418851 EB 06 jmp short ORiEN_V1.00418859 //NOP完后,打开硬件断点,看看我们的OEP断点还在
00418853 43 inc ebx
00418854 66:B8 83C7 mov ax,0C783
00418858 0083 EFFF83C7 add byte ptr ds:[ebx+C783FFEF],al
━━━━━━━━━━━━━━━━━━━━━━━━━━
004010CC 55 push ebp //这里就是我们的OEP
004010CD 8BEC mov ebp,esp //DUMP吧,在运行我们的importRCE修复下
004010CF 83EC 44 sub esp,44 //修复时发现我们的IAT全部是正常的啦
004010D2 56 push esi
004010D3 FF15 E4634000 call dword ptr ds:[4063E4] ; kernel32.GetCommandLineA
━━━━━━━━━━━━━━━━━━━━━━━━━━
我们运行下程序发现出错啦,我们PEID查下,如下图
够卑鄙吧,这个壳精彩之处开始,在运行我们的LORDPE---PE编辑器---区段
可以发现我们的物理大小和物理偏移都是0,这样我们的文件是可执行文件才怪,当然是无效PE文件
右键选择我们出错的PE头区段,PE编辑器,把我们的物理大小改为和虚拟大小一样,物理偏移改成和虚拟偏移一样,如下图
切忌修改后一定要点保存不然程序无效,保存后发现程序可以运行啦,下面我们来做下简单的优化吧!
这个程序我今天试过脱下来后我给朋友测试啦,牵涉到跨平台问题,所以我们要优化下文件大小,顺便解决下跨平台问题
━━━━━━━━━━━━━━━━━━━━━━━━━━
首先把我们脱壳后的程序在次载入OD,ait+M打开内存镜像,依次在这几段分别F2下上断点,如图
接着shift+f9运行程序,发现直到程序运行后我们有两个区段未被调用,原则上就可以说这两个区段是多余的,如下图
━━━━━━━━━━━━━━━━━━━━━━━━━━
运行我们的FFI把这两个多余的区段删除,在运行我们的Resource Binder 2.6 CN Fixed删除一下其他垃圾
虽然文件多了10几KB,但是我们程序的资源回来啦,好我们在来解决下我们的跨平台问题
━━━━━━━━━━━━━━━━━━━━━━━━━━
程序载入OD后选择我们的附加窗口,察看下我们的当前程序进程的PID,下图突显的就是我们的程序的进程
那么我们程序当前进程为A74,这里修复跨平台用到我们的UIF1.2如下图,如果进程ID直接点开始,然后在打
开我们的importRCE修复下
━━━━━━━━━━━━━━━━━━━━━━━━━━
打开我们的importRCE进行下设置,准备修复我们的跨平台函数,运行importRCE,选项
具体钩选如下图,输入我们的UIF里纪录的IAT和大小,填上我们的OEP10CC,修复下即可解决跨平台问题
问题解决完啦,谢谢大家看完,这壳没有这么难的,只是感觉我自己都打得好复杂,大家别介意 |
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|