反编译class文件(反编译)

导读 你们好,最近小活发现有诸多的小伙伴们对于反编译class文件,反编译这个问题都颇为感兴趣的,今天小活为大家梳理了下,一起往下看看吧。1、

你们好,最近小活发现有诸多的小伙伴们对于反编译class文件,反编译这个问题都颇为感兴趣的,今天小活为大家梳理了下,一起往下看看吧。

1、 1.断点:

2、 所谓断点,就是程序中断的地方。解密者对这个词很熟悉。那么什么是中断呢?中断是指由于一个特殊事件(中断事件),计算机挂起当前任务(即程序),去执行另一个任务(中断服务程序)。

3、 然后回到原来的任务继续执行。比如你正在上班,突然有同学打电话告诉你,他从外地坐火车过来,要你去火车站接他。然后你临时向老板请假,去火车站接同学,然后安顿好他,然后你回公司继续上班。

4、 这是一个中断的过程。我们的解密过程是等到程序得到我们输入的注册码,准备和正确的注册码进行比对,然后通过分析程序找到正确的注册码。所以我们需要为解密后的程序设置一个断点。

5、 在适当的时候切入程序,追踪程序的注册码,从而达到破解的目的。

6、 2.空域:

7、 这是一个很重要的概念,但也是初学者经常不理解的。我们可以在各种破解文章中看到空域这个词。如果你不知道程序的空域具体在哪里,那么你就进不了破解之门。也许你破解了一些软件,

8、 不过是瞎猫碰上死耗子罢了(我以前也是这样_,现在都不好意思说了!)。所谓程序的空域,说白了就是程序本身所在的地方,也就是我们要破解的程序代码所在的位置。

9、 也许你马上会问:我在程序运行的时候设置了断点。中断后为什么不在程序自己的空间里?因为每个程序的编写都没有固定的模式,所以如果我们想切入程序就要中断程序,就必须独立于具体的程序设置断点。

10、 也就是说,我们设置的断点应该是每个程序都会用到的。在DOS时代,基本上所有的程序都工作在中断程序上,也就是几乎所有的DOS程序都会调用各种中断来完成任务。但是在WINDOWS时代,

11、 程序没有权利直接调用中断,WINDOWS系统提供了系统函数调用平台(API)。就像DOS程序是基于中断程序,WINDOWS程序是基于API来处理系统,这样各种函数,

12、 所以WINDWOS下软件破解的断点设置是基于API函数的,即程序调用API函数时,中断其正常运行,然后解密。

13、 例如,在SOFTICE中设置以下断点:bpx GetDlgItemText(获取对话框文本)。当我们要破解的程序调用GetDlgItemText读取输入数据时,立刻被SOFTICE拦截。

14、 所以被破解的程序停留在GetDlgItemText的程序区,这个程序区在WINDWOS自己管理的系统区。如果我们未经授权更改这部分程序代码,

15、 那就是大灾难_!所以我们要从系统区回到被破解程序自己的地方(也就是程序的空域),才能破解程序。至于怎么看节目的空域,请看前面的SOFTICE示意图。想象一下:对于一个每个程序都会调用的程序段,

16、 我们有可能在那里找到有用的东西吗?如何解密是由程序本身决定的,而不是由调用系统函数决定的!)?

17、 3.API:

18、 即应用编程接口(application programming interface)的缩写,中文称为应用编程接口,是系统定义函数的大型集合,提供了一种访问操作系统特性的方式。API包含数百个由应用程序调用的函数。

19、 这些函数执行所有与操作系统相关的必要操作,如内存分配、屏幕输出、窗口创建等。用户的程序通过调用API接口来处理WINDOWS,不管是什么样的应用,

20、 它的底层最终通过调用各种API函数来实现各种功能。通常API有两种基本形式:Win16和Win32。Win16是原始API的16位版本。

21、 用于Windows 3.1;Win32是API的当前32位版本,用于Windows 95/98/NT/ME/2000。Win32包括Win16,它是Win16的超集。

22、 大多数函数都有相同的名称和用法。16位API函数和32位API函数的区别在于最后一个字母。

23、 For example, we set breakpoints such as bpx GetDlgItemText, bpx GetDlgItemTextA and bpx GetDlgItemTextW, where GetDlgItemText is a 16-bit application interface function.

24、 GetDlgItemTextA和GetDlgItemTextW是32位API函数,而GetDlgItemTextA表示函数使用单字节,GetDlgItemTextW表示函数使用双字节。

25、 目前破解常用的是Win32单字节API函数,类似于GetDlgItemTextA,其他两个函数(Win16 API和Win32双字节API函数)比较少见。

26、 Win32 API函数包含在动态链接库(dll)中。

27、 即包含在kernel32.dll、user32.dll、gdi32.dll和comctl32.dll中,

28、 这就是为什么我们需要用EXP=C: Windows System Kernel32这样的命令行将这些动态链接库导入到softice中。动态链接库.因为如果你不这么做,

29、 我们无法截获系统Win32 API函数调用。

30、 4.关于注册码在程序中的存在方式:

31、 在破解的过程中,我们会找到输入注册码和正确注册码对比的地方,然后通过对程序的跟踪分析,找到正确的注册码。但是正确的注册码在程序中通常以两种形式存在:显式和隐式。对于显式注册码,

32、 我们可以直接在程序所在的内存中看到。比如在SOFTICE的数据窗口可以直接看到类似‘297500523’的注册码(这里随意写)。

33、 显式注册码的软件更容易破解;但是,有些软件程序不会直接将我们输入的注册码与正确的注册码进行比较。例如,可以将注册码转换为整数,或者对注册码进行反汇编。

34、 然后逐个比较不同地方的注册码的每一位,或者把我们输入的注册码进行变换,然后用专门的程序进行验证。总之,应用程序会采用各种复杂的操作方法,避免直接进行注册码比对。对于这样的程序,

35、 我们通常要下功夫仔细跟踪分析每个程序函数,找到加密算法,然后破解。当然,这需要一定程度的8086汇编编程技巧和极大的耐心和精力。

36、 5.关于如何破解软件:

37、 我把破解方式分为两类,完全破解和暴力破解。所谓完全破解,主要是针对需要输入注册码或密码的软件。如果我们能通过跟踪程序找到正确的注册码,并通过软件本身的注册功能正常注册软件,

38、 这种开裂被称为完全开裂;但如果有的软件本身不提供注册功能,只提供DEMO,或者无法通过软件本身进行注册(比如需要另外获取专门的注册程序,通过互联网进行注册等。),

39、 或者软件本身的加密技术比较复杂,软件破解者的能力、精力、时间有限,无法直接获取正确的注册码。这时候我们需要修改软件本身的程序代码。

40、 6.关于破解教程中的程序代码地址:

41、 破解教程里会放一部分程序代码,帮助解释程序的分析方法,比如下面的程序代码:

42、 .

43、 0167:00408033 Push 00?

44、 0167:00408035推EBX?

45、 0167:00408036致电【USER32!EndDialog]?

46、 JMP 0040812C?

47、 .

48、 这里的程序中的代码地址是0167:00408033,其代码段(即0167)的值根据不同的计算机可能不同,不完全相同,但偏移值应该是固定的(即00408033不变)。

49、 所以如果你看到被破解的文章里的程序代码的地址值和你自己电脑里的不一样,不要觉得有错,只要你的程序代码是正确的,就不会有问题。

50、 关于如何设置断点;

51、 正确的断点设置对于快速有效的解密非常重要。好的断点设置可以帮助我们快速找到关键的程序段,而不恰当的断点会造成解密不必要的能量消耗,甚至根本无法拦截程序的运行。

52、 但是什么时候用断点合适就不好说了,需要经验积累。一般来说,通用断点bpx hmemcpy对大多数注册代码软件都是有用的。新手不妨多试试这个断点(平时我也是用这个断点设置的,

53、 懒_,哈哈。)。

54、 对于那些需要暴力破解的非注册代码软件,我们通常要拦截对话框(比如bpx DialogBox)和消息框(比如bpx MessageBox(A))。不管是什么样的软件,当我们设置的断点没有效果的时候,

55、 但是可以试试bpx lockmytask。这个断点的作用是拦截任意键的动作。具体的常用断点设置,请参考文章《打破常用断点设置》。

56、 另外,在破解注册码的过程中,通常需要输入用户名和注册码。一般来说,用户名和密码都是可以随意输入的,但是根据我自己的经验,很多软件都会对注册码进行一点一点的处理。如果您输入数字串“78787878”,

57、 那么在跟踪程序的时候我们就无法知道我们当时所看到的'78'倒底是哪一个'78',所以我比较喜欢用'12345678'这样的注册码输入方式,这样的话就就能知道程序是在对注册码的哪一位进行运算,

58、 同样的对于那些需要输入较长序列号的软件,输入类似'12345-67890-ABCDEF'这样的序列号较好。

59、 不过有一点大家需要特别的注意:上面讲的注册码输入方式'12345678'是针对拦截WIN32 API函数来说的,假如有些时候直接拦截WIN32 API函数难以找到程序的突破口,

60、 而要借助于'S'指令在内存中寻找我们输入的用户名或注册码时,就最好不要采用'12345678'作为注册码,因为内存中很可能有许多的'12345678'字符串,

61、 这样我们没有办法知道倒底我们要破解的程序使用的是哪一个'12345678',所以我们应该选择一个不易和内存数据相同的注册码,比如:74747474(本人喜欢用,意思嘛:去死去死。哈哈哈^_^),

62、 对应的搜索指令为: S 30:0 L FFFFFFFF ‘74747474‘ 。当然,以上只是我个人的习惯而已,具体用什么样的输入形式可以根据本人的爱好、习惯来定,不必拘泥于某一固定的模式。

63、 8. 关于如何跟踪程序的问题:

64、 初学者在开始学习解密的时候往往不知道怎么样去跟踪程序,怎么样找到注册码比较的地方,当面对长长的一堆程序代码时显得不知所措。

65、 通常软件的程序内部都会利用一个子程序(即CALL ********)去验证我们输入的注册码正确与否,对于注册码显式存在的程序,一般都会将所输入的注册码和正确的注册码放进寄存器,

66、 然后调用验证子程序进行判断,将结果返回,应用程序根据子程序返回的结果决定是否注册成功,这样的程序经常具有如下的形式:

67、 ****:******** MOV EAX,[********](或PUSH EAX等形式)?

68、 ****:******** MOV EDX,[********](或PUSH EDX等形式)?

69、 ****:******** CALL ********?

70、 ****:******** TEST EAX,EAX (或TEST AL,AL,或是没有这一句等形式)?

71、 ****:******** JNZ ******** (或JZ ********等形式)?

72、 其中EAX和EDX指向的内存区域就是我们输入的注册码和正确的注册码,这里的寄存器EAX和EDX是随意写的,也可以是ECX,EBX,EDI,ESI等等。对于注册码隐式存在的程序,

73、 虽然不能直接看到正确的注册码,但是通常也是先将所输入的注册码地址放进某个寄存器,然后调用子程序去验证,破解时就需要进入子程序去分析注册算法。总之,

74、 看到子程序(call ********)后面跟着跳转指令(JNZ ********或JZ ********)的地方我们就应该提高警惕,

75、 多用D EAX(或EBX、ECX、EDX、EDI、ESI.等)去看看寄存器指向的内存区域藏着什么东西。

76、 有一点大家要提醒大家:看见程序中使用下面这个函数是要注意,即GetDlgItenInt,这个API函数的作用是将输入的文本转化为整数,所以这类程序中是不会有显示存在的注册码的,

77、 因为注册码被转换为整数了,程序通常会用CMP ECX,EDX 这种类型的指令去验证注册码的正确性,这里ECX和EDX中存的就是所输入注册码和正确注册码的整数形式,

78、 此时可以用? edx 和? ecx 看到其十进制形式,即我们输入的形式。

79、 9. 关于软件的反安装问题:

80、 经常我们使用某些软件时都会遇到一个问题,就是共享软件过期之后即使删掉原程序重新安装,程序依然不能用,还是一样提醒你试用期已过请注册;或者是你已经破解了某个软件,但是还想继续研究它,

81、 但是因为软件已经注册好,没有了注册选项,这时你即使彻底删掉程序再重新安装软件,结果程序运行后还是注册过的。

82、 遇到这样的情况,其实原因很简单,因为程序将注册或过期信息存在了系统注册表里,所以简单的重新安装软件是无济于事的。解决的办法就是自己删掉注册表中有关的信息,但是因为注册表是WINDOWS系统工作的基础,

83、 如果不小心就很可能会损坏它而引起系统异常,所以如果你对注册表不是很熟的话,应该在修改之前备份一下注册表。

84、 大部分的应用软件都会将自己的信息存在如下的路径中:HKEY_LOCAL_MACHINESoftware、HKEY_LOCAL_MACHINESoftwareMicrosoft、HKEY_CURRENT_USERSoftware、HKEY_CURRENT_USERSoftwareMicrosoft 或HKEY_USERS.DEFAULTSoftware下,

85、 10. 关于破解练习的问题:

86、 学习破解需要大量的练习,对于破解目标的选择,初学者不宜以大型的、著名的软件为目标,因为这些软件通常加密较为复杂,破解不易,应该选择一些比较不出名的、小型的和早些时候的共享软件来练习,

87、 因为加密相对简单的软件有利于初学者快速掌握破解思想和技能。至于习题的来源则很广泛,可以从网上下载,也可以去市面上购买一些共享软件光盘

以上就是反编译这篇文章的一些介绍,希望对大家有所帮助。

标签:

免责声明:本文由用户上传,如有侵权请联系删除!