能力值:
(RANK:550 )
|
-
-
2 楼
感谢参与 其实是个人认为到目前为止逆向的最出色的一份答案 不过请再检查一下正确性
|
能力值:
( LV9,RANK:330 )
|
-
-
3 楼
|
能力值:
(RANK:350 )
|
-
-
4 楼
活动结束,答案移出来了。
具体参考活动发起帖:http://bbs.pediy.com/showthread.php?t=192742
|
能力值:
(RANK:1130 )
|
-
-
5 楼
牛X,连明文字符串都逆出来了
|
能力值:
( LV8,RANK:130 )
|
-
-
6 楼
这个答案有点假,原始编译后的bin更本就没出现过这些字符,我想知道他是怎么知道的
还有那个乘法常量,一般人看到都会用 CEBEA6DA, 他居然用源码一样的常量,
别告诉我你对编译器的优化了如指掌
|
能力值:
(RANK:550 )
|
-
-
7 楼
cqccqc能否将分析思路、过程作个简单说明,以正视听呢?
|
能力值:
(RANK:215 )
|
-
-
8 楼
关注此贴,膜拜大牛,看结果
|
能力值:
( LV9,RANK:330 )
|
-
-
9 楼
我Hook了VM_Dispatcher的retn const
0040BA98 66:55 push bp
0040BA9A FF7424 01 push dword ptr [esp+0x1]
0040BA9E 53 push ebx
0040BA9F FF7424 0E push dword ptr [esp+0xE] ; 在这Hook可以通过edx判断handler
0040BAA3 C2 1200 retn 0x12 ; JmpHandler
记录了 虚拟机的流程和数据
(吐槽:计算长度为8的字符串,执行了28w行VM伪指令)
0042F98C vAdd4 ;60EE5178+9F552259=004373D1
0042F98B vPopReg4 ;vReg_BC=00000217
0042F989 vPushReg4 ;vReg_38=00000000
0042F987 vAdd4 ;00000000+004373D1=004373D1
0042F986 vPopReg4 ;vReg_8=00000206
0042F984 vReadMemDs4 ;[004373D1]=D21F95B2
0042F983 vAdd4 ;D21F95B2+FC9F1128=CEBEA6DA
0042F982 vPopReg4 ;vReg_18=00000283
0042F980 vPushReg4 ;vReg_F4=FFFFFFA6
0042F97E vImul4 ;(FFFFFFA6*CEBEA6DA)=(CEBEA691 50F9575C
0042F97D vPopReg4 ;vReg_B4=00000A07
0042F97B vPopReg4 ;vReg_78=00000011
然后接下来就是人工分析数据了
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
这个人牛X,和源码差不多。
|
能力值:
( LV8,RANK:130 )
|
-
-
11 楼
[QUOTE=cqccqc;1322152]我Hook了VM_Dispatcher的retn const
0040BA98 66:55 push bp
0040BA9A FF7424 01 push dword ptr [esp+0x1]
0040BA9E 53 ...[/QUOTE]
这些无关痛痒,关键是那2个字符串是怎么来的
而且那个2个字符的计算更本不在输入的字符串循环里面
|
能力值:
( LV9,RANK:270 )
|
-
-
12 楼
牛X,赞一个。
Log了那么多数据,明文应该可以找到!
|
能力值:
( LV8,RANK:130 )
|
-
-
13 楼
你认为会出现明文吗!!!!
|
能力值:
( LV9,RANK:330 )
|
-
-
14 楼
字符串明文倒是没有
这是一开始分析的结果
key6=~(key6^szKey[i]^('A'+i));//'A'=0x41
当I=0;
key6=~(key6^0x15^(0x41+0));
即
key6=~(key6^0x54);//'T'=0x54
当I=1;
key6=~(key6^0x30^(0x41+1));
即
key6=~(key6^0x72);//'r'=0x72
|
能力值:
( LV8,RANK:130 )
|
-
-
15 楼
[QUOTE=cqccqc;1322172]字符串明文倒是没有
这是一开始分析的结果
92764
key6=~(key6^szKey[i]^('A'+i));//'A'=0x41
当I=0;
key6=~(key6^0x15^(0x41+0));
即
key6=~(key6^0x54);//'T'=0x54
当I=...[/QUOTE]
我只能HEHE了
|
能力值:
( LV4,RANK:50 )
|
-
-
16 楼
群里的来顶一下,尼玛你趴了一个国庆不来开黑,说好的拿肾呢。
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
群里的来顶一下,尼玛你趴了一个国庆不来开黑,说好的拿肾呢。
|
能力值:
( LV4,RANK:50 )
|
-
-
18 楼
复制粘贴可耻 你个土豪肾6看都不看一眼的
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
群里的来顶一下,尼玛你趴了一个国庆不来开黑,说好的拿肾呢。
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
不要醉啊 女人 我穷得要死要死的
|
能力值:
( LV9,RANK:270 )
|
-
-
21 楼
呵呵,我当然不指望在VM的流程里会“出现”完整的明文,我说的是“找”!
事实上,在察觉那些个参与运算的值(即hawking源码ReverseMe.cpp里的xorkey[]和subkey[]数组)是无规律地变化时,曾打算去“找”的。
这时注意到,VM的栈(EBP指针)靠近栈底的部分,数组值已经全部“出现”了。
以xorkey[]数组为例,源码里只是一个简单的异或:
[FONT="Courier"]char T r e a d S t o n e
ASCII 54 72 65 61 64 53 74 6F 6E 65
^ 41 42 43 44 45 46 47 48 49 4A
= 15 30 26 25 21 15 33 27 27 2F[/FONT]
即第四行的内容是大家都可以“看到”的。我就偷懒不再往回“找”了:确定是来自PCODE里硬编码的立即数还是某些运算的结果,只需验证一下拿来用就好。
这样做的弊病是只知道表面,不能还原真实算法;好处是能够较快得到答案。
cqccqc比我们前进了一步,认真地去“找”了!
这并不容易,因为PCODE里的垃圾指令比Handlers里的“花”多了不只一两个数量级,加上VM指令的低效,Log量会非常大,还要从中找出关键数据进行分析才能得出结论!
顺便请教一下hawking版主:TreadStone是否支持多线程?恕我愚钝,看得也不仔细。
|
能力值:
( LV3,RANK:30 )
|
-
-
22 楼
28w行VM伪指令
如何人工分析?
|
能力值:
(RANK:550 )
|
-
-
23 楼
[QUOTE=MistHill;1322367]呵呵,我当然不指望在VM的流程里会“出现”完整的明文,我说的是“找”!
事实上,在察觉那些个参与运算的值(即hawking源码ReverseMe.cpp里的xorkey[]和subkey[]数组)是无规律地变化时,曾打算去“找”的。
这时注意到,VM的栈(EBP指针)靠近栈底的部分,数组值已...[/QUOTE]
TreadStone是支持多线程的
|
能力值:
( LV2,RANK:10 )
|
-
-
24 楼
我来zkanxa
我来看学习一下
|
能力值:
( LV4,RANK:50 )
|
-
-
25 楼
膜拜牛X,学习了~
|
|
|