net设计需求分析,一个工具可轻松破解中有许多弱小的工具

avatar shenyifan 2022-09-05 10:10 522次浏览 评论已关闭

深易凡软件库9月5日消息,中有许多弱小的工具。net sdk,可以轻松破解。net程序,只需你懂一点IL言语。如今以一个M软件为例引见整个破解进程。

步骤零:用反编译工具剖析软件的可执行文件,公式化破解逻辑。我把这个软件叫做“M”。首先要理解M的注册原理,M是经过输出注册码注册的。要破解它,首先要理解它的注册原理,所以要用逆向翻译工具来剖析。

我用的反编译工具是。net reflactor,它可用于翻开。net并检查C#源代码。翻开后,经过一番查找,找到了注册窗口的事情处置流程,然后不断找到了它的注册验证程序。如下所示:

MarkdownPad2。licensing . license engine . verify license(String,String):布尔公共bool verify license(String license key,string email) { if (string。IsNullOrEmpty(license key)| | string。IsNullOrEmpty(email)) {前往false}试试{ this。执照=这个。解密(license key);这个。LicenseProcessed = true} catch(异常exception3) {…前往false}假如(((这个。License == null) ||(这个。License.Email == null)) ||(这个。License.Product == null)) {前往false} bool flag =这个。License.Email.Equals(email,StringComparison。普通案件);bool flag2 =这个。license . Product = = ” markdownpad 2 “;前往(旗帜& amp& ampflag 2);}窗口中输出的邮件和密钥发送到这里,在这里用decrypt办法解密密钥,间接生成一个License对象。该对象的定义如下:

命名空间MarkdownPad2。答应{运用系统;运用系统。Runtime . CompilerServices公共类答应证{ public DateTime creation date { get;设置;}公共字符串Email { get设置;} public int LicenseTypeId { get设置;}公共字符串称号{ get设置;}公共字符串产品{ get设置;}}}仿佛是注册信息的记忆对象。然后,检查生成该对象的解密办法:

公有答应证解密(字符串无效负载){ RSA rSA = CryptoKey。FromPublicKey( ” – BEGIN公钥-\ nmib…pqidakab \ n-END公钥-“,” 2QJmLPD5ktxIrFkr “)。GetRSA();byte[] msg =转换。FromBase64String(无效负载);byte[] bytes = rSA。PublicDecrypt(msg,RSA。padding . PKCS1);字符串str =编码。Default.GetString(字节);irest response response = new rest response { Content = str };license license = new JSON deserializer()。反序列化& lt答应证& gt(回应);rSA。dispose();出借答应证;}学习之后,你就能明白这个程序是经过一个指定公钥的rsa解密器来解密传入的Base64字符。解密后的内容是一个Json格式的文本字符串,这个文本字符串被间接反序列化为一个答应证对象。

有几种办法可以破解它:

更改VerifyLicense并间接前往true值。这个办法我其适用过,但是发现一个成绩,就是软件启动的时分,总会呈现一个nullException。缘由应该是软件启动的时分会反省能否注册,然后修正后的办法会给它前往一个真值。但是,当它兴致勃勃地检查注册信息时,没想到是空的。处理办法是修正C: \ users <用户名>:\ AppData \ Local & lt产品称号>:& lt文件名>:& ltVersion >: \user.config文件,并将注册信息写入其中,但注册信息仍需满足解密要求。所以我不必这种办法。写一个注册码生成器,用对应的私钥生成契合程序要求的注册码,这样就不必改程序了。成绩是我们没有这个公钥对应的私钥,所以在加密之前不能做注册信息。处理办法:本身生成一个新的RSA密码对,然后交换程序的公钥,用对应的私钥写注册机。所以我们还是要改动程序?没有太粗心义。你做梦去吧。不要用这种办法。改动解密方式,跳过解密进程,让它支持明文注册信息,然后按我的志愿输出。就是这条路!方案确定,如今修正程序。

第一步:用ildasm将EXE或DLL文件反编译成il源代码。Ildasm是附带的工具。net来反编译IL。我用ildasm翻开了M.exe文件,看到了称号空间、类名等。在其中,然后在菜单中选择“Dump ”,并选择一个空目录——留意会生成一堆文件,所以运用空目录——并确认IL文件和资源文件将保管在那里。

由于我们只需求挪动一点点代码,其他什么都不需求,所以我们只需求留意m.il文件。

第2步:修正il文件。用您喜欢的文本编辑器翻开m.il文件,并找到我们想要修正的解密办法。哇,这个办法在C#里只要几行,在IL里这么长!

回头看看这个办法的c#版本:

公有答应证解密(字符串无效负载){ RSA rSA = CryptoKey。FromPublicKey( ” – BEGIN公钥-\ nmib…pqidakab \ n-END公钥-“,” 2QJmLPD5ktxIrFkr “)。GetRSA();byte[] msg =转换。FromBase64String(无效负载);byte[] bytes = rSA。PublicDecrypt(msg,RSA。padding . PKCS1);字符串str =编码。Default.GetString(字节);irest response response = new rest response { Content = str };license license = new JSON deserializer()。反序列化& lt答应证& gt(回应);rSA。dispose();出借答应证;}我们要把它改成这样:

公有答应证解密(字符串无效负载){ IRestResponse response = new rest response { Content = payload };JSON deserializer deserializer = new JSON deserializer();前往反序列化程序。反序列化& lt答应证& gt(回应);}如今,硬着头皮,看看IL代码,发现并不太难,比方说第一段:

。本地初始化(类[ManagedOpenSsl]OpenSSL。Crypto.CryptoKey V_0,class [ManagedOpenSsl]OpenSSL。Crypto.RSA V_1,uint8[] V_2,uint8[] V_3,string V_4,Class [restsharp] restsharp。irestress v _ 5,class [restsharp] restsharp。反序列化程序。JSON反序列化器v _ 6,类markdownpad2。答应。答应证v _ 7)这是部分变量的定义。它们按地位编号,从0开端。然后再看c#,有几个ldXXX指令(ldstr:堆栈字符串常量;Ldloc:栈压的部分变量,ldarg:栈压办法的参数)预备参数,一个call调用办法。假如有前往值,会用stloc保管到第n个变量中。

IL_0000: ldstr ” -开端公钥- \nMI…QAB\ n – END公钥-” IL _ 0005:ldstr ” 2 qjmlpd 5 ktxirfkr ” IL _ 000 a:调用类[ManagedOpenSsl]OpenSSL。crypto . CryptoKey[ManagedOpenSsl]OpenSSL . crypto . CryptoKey::from public key(string,string) il _ 000f: stroc.0你懂吗?前面也一样。我们曾经找到了新的餐厅,

il _ 0034:new objinstancevoid[rest sharp]rest sharp . rest response::。ctor()il _ 0039:stroc . s V_5//new的前往值被赋给V _ 5部分变量。IL_003b: ldloc.s V_5 //第0个参数就是这个指针。IL _ 003d:ldloc的参数。s V_4//set办法,如今取V_4,即str部分变量il _ 003f: callvirt实例void [rest sharp] rest sharp。irestress response::set _ content(string)。我们只需求把IL_003d: ldloc.s V_4改成IL_003d: ldarg.1,把无效载荷参数间接给response。内容

IL_0034: newobj实例void [RestSharp]RestSharp。重新呼应::。ctor()Il _ 0039:stroc . SV _ 5il _ 003 b:ldloc . SV _ 5il _ 003d:ldarg . 1il _ 003 f:call virt实例Void[rest sharp]rest sharp . irestress response::set _ content(string)假如不删除后面的RSA解密代码,即删除从部分变量初始化到IL_0034之前的一切代码,最初,还有一个RSA.dispose(),它对应的IL代码如下,也删除了:

IL _ 0056:ldloc . 1il _ 0057:call virt Instance Void[managed OpenSSL]OpenSSL . core . base::dispose()还有,由于有4个部分变量没有运用,所以也应该在init中删除,否则会招致程序运转时呈现堆栈错误。

最初,反省程序中变量的参考序号能否需求调整。最初的程序是这样的:

。办法private hide by siginstance类markdown pad 2 . licensing . license decrypt(string payload)cil managed {//代码大小95 (0x5f)。maxstack 3。部分初始化(类[RestSharp]RestSharp。IRestResponse V_5,class [RestSharp]RestSharp。deserializer . JSON deserializer V _ 6,类MarkdownPad2。licensing . License V _ 7)IL _ 0034:new obj实例void [RestSharp]RestSharp。重新呼应::。ctor()IL _ 0039:stloc . s V _ 5 IL _ 003 b:ldloc . s V _ 5 IL _ 003d:ldarg . 1 IL _ 003 f:call virt实例void [RestSharp]RestSharp。IRestResponse::set _ Content(string)IL _ 0044:new obj实例void [RestSharp]RestSharp。JsonDeserializer::。ctor()IL _ 0049:stloc . s V _ 6 IL _ 004 b:LD loc . s V _ 6 IL _ 004d:LD loc . s V _ 5 IL _ 004 f:call virt实例!!0 [RestSharp]RestSharp。deserializer . JSON deserializer::Deserialize & lt;类别MarkdownPad2。答应。答应证& gt(class[rest sharp]rest sharp . irestress response)il _ 0054:stroc . s v _ 7il _ 005 c:LD loc . s v _ 7il _ 005 e:ret }//办法答应引擎完毕::解密第三步:用ilasm重新编译exe文件。Ilasm是中的命令行工具。net sdk,用来编译il文件。在命令行上执行以下命令,将重重生成M.exe:

ilasm/exe/resource = m.res/output = m . exem . il留意,M.exe的程序里有很多图片等资源。反编译时,这些资源文件也会被提取出来放在这里,一切的资源都会在m.res文件中描绘。重新编译时,只需如上例中的/resource=M.res。

好,把破解的M.exe放回原来的目录,交换原来的程序,然后执行。

选择注册,并在注册码框中输出json格式的明文:

{ “创立日期”:” 2014年12月-11t06: 06: 54.0068849z “,” email”: “* * @ qq.com “,” License typeid”: 1,” name”: “my name “,” product”: “m software如今我们晓得这个字符串会间接反序列化成一个适宜的License对象。

按确定………

成功!如今你一切的运用限制都被取消了。

发表评论
请先登录后再评论~