小生我怕怕 发表于 2009-2-7 22:37

ORiEN V1.X-V2.X两种思路

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:    //纪录下我们的两个无效指针
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,修复下即可解决跨平台问题

问题解决完啦,谢谢大家看完,这壳没有这么难的,只是感觉我自己都打得好复杂,大家别介意

小生我怕怕 发表于 2009-2-7 22:37

图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

做好以上的修改后,记住单击保存在点确定,便可以发现程序可以运行啦

zeger 发表于 2009-2-8 03:49

学习了,谢谢小生精彩的文章:lol

yuyong8301 发表于 2009-2-8 09:21

学习顶小生一如既往地支持:victory: :victory:

a2213572 发表于 2009-2-8 10:16

感謝版主分享 ORiEN V1.X-V2 脫殼教學.

qq227479645 发表于 2009-2-8 13:16

精彩的教程小生牛人

小糊涂虫 发表于 2009-2-8 15:17

我越看越糊涂。。。。。。。:L
下载回去仔细研究去。。。。。。。

iawen 发表于 2009-2-8 15:39

太强大,下载试了一下,OK,又学习了,谢谢小生哥!:handshake

419611868 发表于 2009-2-8 16:52

来看看了啊

zckey09 发表于 2009-3-21 19:40

谢谢分享 学习了
页: [1] 2
查看完整版本: ORiEN V1.X-V2.X两种思路