ORiEN V1.X-V2.X两种思路
00417000 > /E9 5D010000 jmp ORiEN_V1.00417162 //程序载入OD00417005 |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: //纪录下我们的两个无效指针
004010D9 8BF0 mov esi,eax
004010DB 8A00 mov al,byte ptr ds:
━━━━━━━━━数据窗口━━━━━━━━━━━━━
000063A0+我们的基址00400000等于我们指针被加密的地址004063A0
在命令提示行输入D 004063A0,如下
004063A000418F21ORiEN_V1.00418F21 //指针被加密,我们在这里右键下硬件访问断点
004063A47C80BDD6kernel32.lstrlenA //在我们的OEP:004010CC处同样下上硬件访问断点
004063A87C810131kernel32.lstrcpynA //Ctrl+F2从新载入程序
004063AC7C923151ntdll.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:,al
00419B72 0183 C50083EF add dword ptr ds:,eax
━━━━━━━━━数据窗口━━━━━━━━━━━━
004063A07C81CA82kernel32.ExitProcess //第6次时发现我们被加密的指针已经出现
004063A4BFF77429
004063A8BFF773B2
━━━━━━━━━━━━━━━━━━━━━━━━━━
004187D1 50 push eax ; kernel32.ExitProcess //当我们走到这里时发现取出了我们加密地址IAT
004187D2 E8 E9FFFFFF call ORiEN_V1.004187C0 //很容易可以联想到上面既然把我们的IAT压入EAX,这里的CALL一定跟进
004187D7 FF25 83C404EB jmp dword ptr ds:
004187DD 01A8 8D83211F add dword ptr ds:,ebp
004187E3 0000 add byte ptr ds:,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:,C48>
004187CC 04 EB add al,0EB
004187CE 0ACD or cl,ch
004187D0 2050 E8 and byte ptr ds:,dl
━━━━━━━━━━━━━━━━━━━━━━━━━━
0041884F 8907 mov dword ptr ds:,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:=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:,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:,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: ; 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,修复下即可解决跨平台问题
问题解决完啦,谢谢大家看完,这壳没有这么难的,只是感觉我自己都打得好复杂,大家别介意 图1
首先我们取我们的镜象基址+镜象大小,结果0041D000
准备好我们的断点,开始脱壳BP GetProcAddress <0041D000&<0041D000
这样使用条件断点就可以保证GetProcAddress中断时是目标程序调用的
━━━━━━━━━━━━━━━━━━━━━━━━━━
00417000 > /E9 5D010000 jmp ORiEN_V1.00417162 //程序载入OD
00417005 |CE into //在命令行下断BP GetProcAddress <0041D000&<0041D000
00417006 |D1CE ror esi,1 //shift+f9运行
00417008 |CE into
00417009 |0D 0A2D2D2D or eax,2D2D2D0A
━━━━━━━堆栈窗口━━━━━━━━━━━━━
0012FF5C 00419ADD/CALL 到 GetProcAddress 来自 ORiEN_V1.00419AD8 //第一次中断后
0012FF60 7D590000|hModule = 7D590000 (SHELL32) //取消断点,ait+f9返回用户代码
0012FF64 00406538\ProcNameOrOrdinal = "DragFinish"
0012FF68 00406000ORiEN_V1.00406000 //这里即为我们的RVA大小
这里的6000就是我们的RVA的大小,公式等于如下:
00406000-00400000=6000
━━━━━━━━━━━━━━━━━━━━━━━━━━
00419ADD /EB 07 jmp short ORiEN_V1.00419AE6 //我们返回到了这里, 运行LORDPE把程序DUMP
00419ADF |88FC mov ah,bh //程序DUMP之后Ctrl+S查找命令序列
00419AE1 |B6 FF mov dh,0FF
00419AE3 |65:18CD sbb ch,cl
00419AE6 \EB 02 jmp short ORiEN_V1.00419AEA
━━━━━━━━━━━━━━━━━━━━━━━━━━
jmp eax //这里是我们需要查找的命令序列,至于怎么获得大家可以ESP定律先去一下OEP观察
int 0EB
sti
━━━━━━━━━━━━━━━━━━━━━━━━━━
00418AF1 FFE0 jmp eax //查找到,F2下断,shift+f9运行程序
00418AF3 CD EB int 0EB //程序停下后F8单步一步跟进OEP
00418AF5 FB sti
00418AF6 EB 10 jmp short ORiEN_V1.00418B08
━━━━━━━━━━━━━━━━━━━━━━━━━━
004010CC 55 push ebp //纪录当前OEP为10CC
004010CD 8BEC mov ebp,esp //在次打开我们的LordPE修改
004010CF 83EC 44 sub esp,44 //lordPE的PE编辑器
004010D2 56 push esi
004010D3 FF15 E4634000 call dword ptr ds: ; ORiEN_V1.00418F8A
━━━━━━━━━━━━━━━━━━━━━━━━━━
图2
━━━━━━━━━━━━━━━━━━━━━━━━━━
将我们的入口点改为10CC,在单击目录,将我们的输入表地址修改为6000
图3
做好以上的修改后,记住单击保存在点确定,便可以发现程序可以运行啦 学习了,谢谢小生精彩的文章:lol 学习顶小生一如既往地支持:victory: :victory: 感謝版主分享 ORiEN V1.X-V2 脫殼教學. 精彩的教程小生牛人 我越看越糊涂。。。。。。。:L
下载回去仔细研究去。。。。。。。 太强大,下载试了一下,OK,又学习了,谢谢小生哥!:handshake 来看看了啊 谢谢分享 学习了
页:
[1]
2