请记住,一开始,为了理解Reflector解码的代码,我们特意将“反编译选项”中的“ IL”更改为“ C#”,然后根据该代码找到了注册验证的密钥. 提示. 部分但现在的任务是找到一种在UltraEdit32中定位此关键代码的方法,该怎么做?
首先,再次调整在分析过程中调整的选项. 具体来说,在“反编译选项”中再次将“ C#”调整为“ IL”,这样反编译的代码就会再次更改,只需在代码的海洋中寻找它即可!让我们以用于注册验证的代码段为例. 转换后的代码如下所示.
L_00b8: stloc.s标志
L_00ba: ldloc.s标志
L_00bc: brfalse.s L_00c9
L_00be: ldc.i4.0
L_00bf: stsfld bool AdvancedSystemCleaner.Module1 :: blnRegistered
L_00: 没有
L_00c5: br.s L_00d2
L_00c7: br.s L_00d0
L_00c9: 没有
L_00ca: ldc.i4.1
L_00cb: stsfld bool AdvancedSystemCleaner.Module1 :: blnRegistered
众所周知,这只是代码的表示已更改,代码的作用和含义未更改. 让我们看看这两个截然不同的代码之间的联系是什么!环顾四周,我只发现一个通用符号“: blnRegistered”. 继续仔细观察,两段代码中都出现两次“: blnRegistered”,从C#代码可以看出,第一次出现“: blnRegistered”对应于注册失败,因为“ Module1.blnRegistered = false”意味着注册是“假”;第二位是“ Module1.blnRegistered = true”,应该是注册成功. 转换此代码后,成功注册的标志是什么?让我们观察一下这几行代码.
“: blnRegistered”的首次出现是这样的:
L_00be: ldc.i4.0

L_00bf: stsfld bool AdvancedSystemCleaner.Module1 :: blnRegistered
这是第二次:
L_00ca: ldc.i4.1
L_00cb: stsfld bool AdvancedSystemCleaner.Module1 :: blnRegistered
这两段代码基本相同,不同之处在于第一段中的“ ldc.i4.0”为“ 0”,第二段中的代码为“ ldc.i4.1”. 由于转换后代码已更改,但是含义未更改,因此我们可以通过不同的标志位分配来确定程序是否与成功注册区分开. 如果标志位的值等于“ 0”,则注册失败,如果其等于“ 1”,则注册成功. 在这种情况下,“ i4”充当标志(等同于通用EAX,EBX等).
小知识
什么是标志?我之前提到过这个概念,在暴力破解中还有另一种方法称为“符号位爆裂法”. 可以通过这种方式理解“标记”. 简单来说,每个人都经历了无数次考试. 超过60分是通过的,少于60分是悬吊的. 然后60表示是否要停课. 当程序检查软件是否已注册时,它将检查标志位中的值. 如果标志位的值为0,则显示“软件未注册”. 如果标志位的值等于1,则提示“软件已注册”. 就像我们看到了测试成绩一样. 乍看之下,它是55分,低于60分. 不幸的是,课程结束了!
在软件代码中,标志本身只是一个寄存器,可以是EAX,EBX或ECX. 简而言之,可以将常用的寄存器用作“标志”,这取决于软件作者的选择. 标志的核心内容是标志的分配,特别是选择哪种值作为“标志”. 它的重要性就像老师选择通过60分以上或通过50分一样. 这条分数线直接关系到我们的命运. 同样,标志位的分配与最终结果直接相关. 通常,大多数软件使用数字1和0作为标志位的值. 如果注册成功,则标志位的值自动为1,否则为0. 在此必须注意,该值不是固定的,也可以是当标志位的值等于0时. 注册成功与否,取决于软件作者的设计方式.
现在我们的想法问世了,我们只需要修改标志位的值来欺骗程序,就可以达到破解软件的目的. 考虑到这个想法,让我们确定修改的位置. 可以修改哪段代码来达到我们的目的?重新分析该软件的注册过程,以查看哪个部分可以用作“突破”.
清理思路,软件的注册验证过程是这样的: 输入注册码,注册码不正确,标志位分配为0,提示注册失败;如果注册码正确,则将标志位分配为1,进一步提示注册成功. 因为软件会在运行时检查该标志,所以只要在此修改了标志的值,程序就会始终认为该软件已注册. 没错,程序运行时检测到的“标志”就是修改的目标.
我们回到Reflector并找到显示“: blnRegistered”的第一个位置,如图10所示,代码如下.

图10
L_0032: ldc.i4.0
L_0033: stsfld bool AdvancedSystemCleaner.Module1 :: blnRegistered
很明显,此时标志的值为0. 如何使程序认为软件已注册?将“ ldc.i4.0”修改为“ ldc.i4.1”(更改标志的值). 现在已经找到了修改,让我们看一下如何修改标志的值. 将鼠标放在代码“ L_0032: ldc.i4.0”上并暂停1秒钟,Reflector会提示我们“ 0x0016”;同样,将鼠标放在“ L_0033: stsfld bool AdvancedSystemCleaner.Module1 : : blnRegistered”上,Reflector给出的提示是“ 0x0080”,也就是说,这两个指令的机器码分别为16和80. 将“ ldc.i4.0”改成“ dc.i4.1”,找到任何句子“ ldc.i4.1”,同样,Reflector给出的提示是“ 0x0017”. 现在,我们的任务更加清楚了,那就是将“ 16”更改为“ 17”,以便将相应的“ ldc.i4.0”更改为“ ldc.i4.1”. 那么如何修改呢?
至此,Reflector的任务已经完成. 出现以下UltraEdit32. 运行UltraEdit32,打开目标软件如何跳过程序注册码,您会发现UltraEdit32给我们带来了无数的代码,如何开始?还记得我们在上面找到的两个代码指令“ 0x0016”和“ 0x0080”吗?现在它们是我们的“指南针”. 打开UltraEdit32的搜索功能(单击“搜索->查找”),在“查找内容”列中填写要查找的内容. 我们在找什么?是的,它是“ 0x0016”和“ 0x0080”,因此我们输入“ 16 80”,如图11所示.

图11
提示
请注意搜索时输入的格式. 您在此处查找的代码是0x0016,输入时只需输入16. 依此类推,找到0x0080,只需输入80. 尽管我们正在寻找0x0016和0x0080,但我们只需要输入16和80.
输入后,单击“查找下一个”,UltraEdit32可以帮助我们找到目标. 当找到满足代码“ 16 80”的内容时,它将自动停止在目标代码上. 如果当前找到的内容不是我们所需的内容,请继续单击“查找下一个”. 经过测试后,第一次找到的代码不是我们想要的,因此我们仍然必须找到它,后来还找到了符合条件的代码. 在这里要保持警惕,关键代码可能在这里. 仔细观察这一行代码,您会发现数字“ 16”出现了两次. 无论如何,请坚定我们的想法,并将此处的两个“ 16”更改为“ 17”,如图12所示,保存修改后的文件.

图12
运行我们经过修订的程序,将系统日期调整为一年之后. 通常情况下,该软件的试用期仅为20天,并且必须在一年后到期. 但是经过修改后看,呵呵,该软件仍然可用,并且已经是注册版本. 非常成功吗?
摘要
与以前的软件破解相比,.net程序的破解可以说是一个根本性的改变. 从用于破解思路的工具到破解方法,都是空前的. 但是.net的普及只是时间问题,因此我们必须始终面对新事物的挑战以提高自我.
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-200570-2.html
看不腻啊