首页
社区
课程
招聘
[求助]oreans unvirtualizer的使用问题
发表于: 2014-7-10 20:31 13264

[求助]oreans unvirtualizer的使用问题

2014-7-10 20:31
13264
请问我的操作哪里错了。
  我找到一处push jmp push jmp.....,(在最后一个区段也就是vm区段),然后选择referrence。设置好了code 和vm段的起点和长度。referrence面板分析出很多call xxxx ,jmp xxxx,但是双击之后选择unvirtualize没反应,下面的状态栏提示machine signature not found。也就是下面第3步没有反应,是需要先到oep才能使用插件,还是什么原因呢,对插件分析有影响吗。
1.- Load the sample Application
2.- Right click on CPU window and click OreansUnVirtualizer
->Find References
On the Window, fill the data with module info
(In this case only one reference was found)
3.- Double click on the reference, and on the CPU window
right click->OreansUnVirtualizer -> UnVirtualize
(In Case some parameters are wrong, just check them on the
VirtualMachine by following the jump)
Press OK (all parameter are fine)
4.- No errors on DeOfuscating, (if there are some, just fix them
on the Cisc_Iat_XXXXXXX.txt where XXXXX is the addres of the
handler
5.- Go back to References window and click again UnVirtualize
6.- A Window will popup with the opcodes dissassembled, on
CodeVirtualizer, select the address from the .txt file
with the instruction that you may think is the first
(On CV 99.9% is the first instruction)
7.- Press OK
8.- UnVirtualize DONE! (always check at the end of the Unvirtualized
function the Jump (EB 10)

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 4343
活跃值: (4328)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
插件目前的最高版本不支持新版的 TMD/WL   需要期待作者更新
2014-7-11 07:43
0
雪    币: 135
活跃值: (63)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
我的版本是1.8的,不知道是哪儿弄错了,插件没分析出来。等会截个图。。
2014-7-11 08:00
0
雪    币: 4343
活跃值: (4328)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
1.8 就是目前oreans unvirtualizer插件公开的最新版   不支持新版本的Themida 和 WinLicense.
2014-7-11 08:11
0
雪    币: 135
活跃值: (63)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
是tmd的版本是1.8。插件也是1.8。我先选择了oreans unvirtualizer -> referrence,填写好了code段和vm段的起点和大小。然后referrence面板出现了
call xxxxxxxx
jmp xxxxxxxx
jmp xxxxxxx
........
之类的,双击这些指令,后面就是handler。
但是再点oreand unvirtualizer -> 有3个选项,但是没有反应。
不知道哪里弄错了。分别是



第3张图选择univertualize with call的时候没有弹出对话框,也没什么反应,我看tmd的sample有弹出。。
上传的附件:
2014-7-11 08:49
0
雪    币: 4343
活跃值: (4328)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
把 EIP 指定到 CALL/JMP 指令上 再用右键功能  或者运行到该VM处再用右键
2014-7-11 09:27
0
雪    币: 627
活跃值: (663)
能力值: ( LV9,RANK:270 )
在线值:
发帖
回帖
粉丝
7
要正确使用这个插件,要求其实是蛮高的:对虚拟机的结构要有所了解!而且插件作者也假设使用者已经具备这些基础知识。
关于CISC,可读读softworm较早的两篇文章“Themida 1.9.1.x CISC VM简单分析”和“Themida v1.8.0.0 Demo虚拟机分析”,很经典的。
而对RISC,可看一下Deathway的“Oreans RISC machine documentation”。
现在Oreans新的VM还没有见到谁有过公开的分析发布。关于TIGER VM,我曾写过一个非常初浅的说明,在这里;Deathway曾明确表示,他的插件暂时不会支持TIGER。

进入TIGER VM时有如下特征:
[FONT="Courier"]016058F6   68 A4FD5F00          PUSH    5FFDA4          ; pPCODE(RVA)
016058FB   68 97040000          PUSH    497             ; dwFirstHandlerNum
01605900   E9 0692EDFF          JMP     014DEB0B        ; VM_ENTRY[/FONT]

不细说它了,反正插件也没法用。

下面只说CISC和RISC,比如以下代码:
[FONT="Courier"]00408BEF   E9 A7E84F00          JMP     0090749B        ; to VM Section

0090749B   68 747A4674          PUSH    0x74467A74      ; Key
009074A0   E9 C6EBFEFF          JMP     008F606B        ; VM_Entry[/FONT]

这里,要特别注意代码的地址所处的区段:00408BEF位于户代码段(Base: 00401000, Size: 001C7000);而0090749B位于目标的倒数第三个区段(Base: 005D3000, Size: 00485000),即要进VM了。
这个例子是RISC的,它是准备调用一个Winlicense SDK函数,当然这个SDK函数肯定是VM了的。另一种情况是用户代码有被保护的片段时,也是同样的跳转。被保护的系统API不属于此讨论范围。

不是随便在任何一个“JMP 目标地址”都可以使用插件的Unvirtualize命令的!比如,在地址009074A0处Unvirtualize,一定会报"machine signature not found";在地址00408BEF处就能成功Unvirtualizing。
从代码的特征,我们可以得到以下结论:使用Unvirtualize命令那个JMP的目标地址一定是"PUSH KEY/JMP VM_Entry"指令序列,否则命令失败!
插件就是这样设计的,是它找VM入口(VM_Entry)的必要条件。

所以,"Find Referrences"命令在户代码段使用比较有意义!需要识别出JMP的目标地址是指向倒数第三个区段(VM区段)的才有效。
而如果在VM区段使用这个命令,就毫无意义了。原因在于,任何一个采用VM技术的产品,代码的乱序和膨胀是非常重要的一环,否则研究的人可以容易地,从而很快地搞懂你的VM结构。命令会找到无数多个用于乱序的JMPs。

这是最容易识别的,即你通常会看到一大片连续的PUSH/JMP序列。
还有一种隐蔽的情况,通常出现在Oreans的壳自身代码部分,到达OEP或Near OEP之前。即Oreans的某个功能模块结束,下一个模块的代码已经SMC完成,转向新的模块地址时,我称之为“转场”。
用户代码中,有关键代码被保护时,也可能出现这种情况。比如下面代码位于VM所在区段:
[FONT="Courier"]0084FC64   83EC 04              SUB     ESP, 0x4
0084FC67   891424               MOV     DWORD PTR [ESP], EDX
0084FC6A   89E2                 MOV     EDX, ESP
0084FC6C   81C2 04000000        ADD     EDX, 0x4
0084FC72   83EA 04              SUB     EDX, 0x4
0084FC75   871424               XCHG    DWORD PTR [ESP], EDX
0084FC78   5C                   POP     ESP
0084FC79   57                   PUSH    EDI
0084FC7A   893424               MOV     DWORD PTR [ESP], ESI
0084FC7D   68 435C0000          PUSH    0x5C43
0084FC82   891C24               MOV     DWORD PTR [ESP], EBX
0084FC85   53                   PUSH    EBX
0084FC86   68 6415E81D          PUSH    0x1DE81564
0084FC8B   5B                   POP     EBX
0084FC8C   C1EB 04              SHR     EBX, 0x4
0084FC8F   81C3 A406736D        ADD     EBX, 0x6D7306A4
0084FC95   53                   PUSH    EBX
0084FC96   812C24 35361274      SUB     DWORD PTR [ESP], 0x74123635
0084FC9D   5E                   POP     ESI
0084FC9E   81C6 35361274        ADD     ESI, 0x74123635
0084FCA4   5B                   POP     EBX
0084FCA5   68 75080000          PUSH    0x875
0084FCAA   892424               MOV     DWORD PTR [ESP], ESP
0084FCAD   810424 04000000      ADD     DWORD PTR [ESP], 0x4
0084FCB4   5B                   POP     EBX
0084FCB5   56                   PUSH    ESI
0084FCB6   8F43 08              POP     DWORD PTR [EBX+0x8]
0084FCB9   8B1C24               MOV     EBX, DWORD PTR [ESP]
0084FCBC   50                   PUSH    EAX
0084FCBD   89E0                 MOV     EAX, ESP
0084FCBF   05 04000000          ADD     EAX, 0x4
0084FCC4   05 04000000          ADD     EAX, 0x4
0084FCC9   870424               XCHG    DWORD PTR [ESP], EAX
0084FCCC   5C                   POP     ESP
0084FCCD   8B3424               MOV     ESI, DWORD PTR [ESP]
0084FCD0   52                   PUSH    EDX
0084FCD1   89E2                 MOV     EDX, ESP
0084FCD3   81C2 04000000        ADD     EDX, 0x4
0084FCD9   83C2 04              ADD     EDX, 0x4
0084FCDC   871424               XCHG    DWORD PTR [ESP], EDX
0084FCDF   5C                   POP     ESP
0084FCE0   E9 D182FFFF          JMP     00847FB6        ; VM_Entry
Stack:
        0012FF30   6F5187FA                             ; Key[/FONT]

某个JMP指令,或RET指令到本段代码的入口:0084FC64。到0084FCE0之前的代码属于膨胀变形,实际就一条指令"PUSH 6F5187FA"。
这时,显然Unvirtualize命令没法用。这里怎么让这个命令可用,留给大家去思考——很简单的!

简单说下VM_Entry的特征:
[FONT="Courier"]; RISC时
00847FB6   6A 00                PUSH    0x0             ; VM_ENTRY
...
00847FD6   9C                   PUSHFD
...
00847FF4   60                   PUSHAD
...
013C6476   61                   POPAD
013C6477   9D                   POPFD
013C6478   C3                   RETN                    ; VM_EXIT

; CISC时
0041F7FC    9C                  PUSHFD                  ; VM_1_ENTRY
...
00420593    61                  POPAD
00420594    E9 6BA20000         JMP     0042A804
...
0042A804    9D                  POPFD
0042A805  ^ E9 969EFFFF         JMP     004246A0
...
004246A0    C3                  RETN                    ; VM_1_EXIT[/FONT]

你会注意到,RISC一定以"PUSH 0"指令开始,接下来一定有个"PUSHFD";而CISC一定是直接从"PUSHFD"开始。
然后是"PUSHAD",但可能转变成好多条指令来完成,"PUSHAD"就消失了。
VM出口一定是"POPAD/POPFD/RETN",中间可能会有少量膨胀。
CISC的出口地址仅一个,而RISC可能有好几个。VM的出口可以通过VM的Busy寄存器清零来定位,Busy用于防止多线程时的重入(Thread-safe)。
这些东西看起来比较困难,其间夹杂着大量垃圾代码,参考插件生成的Risc_ZeroData.txt文件,比较清爽。

RISC和CISC相比,还有两点不同:1) 有Stack切换。2) VM_Context和RISC VM代码不在目标区段的内存段,所以在Dump一个TMD/WL RISC VM目标时需要补区段。
RISC的特征代码:
A. add esp,1ffc 栈切换后指向栈顶,栈的地址空间也位于另一个单独的内存段。
B. jmp  dword ptr [edi+XXX] 到VM_Context段代码。
C. jmp  dword ptr [esi] 到RISC VM段。
印象中LCF-AT的脚本是用这些特征来区分CISC和RISC的。

最后,重要的区别在于Key。
有个32位常数,它是目标被保护时随机生成的,在一个已被保护的目标中是固定的,又不同于其它目标。softworm称其为DeltaOffset,Deathway叫做Align。
在Oreans很常见的寻址方式"DWORD PTR [EBP+0xXXXXXXXX]"中,很容易在EBP找到这个值,如果对VM结构不熟悉的话。
在CISC中,PCODE的地址计算:pPCODE = Key + DeltaOffset(Align)
而在RISC中,Key为一个索引值,用它查表得到的值,加上DeltaOffset(Align)才得到pPCODE。
VM Handlers的入口地址,也是这样定位的。非常类似PE导入表(Import)的IAT,所以Deathway也把它称为CISC_Iat或RISC_Iat。

可见,Oreans的RISC实现远比CISC来得复杂。这也导致插件在处理RISC VM时,可能出现错误。
后来我发现是插件在处理"Zero area"的代码时,有些垃圾指令无法正确识别、过滤造成的。曾跟Deathway沟通过,那时他状态不好、很郁闷。现在的v1.8有改进,偶尔还是有问题。

我以前在论坛有两篇文章,也大致讲过插件怎么用,感兴趣的可找找看。
2014-7-11 14:42
0
雪    币: 135
活跃值: (63)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
默默感谢一下MistHill大牛的细心解答。

是这样的,我是准备读keygen diskgenius的帖子跟着学习使用插件的,但只能在虚拟机的xp下调试。先跟一下LCF-AT的脚本看看是怎么找oep的,可是tmd有反虚拟机的代码,shift F9跑不起来,只好先找一下反虚拟机的代码。不记得从哪儿开始跟踪还是从头开始(一直都在vm区段),就一直单步,一开始基本就是找一下比如VirtualAlloc之类函数,然后分配几个区间后面用。接着就是固定模式的花指令,还比较容易。还有几个检测设备的反调试,不过检测的是softice。虚拟机(vmware)的只找到一个anti

0121C121    05 6481F70D     add     eax, 0DF78164
0121C126    BB 65D48586     mov     ebx, 8685D465
0121C12B    BA 40B63400     mov     edx, 34B640
0121C130    81EA E85F3400   sub     edx, 345FE8
0121C136    ED              in      eax, dx
0121C137    81FB 68584D56   cmp     ebx, 564D5868


可是这个改了之后还是不能跑起来,我上网找in指令的时候发现了ldt,gdt等也可以反虚拟机。所以应该还有反调试,继续找。直到

012236DC    68 2C562B79     push    792B562C
012236E1  ^ E9 C7B8FFFF     jmp     0121EFAD
012236E6    68 D6EB0B62     push    620BEBD6
012236EB  ^ E9 BDB8FFFF     jmp     0121EFAD
012236F0    68 6C97FB49     push    49FB976C
012236F5  ^ E9 B3B8FFFF     jmp     0121EFAD
012236FA    68 5BA6F64D     push    4DF6A65B
012236FF  ^ E9 A9B8FFFF     jmp     0121EFAD
01223704    68 553F7412     push    12743F55
01223709  ^ E9 9FB8FFFF     jmp     0121EFAD

也就是我求助的位置,问题是这儿过不去,不知道跑完这些push jmp之后会到哪儿。
根据你的讲解,知道这是Risc,看了一下当时选的是Risc64。
我跟进去看了一下,跟softworm的经典教程差不多,

0121EFAD    6A 00           push    0
0121EFAF    9C              pushfd
0121EFB0    60              pushad
0121EFB1    E8 00000000     call    0121EFB6
0121EFB6    5D              pop     ebp
.....
0121EFD3    F0:8618         lock xchg byte ptr [eax], bl
0121EFD6    0ADB            or      bl, bl
0121EFD8    75 02           jnz     short 0121EFDC
0121EFDA    EB 0C           jmp     short 0121EFE8
.....
0121EFF1    8946 6C         mov     dword ptr [esi+6C], eax
0121EFF4    C74424 24 CB79D>mov     dword ptr [esp+24], 5D279CB
0121EFFC    016C24 24       add     dword ptr [esp+24], ebp
0121F000    61              popad
0121F001    9D              popfd
0121F002    C3              retn


计算一下几个值,ret到

01151DA9    8986 94000000   mov     dword ptr [esi+94], eax
01151DAF    8B4424 08       mov     eax, dword ptr [esp+8]
01151DB3    8986 A4000000   mov     dword ptr [esi+A4], eax
01151DB9    8B4424 0C       mov     eax, dword ptr [esp+C]
01151DBD    83C0 08         add     eax, 8
01151DC0    8986 AC000000   mov     dword ptr [esi+AC], eax
01151DC6    8B4424 10       mov     eax, dword ptr [esp+10]
01151DCA    8946 7C         mov     dword ptr [esi+7C], eax
01151DCD    8B4424 14       mov     eax, dword ptr [esp+14]
01151DD1    8986 8C000000   mov     dword ptr [esi+8C], eax
01151DD7    8B4424 18       mov     eax, dword ptr [esp+18]
01151DDB    8986 84000000   mov     dword ptr [esi+84], eax
01151DE1    8B4424 1C       mov     eax, dword ptr [esp+1C]
01151DE5    8946 74         mov     dword ptr [esi+74], eax
01151DE8    8B4424 20       mov     eax, dword ptr [esp+20]
01151DEC    8946 70         mov     dword ptr [esi+70], eax
01151DEF    66:8CC8         mov     ax, cs
.......
01151E34    8B4424 24       mov     eax, dword ptr [esp+24]
01151E38    8B76 68         mov     esi, dword ptr [esi+68]
01151E3B    83C6 08         add     esi, 8
01151E3E    E9 03000000     jmp     01151E46


保存寄存器和切换堆栈。

00A807D0    20E4            and     ah, ah
00A807D2    68 A60D0000     push    0DA6
00A807D7    20D8            and     al, bl
.....
00A8089B    8B33            mov     esi, dword ptr [ebx]             ; ebx = edi +0x44
00A8089D    5B              pop     ebx
00A8089E    83EC 04         sub     esp, 4
…..
00A808CB    870C24          xchg    dword ptr [esp], ecx
00A808CE    5C              pop     esp
00A808CF    C1E3 02         shl     ebx, 2
00A808D2    01DE            add     esi, ebx
00A808D4    FF26            jmp     dword ptr [esi]


00A808D4  - FF26            jmp     dword ptr [esi]

ds:[009600D4]=00A15A66

然后就是进入1-byte的handler,有一些混淆指令,这里还是能看清的,因为教程中讲过。
可是jmp到00A15A66就看不清了,因为包含了转移和混淆,

00A15A66    51              push    ecx
00A15A67    BD 6B310000     mov     ebp, 316B
00A15A6C    57              push    edi
00A15A6D    C1ED 02         shr     ebp, 2
00A15A70    BF 00000000     mov     edi, 0
00A15A75    0AC3            or      al, bl
00A15A77  ^ E9 4AACFBFF     jmp     009D06C6

009D06C6    89F9            mov     ecx, edi
009D06C8    33DD            xor     ebx, ebp
009D06CA    8B3C24          mov     edi, dword ptr [esp]
009D06CD    C0E2 05         shl     dl, 5
009D06D0    83C4 04         add     esp, 4
009D06D3    01F9            add     ecx, edi
009D06D5    21F8            and     eax, edi
009D06D7    8B31            mov     esi, dword ptr [ecx]
009D06D9    66:09D3         or      bx, dx
009D06DC    8B0C24          mov     ecx, dword ptr [esp]


这里看不清了,整理不了这些代码,以前整理过apsrotect的一个函数的一段混淆代码,几个小时都没整理清楚之后就放弃了。我想还是得用插件分析,但是苦于不会用,昨天找到你分享的themida 的sample,看完之后还是没懂。刚才想了一下,可能要关闭混淆的选项,因为handler里面还带混淆,应该是可以去掉的。顺带放一下加了themida的笔记本,我当时选的版本还是比较低的,1.8.0.0这个,softworm的教程也是这个版本。等下晚上我再试试找到跳到push jmp的位置unvirtualize。
上传的附件:
2014-7-11 16:35
0
雪    币: 135
活跃值: (63)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
谢谢指点,我尝试的时候似乎还是不行。
2014-7-11 16:39
0
游客
登录 | 注册 方可回帖
返回
//