首页
社区
课程
招聘
[原创] 一个比较有意思的CRACKME
2008-9-4 21:40 3294

[原创] 一个比较有意思的CRACKME

2008-9-4 21:40
3294
【文章标题】: 一个比较有意思的CRACKME
【文章作者】: 我本寂寞
【作者主页】: hi.baidu.negcit/negcit_k
【软件名称】: elf_cm1.exe
【使用工具】: OD
【操作平台】: WIN XP
【作者声明】: 只是玩玩。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
介绍:(来自原作者)
I  just  wanted to show you an interesting and naughty kind of hmmm...
protection,  in  case  you  haven't  seen  it  before,  and  there  is
possibility  that  you will find it in some real protection schemes (I
did, and that's why I had this idea of writing crackme).

此类的CRACKME我之前也见过一回,确实挺有意思,loooootts of jumps。挺好跟踪的,在每个JMP语句上按ENTER键即可跳到目的地,只不过很难知晓大局,也就比原来的程序难破解多了。只要整理了思路,或是跟对了路,也是很简单的。
先观察程序的行为:运行程序,只有一个BUTTON,双击,弹出一对话框,显示"no,not really",输入negcit,结果一样。用OD载入:
Ctrl+N,哇,输入函数很少,就几个,嘿,有GetDlgItemTextA,bp GetDlgItemTextA下断,F9运行,输入negcit,双击check按钮,Ctrl+F9返回程序领空,程序停在此处:
004012CD    68 D5124000     push    004012D5
004012D2    C3              retn

在此顺便提下,上两条相当于,JMP        004012D5。F8跟踪,看到JMP就F8跳过,来到
004013E9    83F8 05         cmp     eax, 5
004013EC  ^ 0F85 3AFFFFFF   jnz     0040132C

比较读入的字符数,不等于5就跳到失败的地方,调用MessageBoxA显示"no,not really"。再F8,到了004013EC,红线,表示跳转将会发生,现我们在寄存器的窗口中双击Z标志位的值,比如此时为0,双击之后为1,红线变为灰色,F8,哈,跳过了BAD BOY。一路F8,直到
004010BC    BE 69304000     mov     esi, 00403069                    ; ASCII "negcit"

现ESI将指向我们输入的字符串,继续F8,
004012DC    BF 3C304000     mov     edi, 0040303C                    ; ASCII "fubar"

现EDI指向"fubar",嘿,程序想干什么?比较吗?很有可能,继续,若干个F8之后来到:
004012E9    A7              cmps    dword ptr [esi], dword ptr es:[edi]
004012EA   /75 1D           jnz     short 00401309

将这两字符串的前四个相比较,不相等就跳走,所以此时我们又得双击Z位的值了,使程序不会跳到“坏”的地方。一路F8,来到:
00401359    66:A7           cmps    word ptr [esi], word ptr es:[edi]
0040135B  ^ 74 B4           je      short 00401311

将剩余的最后一个字符相比,相等就跳,呵,我们的又不等,所以还得双击Z位,使程序跳转,一跳F8,嘿,不对劲啊,怎把BAD BOY入栈了?
004012A3    68 00304000     push    00403000                               ; ASCII "terrible spaghetti, isn't it?"

先不管它,继续,哐,弹出一个对话框,显示"terrible spaghetti, isn't it?",切,确实terrible spaghetti,看来我们输入的不能等于fubar,不然也不对。
接下来只好回到我们当初比较这两字符串的地方了。
004012E9    A7              cmps    dword ptr [esi], dword ptr es:[edi]
004012EA    75 1D           jnz     short 00401309

那就让它们不相等吧,直接F8跳走,
00401080    83EF 0A         sub     edi, 0A

唉?EDI减10作啥?F8,哈,此时EDI指向了另一字符串:"word?",哈,也5字,是不这就是最终的KEY了呢?呵,还得继续往下看,
004011A0    83EE 04         sub     esi, 4

ESI也减4,F8,此时ESI又指向我们输入的字符串。哈,看来又得比较一次了,继续:
004011F3    A7              cmps    dword ptr [esi], dword ptr es:[edi]
004011F4   /0F85 32010000   jnz     0040132C

前四不相等跳走,双击Z位,还是让程序不跳走,呵,这可是第二个希望啊,只希望这个不再是假的了。GO ON:
00401374    66:A7           cmps    word ptr [esi], word ptr es:[edi]
00401376   /74 0C           je      short 00401384

比较最后一个字符,相当就跳,双击Z位,继续:哈,此时还是按F9好,再一看我们的程序,哈,图像显示Correct!
哈,总算对了,好了,赶快输入KEY吧,word?,呵呵,作者还给了你奖励呢——把源代码都给附上了,密码也就是这个密码。
致此,破解完结。

总结:
此CRACKME在程序里加入了很多的JUMP及JUNKS,因此对程序的理解就相对困难了许多,而且还经过了两次比较,第一次比较是假比较,必需不等才行,第二次比较才得相等,从而得到了我们要找的KEY。这个CRACKME比较新颖,有趣,但都是些常用指令,算法也很简单,只是简单的字符串比较,因此还是比较简单破解。
  
--------------------------------------------------------------------------------
  转载请注明原出处。                                                    2008年09月04日

[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回