能力值:
( LV2,RANK:10 )
|
-
-
76 楼
膜拜。。。
|
能力值:
( LV8,RANK:120 )
|
-
-
77 楼
感谢两位的解答,
|
能力值:
( LV8,RANK:130 )
|
-
-
78 楼
因为插入指令会生成一些转移,和VMP的转移目标计算方法不一样,插件不知道目标,所以无法继续分析,最好先分析虚拟程序,插入后就不要再分析了。新版的vPushReg4和vPopReg4有变化,可以试试把特征中的AND AL,3C去掉,指令数据改为寄存器(不是原来的操作码包含寄存器),如果还不行的话就自己看看指令是怎么实现的,也许是我没遇到过的版本。
|
能力值:
( LV7,RANK:100 )
|
-
-
79 楼
牛精强啊牛精强,膜拜~!感觉这是俺懂上看雪以来最最最最详细的分析文章了,继续膜拜下。。
|
能力值:
( LV3,RANK:20 )
|
-
-
80 楼
但是指令名字不能改吧?比如vPushReg4不能改为vPushReg4a,否则分析的时候就不识别了。这样的话在未来如果vmp出现新指令还能扩展吗?
特征是能够识别的出vPushReg4和vPopReg4的只是后面的操作寄存器识别不出。我自己分析出来了以后怎么告诉插件呢?
|
能力值:
( LV8,RANK:130 )
|
-
-
81 楼
部分重要指令插件硬编码了名字,不能修改,修改不重要的指令名字或添加新指令是没问题的,一般VMP中不会出现多个相同功能的指令,所以可以用原来的名字,修改指令信息。识别不出寄存器是什么情况,寄存器不正确?这个怀疑是指令信息中的指令数据没有填写正确,你在菜单里选打开虚拟指令窗口找到那个指令,看看怎么实现的,旧版本是
005C0388 /SUB AL,0EC ; vPopReg4
005C0398 |NOT AL
005C039F |NEG AL
005C03A7 |AND AL,3C
005C03AF |MOV EDX,DWORD PTR SS:[EBP]
005C03C3 |ADD EBP,4
005C03C7 \MOV DWORD PTR DS:[EAX+EDI],EDX
其中解密部分可能不同,这是直接从操作码中取出寄存器索引,所以指令信息中的指令数据应该选操作码包含寄存器,新版变成了从数据中取寄存器索引,像这样
005B4227 /MOVZX EAX,BYTE PTR DS:[ESI-1] ; vPopReg4
005B4230 |XOR AL,BL
005B4237 |NEG AL
005B423E |SUB AL,86
005B4243 |ROR AL,5
005B4250 |XOR BL,AL
005B4259 |MOV EDX,DWORD PTR SS:[EBP]
005B425E |ADD EBP,4
005B4960 |DEC ESI
005B4962 \MOV DWORD PTR DS:[EAX+EDI],EDX
指令信息中的指令数据要选寄存器,数据长度选BYTE。
|
能力值:
( LV3,RANK:20 )
|
-
-
82 楼
指令数据有改成寄存器,部分vPopReg4和vPushReg4能够识别,但是分析虚拟程序的时候在log里看到xx地址算法分析失败,我就直接跳过去,发现失败的地方存在一些vPopReg4 ??,所以推断是因为vPopReg4寄存器未识别出导致的算法分析失败,等我回去了看看具体怎么寄存器解密的再来汇报,谢谢zdhysd耐心回答
另外插件在原版od和ollyice里虚拟机调试单步每次都会闪一下,并且退出最大化,在另一个终结者版本运行良好,原因不明。。
|
能力值:
( LV8,RANK:130 )
|
-
-
83 楼
那就不知道怎么回事了,你看看指令怎么实现的吧,也许是不同版本的VMP。我用原版od不会闪啊,由于中断时od会自动设置焦点到cpu窗口,插件拦截了od的setcpu函数禁止设置焦点,可能有些版本没处理好。
|
能力值:
( LV3,RANK:20 )
|
-
-
84 楼
是的,闪就是因为会自动切换焦点到反汇编窗口,然后再切回来,难道和其他插件冲突了导致的吗,我去试试
找到原因了。和Olly Advanced的Flexible Breakpoints选项冲突了
|
能力值:
( LV3,RANK:30 )
|
-
-
85 楼
make
|
能力值:
( LV2,RANK:10 )
|
-
-
86 楼
强劲啊,作者!
|
能力值:
( LV2,RANK:10 )
|
-
-
87 楼
膜拜,忍着头晕还是看完了
|
能力值:
( LV2,RANK:10 )
|
-
-
88 楼
太厉害了,拜师了
|
能力值:
( LV2,RANK:10 )
|
-
-
89 楼
mark一下,学习crack
|
能力值:
( LV2,RANK:10 )
|
-
-
90 楼
mark,慢慢看
|
能力值:
( LV4,RANK:50 )
|
-
-
91 楼
膜拜下,慢慢看
|
能力值:
( LV3,RANK:35 )
|
-
-
92 楼
非常感谢大牛分享软件给小菜学习!
|
能力值:
( LV6,RANK:90 )
|
-
-
93 楼
|
能力值:
( LV3,RANK:20 )
|
-
-
94 楼
想请教一下后续版本增加的真实ESP寄存器代表什么?有什么相关功能?我看和非虚拟机中的esp并不相等
|
能力值:
( LV8,RANK:130 )
|
-
-
95 楼
是加密前的ESP,但是分析不一定完全正确,因为真实ESP在虚拟机中已经没有用了,一般应该差不多,如果中间有调用而且分析提示没填正确的话肯定是错的,虚拟+变形时也是错的,因为变形插入的垃圾指令会改变ESP,其他情况应该基本正确。
|
能力值:
( LV3,RANK:20 )
|
-
-
96 楼
也就是说这个ESP寄存器没有实际用途喽?还想请教一下我看分析的时候比如说有一个最终表达式为v22 = 0fffffff8 ,而实际上v22代表的是18ff98,是一个堆栈中的临时变量,用于接收多个返回值api。这是分析有误,还是代表相对于某个地址堆栈的相对偏移?如果是有误的话我应该填写怎样的分析提示呢?
|
能力值:
( LV8,RANK:130 )
|
-
-
97 楼
真实ESP在虚拟机中用处不大,仅作参考,比如看看函数参数的位置之类的,不一定完全准确。你那个18ff98是一个堆栈中的地址吧,看看v22的数据类型是不是vESP,由于每次进入函数时ESP可能不同,插件使用偏移来表示堆栈中的地址,函数开始时vESP为0,0fffffff8表示开始时的vESP-8。
|
能力值:
( LV3,RANK:20 )
|
-
-
98 楼
v22的数据类型确实是vEsp,进入函数Esp加上偏移就是18ff98,明白啦,谢谢
|
能力值:
( LV2,RANK:10 )
|
-
-
99 楼
请教一下,有个地方不太懂:
大部分寄存器都和虚拟程序开始时相同,没有被改变,先拿EAX计算一下,EAX被写入堆栈的地址是-0C4,vJmp执行前vESP是-0E8,执行后会把栈顶的转移目标弹出,变成-0E4,这就是被调用函数执行时的vESP,-0C4 - -0E4 = 20,说明EAX在初始堆栈中的位置是20,添加提示initReg(eax,20),其他寄存器按相同方法计算。
全部提示为/*initReg(eax,20);initReg(ecx,28);initReg(edx,8);initReg(ebx,1C);initReg(ebp,10);initReg(edi,14);initReg(esi,18)*/
这句应该添加到哪里??
是在004C3918 |. 83 vJmp_00425E0A
还是004B77D0 /$ A2 vPopReg4 vR10 ; /*esp(8); arg(1); regModify(eax)*/
还是initReg(eax,20)逐个添加到004C3929 |. 8C vPushReg4 vR3 堆栈-0C4:(寄存器)EAX
都尝试过添加..再分析..但后面的entryVMxxx仍然存在..
|
能力值:
( LV8,RANK:130 )
|
-
-
100 楼
填到被调用函数第一条指令,就是4B77D0,填完后再重新分析就只有entryVMEfl_4D6C58和entryVMEax_4D6C58了。efl是标志不用管它,eax因为被改变了(被调用函数设了regModify(eax)),但是不知道改变值,所以也是未知的,可以给它设一个已知的值,比如regModify(eax, "发现调试器"),后面就不会再这样显示了。
|
|
|