能力值:
( LV2,RANK:10 )
|
-
-
151 楼
再支持一下,楼主新年快乐,支持。
|
能力值:
( LV2,RANK:10 )
|
-
-
152 楼
你的意思是类似OD RUN跟踪的功能?这个以后会做,但是最近应该不会加入,想记录转移和比较过程的话,用条件记录断点应该可以,下一版会加入的。找比较用的常量可以从转移往前看,在压入加密的转移地址之前应该有加法或与非指令,常量就是这些指令的一个操作数,如果隐藏常量可能要手动计算一下。
请问一下,如果是隐藏常量要如何计算。
|
能力值:
( LV8,RANK:130 )
|
-
-
153 楼
查找比较用的常量一般是从转移往上看,根据转移类型判断要比较的标志,看看标志是怎么来的。下面分析一个最简单的JNZ,只检查一个标志,选了隐藏常量,没有选检查虚拟机完整性,如果选检查虚拟机完整性的话解密常量时还会读取虚拟机引擎的一部分参与计算。
汇编代码
00401003 |. 817D 08 78563412 CMP DWORD PTR SS:[EBP+8],12345678
0040100A |. 75 07 JNZ SHORT chushihu.00401013
VMP代码,[EBP+8]=33333333
0040C4A6 |> BF vPopReg4 vR6
0040C4A5 |. 55 76620E68 vPushImm4 680E6276
0040C4A0 |. B8 vAdd4
0040C49F |. 7D vPopReg4 vR13
0040C49E |. 7C vPopReg4 vR9
0040C49D |. FD vPopReg4 vR15
0040C49C |. BD vPopReg4 vR14
0040C49B |. AD vPushReg4 vR14
0040C49A |. 31 vPushVEsp
0040C499 |. 60 vReadMemSs4
0040C498 |. 15 vNand4
0040C497 |. 3F vPopReg4 vR4
0040C496 |. 2B B074772E vPushImm4 2E7774B0
0040C491 |. 0F vNand4
0040C490 |. FC vPopReg4 vR11
0040C48F |. CF 4F8B88D1 vPushImm4 0D1888B4F
0040C48A |. AD vPushReg4 vR14
0040C489 |. 0F vNand4
0040C488 |. BE vPopReg4 vR2
0040C487 |. 15 vNand4
0040C486 |. 3F vPopReg4 vR4
0040C485 |. 3F vPopReg4 vR4
0040C484 |. FF vPopReg4 vR7
0040C483 |. BC vPopReg4 vR10
0040C482 |. FE vPopReg4 vR3
0040C481 |. 3D vPopReg4 vR12
0040C480 |. 7E vPopReg4 vR1
0040C47F |. BE vPopReg4 vR2
0040C47E |. 7F vPopReg4 vR5
0040C47D |. 7D vPopReg4 vR13
0040C47C |. FC vPopReg4 vR11
0040C47B |. 3E vPopReg4 vR0
0040C47A |. 2E vPushReg4 vR0
0040C479 |. 52 vPushVEsp
0040C478 |. 72 vReadMemSs4
0040C477 |. 12 vNand4
0040C476 |. 3C vPopReg4 vR8
0040C475 |. 2B F6810E76 vPushImm4 760E81F6
0040C470 |. 2B 6409093A vPushImm4 3A090964
0040C46B |. 91 vPushVEsp
0040C46A |. 60 vReadMemSs4
0040C469 |. 2B 0987F189 vPushImm4 89F18709
0040C464 |. CC 0C vPushImmSx1 0C
0040C462 |. 52 vPushVEsp
0040C461 |. A1 vAdd4
0040C460 |. 3C vPopReg4 vR8
0040C45F |. 95 vWriteMemSs4
0040C45E |. 31 vPushVEsp
0040C45D |. 24 vReadMemSs2
0040C45C |. 3C vPopReg4 vR8
0040C45B |. F2 2C vPopReg2 vR11W
0040C459 |. 70 vAdd4
0040C458 |. FC vPopReg4 vR11
0040C457 |. 12 vNand4
0040C456 |. FF vPopReg4 vR7
0040C455 |. 39 vPopfd
0040C454 |. EE vPushReg4 vR3
0040C453 |. 31 vPushVEsp
0040C452 |. 3C vPopReg4 vR8
0040C451 |. CF B422EB3A vPushImm4 3AEB22B4
0040C44C |. 2B 2020E830 vPushImm4 30E82020
0040C447 |. 2B 5E6DFA52 vPushImm4 52FA6D5E
0040C442 |. 5D 1C vPopReg2 vR7W
0040C440 |. 5D 34 vPopReg2 vR13W
0040C43E |. 55 87A9CBED vPushImm4 0EDCBA987 ; 解密12345678的常量
0040C439 |. CF ADEF6F01 vPushImm4 16FEFAD
0040C434 |. 31 vPushVEsp
0040C433 |. E7 vReadMemSs2
0040C432 |. 2B 06A84241 vPushImm4 4142A806 ; 解密12345678的常量
0040C42D |. 31 vPushVEsp
0040C42C |. 0D 06 vPushImmSx1 6
0040C42A |. 70 vAdd4
0040C429 |. 7D vPopReg4 vR13
0040C428 |. C8 vWriteMemSs4
0040C427 |. 40 0C vPopReg1 vR3B
0040C425 |. 15 vNand4 ; 4142A806 NAND EDCBA987 解密常量12345678
0040C424 |. FC vPopReg4 vR11
0040C423 |. 2C vPushReg4 vR8
0040C422 |. 0D 08 vPushImmSx1 8
0040C420 |. 70 vAdd4
0040C41F |. FE vPopReg4 vR3
0040C41E |. 87 vReadMemSs4 ; 参数 33333333
0040C41D |. 91 vPushVEsp
0040C41C |. 60 vReadMemSs4
下面开始比较,虚拟机中的减法操作
0040C41B |. 0F vNand4 ; NOT 33333333 = CCCCCCCC
0040C41A |. FE vPopReg4 vR3
0040C419 |. 70 vAdd4 ; CCCCCCCC + 12345678 = DF012344
0040C418 |. FE vPopReg4 vR3 ; 标志 296
0040C417 |. 31 vPushVEsp
0040C416 |. 60 vReadMemSs4
0040C415 |. B9 vNand4 ; NOT DF012344
0040C414 |. 3E vPopReg4 vR0 ; 标志 206
0040C413 |. FF vPopReg4 vR7
下面是组合标志
0040C412 |. EE vPushReg4 vR3
0040C411 |. B3 vPushVEsp
0040C410 |. 60 vReadMemSs4
0040C40F |. 12 vNand4 ; NOT 296 = FFFFFD69
0040C40E |. FF vPopReg4 vR7
0040C40D |. 35 01 vPushImm1 1
0040C40B |. 2F vPushReg4 vR4
0040C40A |. 11 00 vPushReg1 vR0B
0040C408 |. 2B F5FBFF7F vPushImm4 7FFFFBF5 ; 解密FFFFF7EA的常量
0040C403 |. 7B vPushVEsp
0040C402 |. 0D 06 vPushImmSx1 6
0040C400 |. 70 vAdd4
0040C3FF |. 7D vPopReg4 vR13
0040C3FE |. AB vWriteMemSs4
0040C3FD |. 31 vPushVEsp
0040C3FC |. 60 vReadMemSs4
0040C3FB |. 5D 34 vPopReg2 vR13W
0040C3F9 |. FF vPopReg4 vR7
0040C3F8 |. 83 vShl4 ; 常量FFFFF7EA
0040C3F7 |. FC vPopReg4 vR11
0040C3F6 |. 0F vNand4 ; FFFFFD69 NAND FFFFF7EA = 14
0040C3F5 |. 7D vPopReg4 vR13
0040C3F4 |. 2E vPushReg4 vR0
0040C3F3 |. 7B vPushVEsp
0040C3F2 |. D8 vReadMemSs4
0040C3F1 |. 12 vNand4 ; NOT 206 = FFFFFDF9
0040C3F0 |. FC vPopReg4 vR11
0040C3EF |. 55 EAF7FFFF vPushImm4 0FFFFF7EA ; 解密815的常量
0040C3EA |. AC vPushReg4 vR10
0040C3E9 |. E9 39 vPushReg1 vR14B
0040C3E7 |. 31 vPushVEsp
0040C3E6 |. 72 vReadMemSs4
0040C3E5 |. 40 1C vPopReg1 vR7B
0040C3E3 |. CF 60C44821 vPushImm4 2148C460 ; 解密815
0040C3DE |. 33 0C vPushImmSx1 0C
0040C3DC |. 31 vPushVEsp
0040C3DB |. 70 vAdd4
0040C3DA |. 3F vPopReg4 vR4
0040C3D9 |. 95 vWriteMemSs4
0040C3D8 |. 3F vPopReg4 vR4
0040C3D7 |. 15 vNand4 ; 解密常量815
0040C3D6 |. 7D vPopReg4 vR13
0040C3D5 |. 0F vNand4 ; FFFFFDF9 NAND 815 = 202
0040C3D4 |. FC vPopReg4 vR11
0040C3D3 |. B8 vAdd4 ; 202 + 14 = 216 比较的标志
下面是检查标志,生成转移目标
0040C3D2 |. 3F vPopReg4 vR4
0040C3D1 |. 7D vPopReg4 vR13
0040C3D0 |. 0F vNand4 ; 解密转移目标常量1
0040C3CF |. 3F vPopReg4 vR4
0040C3CE |. 2B 532BEB3A vPushImm4 3AEB2B53
0040C3C9 |. 2B 00036328 vPushImm4 28630300
0040C3C4 |. 0F vNand4 ; 解密转移目标常量2
0040C3C3 |. FE vPopReg4 vR3
0040C3C2 |. 31 vPushVEsp ; 保存转移目标的vESP
0040C3C1 |. DD D538 vPushImm2 38D5
0040C3BE |. 03 2FC7 vPushImm2 0C72F
0040C3BB |. 03 8EE1 vPushImm2 0E18E
0040C3B8 |. 5D 1C vPopReg2 vR7W
0040C3B6 |. 30 vAdd2
0040C3B5 |. FF vPopReg4 vR7
0040C3B4 |. 6D vPushReg4 vR13
0040C3B3 |. 31 vPushVEsp
0040C3B2 |. 72 vReadMemSs4
0040C3B1 |. 15 vNand4 ; NOT 216 = FFFFFDE9
0040C3B0 |. 3F vPopReg4 vR4
0040C3AF |. 2B D5AE94E7 vPushImm4 0E794AED5
0040C3AA |. 2C vPushReg4 vR8
0040C3A9 |. 31 vPushVEsp
0040C3A8 |. 86 vReadMemSs1
0040C3A7 |. 55 EA506B18 vPushImm4 186B50EA
0040C3A2 |. 0D 0A vPushImmSx1 0A
0040C3A0 |. 7B vPushVEsp
0040C39F |. 70 vAdd4
0040C39E |. FE vPopReg4 vR3
0040C39D |. 95 vWriteMemSs4
0040C39C |. 11 29 vPushReg1 vR10B
0040C39A |. 93 0C vPopReg2 vR3W
0040C398 |. F2 0C vPopReg2 vR3W
0040C396 |. 70 vAdd4 ; 解密常量 FFFFFFBF = NOT 40(ZF)
0040C395 |. FC vPopReg4 vR11
0040C394 |. 12 vNand4 ; 标志 AND 40(ZF)
0040C393 |. FF vPopReg4 vR7
0040C392 |. 53 vShr4 ; 右移4位,结果是0或4
0040C391 |. FC vPopReg4 vR11
0040C390 |. 70 vAdd4 ; 加上前面保存的vESP
0040C38F |. FE vPopReg4 vR3
0040C38E |. 60 vReadMemSs4 ; 读取解密前的转移目标
0040C38D |. 3F vPopReg4 vR4
0040C38C |. FC vPopReg4 vR11
0040C38B |. FC vPopReg4 vR11
0040C38A |. 2F vPushReg4 vR4
0040C389 |. 31 vPushVEsp
0040C388 |. 87 vReadMemSs4
0040C387 |. FC vPopReg4 vR11
0040C386 |. EA vPushVEsp
0040C385 |. 60 vReadMemSs4
0040C384 |. 12 vNand4
0040C383 |. BD vPopReg4 vR14
0040C382 |. 55 FCEAAB3A vPushImm4 3AABEAFC ; 最后的两个常量是解密转移目标
0040C37D |. 0F vNand4
0040C37C |. FE vPopReg4 vR3
0040C37B |. EC vPushReg4 vR11
0040C37A |. 55 031554C5 vPushImm4 0C5541503
0040C375 |. 0F vNand4
0040C374 |. 3F vPopReg4 vR4
0040C373 |. 0F vNand4
0040C372 |. 3F vPopReg4 vR4
0040C371 |. 3F vPopReg4 vR4
0040C370 |. AF vPushReg4 vR6
0040C36F |. AF vPushReg4 vR6
0040C36E |. AC vPushReg4 vR10
0040C36D |. 2D vPushReg4 vR12
0040C36C |. AE vPushReg4 vR2
0040C36B |. 6D vPushReg4 vR13
0040C36A |. 6F vPushReg4 vR5
0040C369 |. ED vPushReg4 vR15
0040C368 |. 2C vPushReg4 vR8
0040C367 |. 6D vPushReg4 vR13
0040C366 |. 6E vPushReg4 vR1
0040C365 |. 6C vPushReg4 vR9
0040C364 |. 2B 8A9DF197 vPushImm4 97F19D8A
0040C35F |. 70 vAdd4
0040C35E |. FE vPopReg4 vR3
0040C35D |. AF vPushReg4 vR6
0040C35C |. 2F vPushReg4 vR4
0040C35B |. 27 vJmp_0040AA56 ; JNZ chushihu.0040C1AF
这还是比较简单的,如果是需要检查多个标志的条件比如JG等,再加上检查虚拟机完整性,代码会很长。只要可以跳过检查标志的部分,往上看一下标志是怎么来的,一般都能找到比较的常量。现在静态分析手动计算常量的确有些麻烦,动态调试会好一些,在转移前往下跟一下,堆栈和寄存器里可以看到解密好的常量,解密常量的数一般都在前面不远。以后准备加入查找数据来源,可以选择一个指令的操作数,向前跟踪数据是如何生成的,如果是常量可以直接计算。
|
能力值:
( LV2,RANK:10 )
|
-
-
154 楼
顶上来~~~~~~
|
能力值:
( LV8,RANK:130 )
|
-
-
155 楼
测试了下,发现楼主确实强大,这个插件功能强大,OD界面设计的也很强大。。
提一点意见:
我觉得之所有要使用程序,就是为了避免人工手动的操作,所以,设计插件的很重要的一点是:
要尽最大可能的将伪指令缩减到最少,这样看起来就容易,简单明了。。
我觉得楼主既然做到能动态调试的话,就没什么必要将不会执行的分支伪指令代码也显示出来,这样的话,
里面的伪指令代码就太多。。这些不会执行的代码我们也不会想去看的,呵呵。。
总结: VMP的难点正如楼主说的不在于分析虚拟机,而在于对伪指令的最大化缩减,尽可能的压缩成有用的
代码,尽可能地接近于原始汇编代码。。
|
能力值:
( LV2,RANK:10 )
|
-
-
156 楼
这个一定要mark!!
|
能力值:
( LV8,RANK:130 )
|
-
-
157 楼
现在调试功能已经基本能用了,再往下做就是化简和还原,在这之前准备完善一下当前的功能。最近没有多少时间,等忙完了这一段把剩下的部分做出来,然后再往下做。下面准备添加一些小的功能,比如计算真实ESP、分析退出虚拟机的函数调用等,做到完全恢复程序结构。化简和还原我想做成通用的程序,其他的变形和虚拟也可以做很少的修改就能使用,往下做之前要重新设计和编写整个程序,可能要停很长一段时间了。
你说不显示不会执行的分支,我没看到VMP里有什么不会执行的分支啊,只有一个检查单步标志的分支一般不会执行,其他的就是使用变形+虚拟后产生的假分支了,只是把程序复制出来一份。如果要清除这样的分支的话,必须能检查出两个分支路径功能相同,即使化简后都是有难度的,而且执行时也有可能进入这样的分支,如果不显示调试时不是也看不到了吗。
|
能力值:
( LV2,RANK:10 )
|
-
-
158 楼
~~~~~~~~~~~~
|
能力值:
( LV2,RANK:10 )
|
-
-
159 楼
不顶不行啊~!感谢楼主分享
|
能力值:
( LV2,RANK:10 )
|
-
-
160 楼
实在是强大,只有膜拜,老大你是如何练成神功的~~~~~
|
能力值:
( LV2,RANK:10 )
|
-
-
161 楼
先支持,再慢慢看。
|
能力值:
( LV2,RANK:10 )
|
-
-
162 楼
不得不顶得帖子
|
能力值:
( LV2,RANK:10 )
|
-
-
163 楼
沉下去了,楼主什么时候要更新,期待中。
|
能力值:
( LV2,RANK:10 )
|
-
-
164 楼
这个DLL还没实验过 拿来学习 谢谢
|
能力值:
(RANK:260 )
|
-
-
165 楼
看来VMP的时日也无多了
|
能力值:
( LV2,RANK:10 )
|
-
-
166 楼
楼主这么牛,你叫我这等菜鸟情以何堪。
|
能力值:
( LV6,RANK:90 )
|
-
-
167 楼
可累死了...分析一下用了半小时....
05F340E0 分析虚拟程序,从地址5F340E0开始...
开始反汇编虚拟程序入口...
反汇编虚拟程序入口完成
开始查找初始vEIP...
10032004 初始vEIP(重定位前):10032004
开始分析初始堆栈...
05F31A3D vESP+0:重定位=F5F30000
05F31A2E vESP+4:EFL
05F31A17 vESP+8:EDX
05F31A11 vESP+C:EBP
05F31493 vESP+10:EDI
05F31171 vESP+14:ECX
05F31166 vESP+18:ESI
05F3115B vESP+1C:EBX
05F31C2E vESP+20:EBX
05F31C26 vESP+24:EAX
05F340E5 vESP+28:返回地址=5F340EA
05F340E0 vESP+2C:vEIP
分析初始堆栈完成
开始反汇编虚拟程序...
反汇编完成,3个指令块,1034个指令
开始检查程序结构...
检查完成,没有错误
开始分析...
分析数据...
分析数据完成
分析无效指令...
分析无效指令完成
化简有效常量12个
识别无效指令297个
识别计算常量指令89个
化简率37.33%
分析完成
05F340E0 分析虚拟程序完成,用时1596.78秒
|
能力值:
( LV2,RANK:10 )
|
-
-
168 楼
原来是这个插件的使用分析,牛逼呀
|
能力值:
( LV2,RANK:10 )
|
-
-
169 楼
分析VMP的利器,当强贴出现时,VMP分析又前了一步;个人前进一小步,逆向前进一大步;支持!
|
能力值:
( LV7,RANK:110 )
|
-
-
170 楼
非常谢谢 只能说强悍
|
能力值:
( LV2,RANK:10 )
|
-
-
171 楼
mark一下。
|
|
|