首页
社区
课程
招聘
[旧帖] [原创菜鳥破解.net程序劣作 0.00雪花
发表于: 2008-7-9 22:43 16568

[旧帖] [原创菜鳥破解.net程序劣作 0.00雪花

2008-7-9 22:43
16568

来到这里我高兴,天生喜欢热闹的地方.老套话来了哈~我愿和大家一起进步,一起努力,不丢大家的脸啊

盼得多少回,顶了多少次贴,终于我有权限上附件了,终于.终于我也可以发一篇劣作上来,闲话放边,正事上场,如果阅读不太方便,可以从附件中取,我放在word中.文章若有错误之处请提出,各位大大

此次破解的程序是一个双色球的程序,下面开始


先運行一遍,注冊時錯誤有對話框彈出,一切好辦了啊,用peid檢測到為vc#.net所寫沒有加殼,用od調試了進次,想給messagebox下斷,始終不成功,算了,心想還是改用別的方式來吧,不要在一棵樹上吊死了

從網上GOOGLE了一下,了解到Xenocode Fox可以做這方面的代碼解析,不過是靜態的,看了相關的教程。快快去下載了一個,設置選項,然後調入。
1.設置fox的選項,主要是為了讓fox能夠顯示函數基址


2.調入


雖然我E文菜,但第一眼reg就成為我視線的焦點了,比較可疑,馬上展開來


Getmd()這段代碼就是注冊時所執行的了,分析裡面的msgbox就可以知道了,由於這軟件並不能直接更改源碼,所以只能手動定位到地址來修改了,那麼我得知道地址的相關信息才有辦法。點擊“language”切換語言到misl格式,從下圖可以明顯地看到,該函數的基址就是0x00479f0,每條指令前面的Lˍ0000,L000f也就是每個指令的偏移址了


80x86每個函數從地址開始執行,第一條指令的地址就是函數地址,msil並不是如此,實際上沒去了解過msil,只是根據代碼分析出來的結果第一個指令是從函數基址偏移0xC的
現在我們繼續找關鍵跳轉的語句在哪個偏移位置,我已經找到出來了,就直接給出,這一步也很簡單。圖中的這個就是跳轉的代碼了,這個的意思就是說結果為假就跳到該地址去執行.把光標放到上面停會會提示機器碼,它告訴我們該指令是“基於函數第一條指令”偏移0x06e8,指令碼占五個字節,其中操作符占一個字節機器碼為0x39,剩下的四個字節為操作數,可這四個節的機器碼是什麼,還不知道。這些信息都比較重要,先記下來,下面要用到。如果在這裡有些概念不太懂可以提出.,再不行可以google,


現在我們可以這樣算出該指令的地址,0x0479f0+0xc+0x06e8結果就是480E4
同理目的地址0x0479f0+0xc+0x09b2,結果就是483AE

到現在為止,可以基本理解該指令的功能是將從480E4處跳轉到483AE 處執行,告訴你你注冊錯誤了,大可以將操作數brfalse改成brture,可是我不知道brture的機器碼,又得折衷了,換一條路來走,只要將後面的操作數改掉,就成功了哈,那麼怎麼改又是個難題了,又得涉及到尋址了,不要怕,我們再分析

接下來我們用HWorkS32這個十六進制編輯工具,來定位到該跳轉指令的地址,按住ctrl+G,鍵入地址值,再單擊“轉去”按鈕。

看到結果了吧,這五個字節就是指令的內容了。
此處是以低字節到高字節排列的
第一字節是0x39,在這裡我們又可以到這個操作數的值是0x000002c5,應該是個偏移值來的,初看該數值還真不明白是什麼意思,能夠確定的是該數值和目的地址有必然的聯繫,要不編譯器也無法定位到指定地址去執行,我只是猜測。若想深入了解的,可以查閱MISL的教程

下面推理一下看0x000002c5的用意
源地址:0x480E4
目的地址:0x483AE
兩者之差:0x02CA

下來,再比較0x02CA和0x000002c5有什麼聯繫,如果說這個值是告訴編譯器目的地址基於源地址的偏移的話,那這兩個值應該是相等的,可實際結果和我們想的不同。
0x02CA要比0x000002c5大了0x5,這個數字又是怎麼回事,如果你比較細心的話,有沒有想起, 上圖的跳轉指令占了五個字節,如果再加上這個五也就沒問題了。是不是此處0x000002c5的意思是告訴編譯器說尋找的地址就是基於該指令最高字節+1再開始偏移呢,我們再進行驗證一下就知道了啊

下來我們將0x000002c5改成0看一下,假若我們的推理是正確的,跳轉後就變成順序執行指令了,實際也就是這個指令作廢了,那麼我的目的就達到了。改完後,我們來運行一遍,隨便輸入注冊碼


有人在偷偷笑了啊,成功了


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (15)
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我在偷偷哭了,看不懂``````
2008-7-9 23:23
0
雪    币: 239
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
樓上的朋友,難道是我表達的思路有問題嗎
2008-7-10 08:17
0
雪    币: 563
活跃值: (95)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
2楼 可能是对net IL 汇编语言不懂吧
2008-7-10 12:04
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
严重好文,正好拿来用,哈哈哈
2008-7-13 00:27
0
雪    币: 317
活跃值: (93)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
6
呵呵,不错的破文,真是图文并貌
2008-7-13 01:57
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
新手``看不懂``还是顶下~
2008-7-13 12:44
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
不错
还可以
2008-7-13 12:46
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
不错啊,给.net分析初学者方向
2008-11-7 02:43
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
哇噻!反汇编过来的代码看起来和源代码都差不多啊!是反编译程序厉害还是.NET程序脆弱啊!要是都是这样的程序.哈哈!笑了:)
忽然发现.NET的好处了:)比看看什么EAX,EBX的眼睛舒服多了^_^
2008-11-8 18:03
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
新手``看不懂``还是顶下~
2008-11-8 18:32
0
雪    币: 401
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
学习,好好学习
2008-11-9 10:24
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
对我们新手来说太难了 呵呵 不过顶一下
2008-11-9 13:41
0
雪    币: 198
活跃值: (1585)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
public void getMD()
{
    string s = Conversions.ToString(Conversion.Val(MyProject.Forms.start.st_lb_mchsg.Text)) + MyProject.Forms.start.Text;
    byte[] bytes = Encoding.ASCII.GetBytes(s);
    byte[] arrInput = new MD5CryptoServiceProvider().ComputeHash(bytes);
    string str = this.ByteArrayToString(arrInput);
    if (Conversions.ToBoolean(Operators.AndObject(Operators.AndObject(Operators.AndObject(Operators.AndObject(Operators.CompareObjectEqual(Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 13, 4), 1, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 13, 4), 2, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 13, 4), 3, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 13, 4), 4, 1))) + Conversions.ToString(0x54), MyProject.Computer.get_Registry().GetValue(@"hkey_current_user\software\microsoft\windows\CurrentVersion\sqttinge\sunqklr", "klr", null), false), Operators.CompareObjectEqual(Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 0x11, 4), 1, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 0x11, 4), 2, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 0x11, 4), 3, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 0x11, 4), 4, 1))) + Conversions.ToString(0x48), MyProject.Computer.get_Registry().GetValue(@"hkey_current_user\software\microsoft\windows\CurrentVersion\sqttinge\sunqklg", "klg", null), false)), Operators.CompareObjectEqual(Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 0x15, 4), 1, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 0x15, 4), 2, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 0x15, 4), 3, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 0x15, 4), 4, 1))) + Conversions.ToString(0x4d), MyProject.Computer.get_Registry().GetValue(@"hkey_current_user\software\microsoft\windows\CurrentVersion\sqttinge\sunqkln", "kln", null), false)), Operators.CompareObjectEqual(Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 0x19, 4), 1, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 0x19, 4), 2, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 0x19, 4), 3, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 0x19, 4), 4, 1))) + Conversions.ToString(80), MyProject.Computer.get_Registry().GetValue(@"hkey_current_user\software\microsoft\windows\CurrentVersion\sqttinge\sunqkli", "kli", null), false)), ((((Conversions.ToString(Strings.Asc(Strings.Mid(this.T_rg2.Text, 1, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(this.T_rg2.Text, 2, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(this.T_rg2.Text, 3, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(this.T_rg2.Text, 4, 1)))) == (Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 13, 4), 1, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 13, 4), 2, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 13, 4), 3, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 13, 4), 4, 1))))) & ((Conversions.ToString(Strings.Asc(Strings.Mid(this.T_rg3.Text, 1, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(this.T_rg3.Text, 2, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(this.T_rg3.Text, 3, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(this.T_rg3.Text, 4, 1)))) == (Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 0x11, 4), 1, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 0x11, 4), 2, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 0x11, 4), 3, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 0x11, 4), 4, 1)))))) & ((Conversions.ToString(Strings.Asc(Strings.Mid(this.T_rg4.Text, 1, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(this.T_rg4.Text, 2, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(this.T_rg4.Text, 3, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(this.T_rg4.Text, 4, 1)))) == (Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 0x15, 4), 1, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 0x15, 4), 2, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 0x15, 4), 3, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 0x15, 4), 4, 1)))))) & ((Conversions.ToString(Strings.Asc(Strings.Mid(this.T_rg5.Text, 1, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(this.T_rg5.Text, 2, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(this.T_rg5.Text, 3, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(this.T_rg5.Text, 4, 1)))) == (Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 0x19, 4), 1, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 0x19, 4), 2, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 0x19, 4), 3, 1))) + Conversions.ToString(Strings.Asc(Strings.Mid(Strings.Mid(str, 0x19, 4), 4, 1))))))))
    {
        MyProject.Computer.get_Registry().get_LocalMachine().CreateSubKey(@"software\microsoft\windows\CurrentVersion\vittinge\version");
        MyProject.Computer.get_Registry().SetValue(@"hkey_local_machine\software\microsoft\windows\CurrentVersion\vittinge\version", "ssqsgy", Conversions.ToString(((Conversion.Val(Strings.Asc(Strings.Mid(this.T_rg2.Text, 1, 1))) + Conversion.Val(Strings.Asc(Strings.Mid(this.T_rg2.Text, 2, 1)))) + Conversion.Val(Strings.Asc(Strings.Mid(this.T_rg2.Text, 3, 1)))) + Conversion.Val(Strings.Asc(Strings.Mid(this.T_rg2.Text, 4, 1)))) + Conversions.ToString(((Conversion.Val(Strings.Asc(Strings.Mid(this.T_rg3.Text, 1, 1))) + Conversion.Val(Strings.Asc(Strings.Mid(this.T_rg3.Text, 2, 1)))) + Conversion.Val(Strings.Asc(Strings.Mid(this.T_rg3.Text, 3, 1)))) + Conversion.Val(Strings.Asc(Strings.Mid(this.T_rg3.Text, 4, 1)))) + Conversions.ToString(((Conversion.Val(Strings.Asc(Strings.Mid(this.T_rg4.Text, 1, 1))) + Conversion.Val(Strings.Asc(Strings.Mid(this.T_rg4.Text, 2, 1)))) + Conversion.Val(Strings.Asc(Strings.Mid(this.T_rg4.Text, 3, 1)))) + Conversion.Val(Strings.Asc(Strings.Mid(this.T_rg4.Text, 4, 1)))) + Conversions.ToString(((Conversion.Val(Strings.Asc(Strings.Mid(this.T_rg5.Text, 1, 1))) + Conversion.Val(Strings.Asc(Strings.Mid(this.T_rg5.Text, 2, 1)))) + Conversion.Val(Strings.Asc(Strings.Mid(this.T_rg5.Text, 3, 1)))) + Conversion.Val(Strings.Asc(Strings.Mid(this.T_rg5.Text, 4, 1)))));
        Interaction.MsgBox("恭喜:注册成功!\r\n感谢您的注册,祝您中奖发财!", MsgBoxStyle.Information, "恭喜...");
        MyProject.Forms.Fm1.Tool_key.set_Visible(false);
        MyProject.Forms.Fm1.Lb_ynsg.Text = "killnumed";
        this.rg_fails();
    }
    else
    {
        Interaction.MsgBox("注册序列号错误,注册失败!\r\n请联系作者获取正确的注册序列号!\r\n欢迎您继续试用本软件!", MsgBoxStyle.Exclamation, "抱歉...");
        MyProject.Forms.Fm1.Tool_key.set_Visible(true);
        MyProject.Forms.Fm1.Lb_ynsg.Text = "unkillnumed";
        this.rg_fails();
    }
}
2008-11-9 15:54
0
雪    币: 198
活跃值: (1585)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
核心代码,kegen了它可以一劳永逸。
2008-11-9 15:55
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
整不懂。

从来没见过这么先进的东西。
2008-11-9 17:39
0
游客
登录 | 注册 方可回帖
返回
//