首页
社区
课程
招聘
[原创]e族百变桌面
发表于: 2007-6-4 21:32 6766

[原创]e族百变桌面

2007-6-4 21:32
6766
e族百变桌面
kflnig[狂枫]
       本来以为碰到一个有点难度的软件了,谁知!……
       [作者声明]:此文只为交流知识而生。
       [作者求助]:
感谢她,戴菁鸣,是她带我走出生活的阴影,使我这些天创作颇丰,我要让她成为最幸福的女孩!
       这个东西的算法我看了好一会儿才得出一个结论。有点hard。而且,还有一点,这个软件的字符串太明显了。我就是顺着这条路到罗马的。
       而且我也不知道,这个软件注册和非注册到底有什么区别。根本就是一样。我开始觉得我是被忽悠了,可是后来看看,好像还不是。
       但要夸奖一点的是,这个软件除了cpu占用率和内存占用率大了一点以外,没有什么明显的缺点。
       PEID说:Borland Delphi 6.0 - 7.0
       简直太棒了,我是壳盲!DEDE分析register历然在目,DEDE输出一张mapOD
       OD载入运行。授权码中输入:123789ODapibreak插件下万能断点。
00590635 >|.  8B83 FC030000 MOV EAX,DWORD PTR DS:[EBX+3FC]     ;  *edtSN:TEdit
0059063B  |.  E8 987AECFF   CALL ePaper.004580D8
00590640  |.  C783 24040000>MOV DWORD PTR DS:[EBX+424],2
0059064A  |.  EB 0A         JMP SHORT ePaper.00590656
0059064C  |>  C783 24040000>MOV DWORD PTR DS:[EBX+424],6
00590656  |>  8BC3          MOV EAX,EBX
00590658  |.  E8 33FCFFFF   CALL ePaper.00590290
0059065D  |.  E9 DC000000   JMP ePaper.0059073E
00590662  |>  8D55 F8       LEA EDX,DWORD PTR SS:[EBP-8] ;  Case 2 of switch 005905F8
00590665 >|.  8B83 00040000 MOV EAX,DWORD PTR DS:[EBX+400]     ;  *edtRN:TEdit
0059066B  |.  E8 387AECFF   CALL ePaper.004580A8
00590670  |.  837D F8 00    CMP DWORD PTR SS:[EBP-8],0
00590674  |.  75 0C         JNZ SHORT ePaper.00590682
       取消万能断点,经过一段典型的DELPHI代码之后,出来到——>00590670
       从这里我们看注释,两个TEDIT控件就是如图1的两个机器码和授权码的控件。


1
所以大概这里就接近于关键的地方了。
       有了DEDE输出的那张map,信息窗口中又多了一点信息。
堆栈 SS:[0012FB14]=01CBB7A0, (ASCII "123789")
ePaper.<-TRegisterForm@btnNextClick+0B4
上面一条是原来就是有的,下面一条归功于DEDE。这更加坚定了我们认为这里是关键的地方,我们本来就是点击了“下一步”这个按键来到输入序列号的地方的。
上面比较序列号长度是否为0,为零则说:
反正我是输入了123789了。
00590682  |> \8BC3          MOV EAX,EBX<——序列号不为0则来到这里
00590684  |.  E8 EBFDFFFF   CALL ePaper.00590474
00590689  |>  83BB 24040000>CMP DWORD PTR DS:[EBX+424],5
00590690  |.  75 22         JNZ SHORT ePaper.005906B4
00590692  |.  8D4D F4       LEA ECX,DWORD PTR SS:[EBP-C]
00590695  |.  A1 D4E45900   MOV EAX,DWORD PTR DS:[59E4D4]
0059069A  |.  8B00          MOV EAX,DWORD PTR DS:[EAX]
0059069C  |.  BA 90075900   MOV EDX,ePaper.00590790  ;  ASCII "reg_code_err"
005906A1 >|.  E8 EAF9F3FF CALL ePaper.004D0090;  ->:TXmlSettings._PROC_004D0090()
005906A6  |.  8B55 F4       MOV EDX,DWORD PTR SS:[EBP-C]
005906A9 >|.  8B83 BC030000 MOV EAX,DWORD PTR DS:[EBX+3BC] ;  *lblReason:TLabel
005906AF  |.  E8 247AECFF   CALL ePaper.004580D8
005906B4  |>  33D2          XOR EDX,EDX
005906B6 >|.  8B83 F0030000 MOV EAX,DWORD PTR DS:[EBX+3F0]  ;  *btnPrev:TButton
005906BC  |.  8B08          MOV ECX,DWORD PTR DS:[EAX]
005906BE  |.  FF51 68       CALL DWORD PTR DS:[ECX+68]
005906C1  |.  33D2          XOR EDX,EDX
005906C3 >|.  8B83 F8030000 MOV EAX,DWORD PTR DS:[EBX+3F8]  ;  *btnNext:TButton
       我们主要看注释对应看序列号错误的对话框,图2

2
       E文的好处就在这里
reg_code_err:输入的注册码不正确
lblReason:TLabel:原因
btnPrev:TButton:上一步
btnNext:TButton:下一步
所以这里我们一定要跳。
00590690  |.  75 22         JNZ SHORT ePaper.005906B4
这样就没有错误也没有什么原因了。^_^
也就是毫无疑问这里是关键了。00590684  |.  E8 EBFDFFFF   CALL ePaper.00590474
这里顺便谈谈DELPHI常常会有的特征:
00590474   $  55            PUSH EBP
00590475   .  8BEC          MOV EBP,ESP
00590477   .  83C4 E4       ADD ESP,-1C
0059047A   .  53            PUSH EBX
0059047B   .  56            PUSH ESI
0059047C   .  57            PUSH EDI
0059047D   .  33D2          XOR EDX,EDX
0059047F   .  8955 E4       MOV DWORD PTR SS:[EBP-1C],EDX
00590482   .  8955 E8       MOV DWORD PTR SS:[EBP-18],EDX
00590485   .  8955 EC       MOV DWORD PTR SS:[EBP-14],EDX
00590488   .  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX
0059048B   .  33C0          XOR EAX,EAX
如果你误以为上面这些也都是有用的话,那么你惨了。你随便反汇编一个DELPHI的软件,都会发现这些东西。
看下面
005904B3   .  E8 F07BECFF   CALL ePaper.004580A8
005904B8   .  8B45 EC       MOV EAX,DWORD PTR SS:[EBP-14]      ;  serial address
005904BB   .  E8 90A6E7FF   CALL ePaper.0040AB50
005904C0   .  8945 F0       MOV DWORD PTR SS:[EBP-10],EAX      ;  string to hex
005904C3   .  8955 F4       MOV DWORD PTR SS:[EBP-C],EDX
005904C6   .  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
005904C9   .  FFB0 1C040000 PUSH DWORD PTR DS:[EAX+41C]
005904CF   .  FFB0 18040000 PUSH DWORD PTR DS:[EAX+418]
005904D5   .  FF75 F4       PUSH DWORD PTR SS:[EBP-C]
005904D8   .  FF75 F0       PUSH DWORD PTR SS:[EBP-10]
005904DB   .  B0 01         MOV AL,1
005904DD   .  E8 BEF6FFFF   CALL ePaper.0058FBA0
005904E2   .  8B15 E0E15900 MOV EDX,DWORD PTR DS:[59E1E0]  ;  ePaper.005A2C00
005904E8   .  8802          MOV BYTE PTR DS:[EDX],AL
005904EA   .  A1 E0E15900   MOV EAX,DWORD PTR DS:[59E1E0]
005904EF   .  8038 00       CMP BYTE PTR DS:[EAX],0
005904F2   .  74 53         JE SHORT ePaper.00590547
这里很重要,为什么呢?因为在这个call中,只有005904F2这个跳转,而且幅度还挺大,所以有货,
005904B3   .  E8 F07BECFF   CALL ePaper.004580A8
005904B8   .  8B45 EC       MOV EAX,DWORD PTR SS:[EBP-14];  serial address
005904BB   .  E8 90A6E7FF   CALL ePaper.0040AB50
005904C0   .  8945 F0       MOV DWORD PTR SS:[EBP-10],EAX ; string to hex也说明了序列号必须小于0xFFFFFFFF。否则就结构化异常了。
这边的两个call,看我加的注释,所以说它们已经开始把序列号翻来倒去的了,所以005904DD   .  E8 BEF6FFFF   CALL ePaper.0058FBA0
这个call,我怀疑……
进去。
里面是一个比较小的call,突然眼睛一亮
0058FC0D  |.  BA 74FC5800   MOV EDX,ePaper.0058FC74           ;  ASCII "RegCode"
好像这一趟不是白来。看这里:
0058FBC6  |.  E8 B1000000   CALL ePaper.0058FC7C
0058FBCB  |.  3B55 0C       CMP EDX,DWORD PTR SS:[EBP+C]
0058FBCE  |.  75 07         JNZ SHORT ePaper.0058FBD7
0058FBD0  |.  3B45 08       CMP EAX,DWORD PTR SS:[EBP+8]
0058FBD3  |.  75 02         JNZ SHORT ePaper.0058FBD7
0058FBD5  |.  B3 01         MOV BL,1
0058FBD7  |>  845D FF       TEST BYTE PTR SS:[EBP-1],BL
0058FBDA  |.  74 44         JE SHORT ePaper.0058FC20
最后一个JE比较狠毒,如果跳了,那么,一切就完了,因为跨度很大,而且跳出了我注册表的处理(看注释就知道了)。进入0058FBC6这个call
是不是很累啊,我也是。
0058FCBA  |.  8B45 FC          MOV EAX,DWORD PTR SS:[EBP-4]<——出现了机器码
0058FCBD  |.  85C0             TEST EAX,EAX
0058FCBF  |.  74 05            JE SHORT ePaper.0058FCC6
当然是在比较机器码是否为0当然是废话。这里突然看到了我们平时不常看到的浮点运算。我的天啊!对于这个我也是浮点盲。而且,里面还是比较的复杂。
0058FCD1  |> /8D45 DC          /LEA EAX,DWORD PTR SS:[EBP-24]
;等价于mov eax,ebp-24
0058FCD4  |. |8B55 FC          |MOV EDX,DWORD PTR SS:[EBP-4];机器码所在位置
0058FCD7  |. |0FB65432 FF      |MOVZX EDX,BYTE PTR DS:[EDX+ESI-1];
按顺序依次取机器码
0058FCDC  |. |E8 1F58E7FF      |CALL ePaper.00405500
0058FCE1  |. |8B45 DC          |MOV EAX,DWORD PTR SS:[EBP-24]
0058FCE4  |. |E8 E7C9E7FF      |CALL ePaper.0040C6D0
0058FCE9  |. |DB2D BCFD5800    |FLD TBYTE PTR DS:[58FDBC]
0058FCEF  |. |DEC9             |FMULP ST(1),ST
0058FCF1  |. |E8 4638E7FF      |CALL ePaper.0040353C
0058FCF6  |. |3345 E0          |XOR EAX,DWORD PTR SS:[EBP-20]
0058FCF9  |. |3355 E4          |XOR EDX,DWORD PTR SS:[EBP-1C]
0058FCFC  |. |81F0 70B8EF1B    |XOR EAX,1BEFB870
0058FD02  |. |81F2 00000000    |XOR EDX,0;这句不知道来干什么,没用。
0058FD08  |. |85D2             |TEST EDX,EDX
0058FD0A  |. |7D 07            |JGE SHORT ePaper.0058FD13
0058FD0C  |. |F7D8             |NEG EAX
0058FD0E  |. |83D2 00          |ADC EDX,0
0058FD11  |. |F7DA             |NEG EDX
0058FD13  |> |0345 E0          |ADD EAX,DWORD PTR SS:[EBP-20]
0058FD16  |. |1355 E4          |ADC EDX,DWORD PTR SS:[EBP-1C]
0058FD19  |. |8945 E0          |MOV DWORD PTR SS:[EBP-20],EAX
0058FD1C  |. |8955 E4          |MOV DWORD PTR SS:[EBP-1C],EDX
0058FD1F  |. |46               |INC ESI
0058FD20  |. |4B               |DEC EBX
0058FD21  |.^\75 AE            \JNZ SHORT ePaper.0058FCD1
一个大循环EBX控制着循环次数,根据机器码的位数而定。上面就是在根据机器码推第一级注册码。我的机器码是:64733192
这里这个家伙还应用了一个常量3.1415926535897932380 ;CONST PI
我们看到里面有很多的[EBP-24], [EBP-20], [EBP-1C], [EBP-4]等,我们不妨把它们想象成数组,int sz[7]。基于DELPHI ,的string变量的特殊性。它在计算长度的时候就是
0058FCC1  |.  83E8 04          SUB EAX,4
0058FCC4  |.  8B00             MOV EAX,DWORD PTR DS:[EAX]
这么两句就行了,因为它在第一个数组元素的值即是长度。经过OD调试发现FLD是一条压栈语句,而FMULP ST(1),ST是计算
st1)=st1)×st
然后整个浮点栈中的数据上升一位。如st0st1st1st2……依次类推。最后一个变成empty
上面是最最重要的部分,另外的只要你看得懂浮点运算,那么就很简单了。看到下面这两句,有什么感想
0058FD13  |> |0345 E0          |ADD EAX,DWORD PTR SS:[EBP-20]
0058FD16  |. |1355 E4          |ADC EDX,DWORD PTR SS:[EBP-1C]
一个典型的__int64 类型的变量加法操作。总结一下上面代码的作用,我们要假设有一个地值为定值,设其为addr。描述一下就是:
[addr]=0
for (num=1;num<=8;num++)
{
       eax=round(pi*int[num])
XOR EAX,1BEFB870
[addr]=eax +[addr]
}
很简单是吧
我的经上面计算之后我的第一级序列号是:52010400374
下面还有一个循环,很无聊,可能是delphi的库函数。因为写得不按常人的思维写的。
0058FD4E  |> /8B5D FC       /MOV EBX,DWORD PTR SS:[EBP-4]
0058FD51  |. |85DB          |TEST EBX,EBX
0058FD53  |. |74 05         |JE SHORT ePaper.0058FD5A
0058FD55  |. |83EB 04       |SUB EBX,4
0058FD58  |. |8B1B          |MOV EBX,DWORD PTR DS:[EBX]
0058FD5A  |> |8D45 F4       |LEA EAX,DWORD PTR SS:[EBP-C]
0058FD5D  |. |50            |PUSH EAX
0058FD5E  |. |8BCB          |MOV ECX,EBX
0058FD60  |. |8BD6          |MOV EDX,ESI
0058FD62  |. |8B45 F8       |MOV EAX,DWORD PTR SS:[EBP-8]
0058FD65  |. |E8 E25AE7FF   |CALL ePaper.0040584C;重点在call
0058FD6A  |. |4E            |DEC ESI
0058FD6B  |. |8B45 F4       |MOV EAX,DWORD PTR SS:[EBP-C]
0058FD6E  |. |8038 30       |CMP BYTE PTR DS:[EAX],30
0058FD71  |.^\74 DB         \JE SHORT ePaper.0058FD4E
这里的作用是把序列号cut到和机器码一样长。如果要分析也很容易,我略过了。
所以我的序列号是:10400374
这个软件最大的bug就是这个软件的注册码是以明码形式出现的,而且字符串泄密太多。太简单了。

[课程]Android-CTF解题方法汇总!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (6)
雪    币: 471
活跃值: (3718)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
2
不错的分析,学习之
2007-6-4 21:52
0
雪    币: 164
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
学到不少东西,谢谢LZ
2007-6-5 10:57
0
雪    币: 405
活跃值: (10)
能力值: ( LV9,RANK:1130 )
在线值:
发帖
回帖
粉丝
4
支持支持。现在居然还明码。嘿
2007-6-5 11:38
0
雪    币: 1919
活跃值: (901)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
5
晕,几年过去了还没改变哦~
2007-6-5 11:49
0
雪    币: 2899
活跃值: (1753)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
6
顶一顶,但要禁止谈恋爱!
2007-6-5 11:53
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
说的好,支持
2007-6-5 15:45
0
游客
登录 | 注册 方可回帖
返回
//