日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sixxpack破解的文章!【转】

發(fā)布時(shí)間:2024/7/19 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sixxpack破解的文章!【转】 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

星期天閑著沒事玩游戲,玩游戲不能無外掛。于是百度了半天,找到了一個(gè),看介紹貌似不錯(cuò),就下載了下來。一看,竟然是用.net寫的,下意識地Reflector了一下。發(fā)現(xiàn)竟是一個(gè)叫actmp的程序集。如圖:?

?

?

隨便點(diǎn)開看了看,沒發(fā)現(xiàn)什么和外掛有關(guān)的東西。奇怪,于是又百度了一下"actmp.dll",發(fā)現(xiàn)了這篇文章http://blog.csdn.net/yizhiduxiu11/archive/2008/12/23/3589396.aspx,其中說"經(jīng)Sixxpack加殼后,用Reflector打開exe文件,哈哈,看到的永遠(yuǎn)都只是一個(gè)actmp.dll的信息,其中包含4個(gè)7zip命名空間和1個(gè)Sixxpack命名空間,反編出來這些東西對也沒啥處......"。 ? ? ?基本明白咋回事了。我又用“Sixxpack”做關(guān)鍵字搜了一下,果然找到了一堆這個(gè)軟件的信息,其中說"Sixxpack 是一個(gè) .net EXE 文件壓縮工具。經(jīng) Sixxpack 壓縮過的文件,運(yùn)行時(shí)與壓縮前相比沒有任何區(qū)別,壓縮比最大可達(dá)80%。壓縮后的文件更難被反編譯,保護(hù)您的程序不被破解......" 感慨搜索引擎強(qiáng)大的同時(shí),我們可以確定,這個(gè)程序100%是用Sixxpack處理過了。目的可能是為了減少體積,更可能是為了防止俺這樣隨便Reflector的人。如果用其他工具壓縮也還罷了,但是Sixxpack貌似也是.net寫的,而且沒有混淆過,不看一看他的代碼多對不起自己.net程序員的光榮稱號啊。為了查看方便,我用File Disassembler插件把源碼導(dǎo)了出來,找到了Main方法所在的類。核心的東西在Main方法里,很簡單,我加上了注釋。代碼如下: namespaceSixxpack
{
????usingSystem;
????usingSystem.IO;
????usingSystem.Reflection;
????usingSystem.Windows.Forms;

????internalclassstub
????{
????????internalstaticintorig?=0x8000;//加密程序集的偏移量

????????[STAThread]
????????privatestaticvoidMain(string[]?args)
????????{
????????????try
????????????{
????????????????AppDomain.CurrentDomain.AssemblyResolve?+=newResolveEventHandler(stub.myResolveEventHandler);//程序集解析失敗的后路
}
????????????catch(Exception)
????????????{
????????????}
????????????object[]?parameters?=newobject[]?{?args?};//參數(shù),如果有,就傳給解壓出來的程序集
MemoryStream?inStream?=newMemoryStream();//構(gòu)造一個(gè)內(nèi)存流
Stream?stream2?=newFileStream(Application.ExecutablePath.Substring(Application.ExecutablePath.LastIndexOf('//')?+1),?FileMode.Open,?FileAccess.Read);//打開一個(gè)文件流,指向正在運(yùn)行的這個(gè)文件
stream2.Position?=orig;//當(dāng)前流的位置設(shè)置為加密程序集的偏移量
byte[]?buffer?=newbyte[stream2.Length?-orig];//一個(gè)緩沖字節(jié)數(shù)組,長度為加密程序集的長度,用來存儲加密程序集
stream2.Read(buffer,?0,?Convert.ToInt32(buffer.Length));//把加密程序集讀取到緩沖數(shù)組里
inStream.Write(buffer,?0,?buffer.Length);//把加密程序集從緩沖數(shù)組里寫到內(nèi)存流里
inStream.Seek(0L,?SeekOrigin.Begin);//把當(dāng)前流的位置放到開始處
Compressor?compressor?=newCompressor();
????????????Assembly?assembly?=Assembly.Load(compressor.Decompress(inStream));//把內(nèi)存流中的數(shù)據(jù)解壓出來,并加載到一個(gè)程序集
try
????????????{
????????????????assembly.EntryPoint.Invoke(null,?parameters);//執(zhí)行這個(gè)程序集的入口方法,并傳給參數(shù)
}
????????????catch
????????????{
????????????????assembly.EntryPoint.Invoke(null,?null);//沒有參數(shù)的話就不傳
}

????????}

????????privatestaticAssembly?myResolveEventHandler(objectsender,?ResolveEventArgs?args)
????????{
????????????stringpath?=args.Name.ToString().Trim().Split(newchar[]?{?','})[0].ToString().Trim();
????????????if(path.IndexOf(".")?>=0)
????????????{
????????????????path?=path.Replace(".",?"_")?+".dll";
????????????}
????????????else
????????????{
????????????????path?="_"+path?+".dll";
????????????}
????????????MemoryStream?inStream?=newMemoryStream();
????????????Stream?stream2?=newFileStream(path,?FileMode.Open,?FileAccess.Read);
????????????byte[]?buffer?=newbyte[stream2.Length];
????????????stream2.Read(buffer,?0,?Convert.ToInt32(buffer.Length));
????????????inStream.Write(buffer,?0,?buffer.Length);
????????????inStream.Seek(0L,?SeekOrigin.Begin);
????????????Compressor?compressor?=newCompressor();
????????????returnAssembly.Load(compressor.Decompress(inStream));
????????}
????}
} 從以上代碼,我們可以猜測,Sixxpack把壓縮過的程序集和Sixxpack的解壓程序(也就是殼)放在了一個(gè)文件里。運(yùn)行程序時(shí),Sixxpack的解壓程序先運(yùn)行,然后執(zhí)行以下步驟: 1.構(gòu)造一個(gè)內(nèi)存流。 2.取出壓縮后的程序集二進(jìn)制數(shù)據(jù),放進(jìn)內(nèi)存流。所謂壓縮后的程序集二進(jìn)制數(shù)據(jù),也就是這個(gè)文件的第0x8000(即程序里定義的orig字段)到最后一個(gè)字節(jié)的數(shù)據(jù)。至于為啥是從0x8000開始,我想0x8000應(yīng)該是殼的長度吧,殼的數(shù)據(jù)占據(jù)了從0到0x8000字節(jié)的空間,剩下的應(yīng)該就是壓縮后的程序集的數(shù)據(jù)了。 3.用Compressor類的Decompress方法解壓內(nèi)存流數(shù)據(jù),得到原始程序集。 4.用反射加載原始程序集,找到程序集的入口方法,并執(zhí)行這個(gè)入口方法(這時(shí)Sixxpack已完成任務(wù),控制權(quán)已轉(zhuǎn)交給解壓出來的程序集),如果入口方法需要參數(shù)的話,會(huì)把Main方法的參數(shù)傳給入口方法。 既然明白了解壓的方法,那么想拿到原始的程序集也不是什么難事了。只要知道壓縮后的程序集在文件中的偏移量(我猜測應(yīng)該都是0x8000,不過沒看過其他例子,不敢確定),就可以把它取出來,然后用Compressor類的Decompress方法解壓即可得到原始程序集,最后輸出到一個(gè)文件就行了。 代碼很好寫,大部分照抄Main方法就行了,至于Decompress方法,不用管它具體怎么實(shí)現(xiàn)的,反射過來直接使用即可。下面是主要代碼,我直接寫在界面里了,懶得再獨(dú)立寫一個(gè)方法:

?? ??????????private?void?btnDecompress_Click(object?sender,?EventArgs?e)

{
????????????try
????????????{
????????????????Assembly?assembly?=Assembly.LoadFile(txtAssemblyPath.Text);//加載指定程序集
if(assembly?!=null)
????????????????{
????????????????????if(assembly.FullName.Contains("actmp,"))//看看是不是Sixxpack壓縮過的程序集
{
????????????????????????Type?compressorClass?=assembly.GetType("Sixxpack.Compressor");//得到Compressor方法的類型
MethodInfo?DecompressInfo?=compressorClass.GetMethod("Decompress");//Decompress方法,供后面使用
intorig?=Convert.ToInt32(assembly.GetType("Sixxpack.stub").GetField("orig",?BindingFlags.NonPublic?|BindingFlags.Static).GetValue(null));//壓縮后的程序集的偏移量,我雖然強(qiáng)烈懷疑就是0x8000,為了保險(xiǎn)起見,還是反射出來吧。

????????????????????????#region這段照抄Main方法的內(nèi)容
????????????????????????MemoryStream?inStream?=newMemoryStream();
????????????????????????Stream?stream2?=assembly.GetFiles()[0];//這么寫就可以了
stream2.Position?=orig;
????????????????????????byte[]?buffer?=newbyte[stream2.Length?-orig];
????????????????????????stream2.Read(buffer,?0,?Convert.ToInt32(buffer.Length));
????????????????????????inStream.Write(buffer,?0,?buffer.Length);
????????????????????????inStream.Seek(0L,?SeekOrigin.Begin);
????????????????????????#endregion

????????????????????????byte[]?data?=(byte[])DecompressInfo.Invoke(Activator.CreateInstance(compressorClass),?newobject[]?{?inStream?});//調(diào)用Decompress方法,獲得原始程序集的數(shù)據(jù)
if(sfdAssembly.ShowDialog()?==DialogResult.OK)
????????????????????????{
????????????????????????????sfdAssembly.OpenFile().Write(data,?0,?data.Length);//把數(shù)據(jù)保存到指定文件,OK,完工!
}
????????????????????????MessageBox.Show("文件解壓成功!",?"恭喜",?MessageBoxButtons.OK,?MessageBoxIcon.Information);
????????????????????}
????????????????????else
????????????????????{
????????????????????????MessageBox.Show("未找到正確的程序集!",?"錯(cuò)誤",?MessageBoxButtons.OK,?MessageBoxIcon.Hand);
????????????????????}
????????????????}
????????????????else
????????????????{
????????????????????MessageBox.Show("該文件沒有程序集!",?"錯(cuò)誤",?MessageBoxButtons.OK,?MessageBoxIcon.Hand);
????????????????}
????????????}
????????????catch(Exception?ex)
????????????{
????????????????MessageBox.Show(ex.Message,?"錯(cuò)誤",?MessageBoxButtons.OK,?MessageBoxIcon.Hand);
????????????}
????????????

?? ? ? ?}?

下面是這個(gè)小程序的完整的代碼,需要的童鞋可以下載參考一下。點(diǎn)擊下載 由此可見,如果僅僅想減小一下你的程序的體積,Sixxpack應(yīng)該是個(gè)不錯(cuò)的工具,但是指望用它保護(hù)自己的代碼,顯然只能失望了。稍微懂點(diǎn).net的,只要愿意花點(diǎn)時(shí)間琢磨,都能拿到你的原始程序。所以想保護(hù)自己代碼,還是使用那些專業(yè)的加密混淆工具吧。不過感覺Sixxpack的思路確實(shí)很不錯(cuò),有時(shí)間一定要好好看一下它具體的代碼。 我最后用這個(gè)小程序得到了這個(gè)外掛的真正程序集。看了一下,忍不住破口大罵,原來是個(gè)騙局。百度搜了一下,果然罵聲一片,竟然還真有不少童鞋上當(dāng)了。不過這和本篇內(nèi)容無關(guān)了,而且現(xiàn)在時(shí)間太晚了,等有時(shí)間一定要揭露他一下,也免得再有童鞋上當(dāng)。

轉(zhuǎn)載于:https://www.cnblogs.com/zhangzhu/p/3230396.html

總結(jié)

以上是生活随笔為你收集整理的sixxpack破解的文章!【转】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。