玩玩破解—加点油,再前行!
本帖最后由 yyhd 于 2021-10-16 00:32 编辑本节课,算是务虚。
我看了一些新人们的回帖,有些朋友看懂了,学会了。
还有一些朋友,依旧迷惘。
原因只有一个:基础知识薄弱。
如果继续迷惘,你可能就会选择放弃了。
想当初,我也和您一样的想法,
所以,我完全能够理解您此刻的状态和心情。
只是,我咬咬牙,选择了坚持!
但是,坚持是非常痛苦的,在黑暗中我一直摸索,
直到有一天我才看到了一线曙光。
有了继续前行的希望和动力。
如果你此刻正处在黑暗中,那么请伸出手,我们一起寻找光明。
结合我曾经的体会,针对新人们常见的困惑,我讲以下三点:
困惑一:为什么有时候能搜到字符串,有时候搜不到字符串?
解答:
当软件作者对“注册失败”、“注册成功”等字符串加密了,你就搜不到了。
那什么叫做对字符串加密?
简单说,比如“注册失败”这四个字,它在计算机内存里的数据见下图:
一个汉字占两个字节,
“注册失败”这四个字的编码就是八个字节:D7 A2 B2 E1 CA A7 B0 DC
如果我们给每个字节的数值都加1,就变成了:D8 A3 B3 E2 CB A8 B1 DD
见下图:
就变成乱码了,当然搜不到“注册失败”这四个字。
你可能会问,既然现在内存里没有“注册失败”这四个字,那为什么我输入假码后出现的错误提示框里明明写着“注册失败”这四个字?
原因就是,软件运行时,把“注册失败”这四个字的编码加1的数据存到一个固定地址里。
等到你输入假码,点登录按钮后,程序在执行弹出信息框之前,会先从这个固定地址里取出数据,然后每个字节的数值都减去1,
然后把结果存到一个地址里,那么,现在的这个地址里的数据是不是就是“注册失败”的编码了。
信息框的内容就可以显示出“注册失败”了。
我们可以把编码加1的行为叫做字符串加密,把编码减1的行为叫做字符串解密。
我们的软件作者只需要在编写软件时,把一个已经加过密的字符串存到一个固定地址里,
等到用的时候,再把字符串解密出来就可以了。
只要在字符串解密之前,你在内存里是搜不到的。
你可能会继续问,那就等到字符串解密以后再搜?
完全可以,不过你要注意的是,解密后存的地址往往不是一个固定地址,
比如,作者编写软件的时候,把解密放在了你点击按钮以后才会执行的代码,那么这个地址就不是固定的了。
这样一来,你就不方便根据字符串的地址引用来定位关键代码了。
当然,现在字符串加密和解密有更专业的方法,不过道理是一样的。
现在你明白了,你为什么有时会搜不到字符串了吧。
困惑二:程序到底是怎么执行的?
我们打开OD后,在代码区可以看到很多行反汇编的代码,
但是程序并不是从上往下一句一句的执行。
当代码遇到JMP\JZ\JE等跳转命令时,它可能会跳到很远的代码处了。
当代码遇到CALL时,它会跳到CALL后面写着的地址。
当代码遇到RETN时,它会跳到原来调用CALL下面的地址。
所以,看似一行行的代码,其实程序在运行时,是上下乱窜的。
我们之所以特别关注大的跳转,就是因为这个跳转很有可能会跳过一大段让我们走向失败的代码。
那么,你可能会问,那我点击登录按钮以后,程序怎么知道该执行哪一段代码呢?
是不是作者在编程的时候设定的呢?
你这个问题,问的好,问到了窗口程序的运行本质。
我们现在的软件,主要是窗口软件,就是软件运行时会出现一个窗口,
窗口里面有菜单、输入框、按钮等等。
我们经常会听到“互动性”这三个字,
是的,窗口软件就具备这个特点。
什么叫做“互动性”,谁和谁互动?
主要是三方互动:软件用户、软件窗口、操作系统这三方。
它们之间怎么互动的呢?
比如现在用户点击了窗口上的一个按钮,我们可以说是“用户动了一下窗口”。
那么既然讲互动,那么窗口就必须要回应,比如弹出一个错误信息框,这就是互动。
等等!千万要等等!必须要等等!
操作系统立马站出来了,满脸黑色,严厉地训斥窗口:谁让你乱动了!
记住,你是我的人,我让你动,你才能动!真是嫁了老公,忘了亲爹!
呵呵,所以我们用户和窗口之间的互动中操作系统一直参与其中。
再回到我们刚才的互动行为。
其实真正的过程是这样的:
我们点击了窗口上的按钮——操作系统监控和捕获我们的行为——把我们的行为告诉给窗口——让窗口拿出事先写好的应急处理预案并执行——如果没有预案,就按照操作系统提供的默认方式执行。
这里有两个关键,
一是操作系统把我们的行为告诉给窗口,可以换个说法就是“把消息发给窗口”。
二是应急处理预案。就是软件作者编程时要写的按钮点击事件的代码。
从这个意义上说,什么叫做软件编程?
就是作者编写一个具备两个功能的程序。
一是要有一个总机室,工作就是接收来自操作系统或者其他软件发来的各种消息。
二是要有一个办公室,工作就是把从总机室获得的消息进行分发。
这个总机室怎么建立呢?微软提供了一个专业的函数,叫做GetMessage(),这个函数就专门收集消息。
那么办公室呢?这个需要软件作者自己建立了,在编程时要写好这个办公室(函数)的名字(地址)。
这个办公室(函数)里,有各部门(比如按钮、菜单)事先提供的各种应急预案(代码)。
比如看到按钮单击消息就执行按钮单击处理代码。
我们拿易语言举例:
我们都会用FF55FC5F5E,见下图:
我们找到的这个CALL就称为按钮事件消息的派发函数,
所有的按钮消息都由它来分发。
分发给谁呢?
给CALL后面的地址,这个地址是可变的,然后程序就会去跳到这个地址去执行代码。
当然,把这个CALL称为按钮事件消息的派发函数也不是太准确。
因为像窗口创建完毕、时钟等消息也要通过这个CALL派发。
根据以上的表述,我们可以这么说,窗口软件的运行机制就是“事件引发、消息驱动、分类处理”。
我们学破解,最关心的就是关键代码,
什么是关键代码呢?
关键代码一定是在作者编写的“处理预案”中。
呵呵,看似废话,但是你想想看,作者的处理预案有很多,你要找的就是其中之一,比如按钮事件的处理预案。
所以,破解软件,最直接有效地方法就是能够快速定位到按钮事件。
好在,前人已经给我们总结好了。
比如VC和MFC的“sub eax,0a”,易语言的“FF55FC5F5E”。
VB的“816C24”,Delphi的“740E8BD38B83????????FF93????????”。
当然,你可能会羡慕他们怎么知道这些特征码?
就是他们了解这些不同语言的消息派发机制,摸索出来的。
呵呵,他们属于会找“办公室”的人。
困惑三:软件窗口、进程、线程之间的关系
这个比较复杂了。
我水平也有限,只能简单说说。
软件窗口就是当你运行软件时呈现在电脑屏幕上的窗口。
每个窗口都有一个句柄,呵呵,我们把句柄换个字“把柄”。
什么叫“把柄”,就是有了这个把柄,我就可以操纵你。
呵呵,所以,如果我们要对窗口进行操作,只要拿到这个窗口的句柄(把柄)就可以了。
比如,你想写一个外挂,对游戏窗口的某个按钮进行持续点击。
那么你就可以先取得这个游戏窗口的按钮句柄,然后用SendMessagess()这个发送消息函数给这个游戏窗口持续发一按钮单击的消息就可以了。
别忘了,我们刚说过“消息驱动”。
进程是什么?
进程就是软件执行时的内存空间,我们经常说每个软件有4GB的内存空间,这个空间就叫做进程。
进程的作用就是提供存储在这个内存空间里的资源。
我们也可以简单理解,进程就是一个软件运行时的内存。
呵呵,进程有没有把柄?
必须有,官方称谓是进程句柄。
和窗口句柄一样,如果你取得一个软件的进程句柄,你就可以对这个软件的内存进行操作。
比如读某个内存地址的数据,或者把数据写到某个内存地址里。
很多内存挂的原理就是如此。
比如先找到人物血量的地址,然后找到这个游戏进程的句柄,
然后用一个读内存数据的命令,加上一个计时器,每3000秒读取一次,
如果血量的数值小于20,就用一个写内存数据的命令,写入100。
这样,人物就不会死了。
最后一个是线程。
线程就相当于在进程这个空间里完成任务的人。
我们可以打个比方,进程就是办公室,它提供了桌椅板凳、电脑等各种资源,
我们每一个办公人员在办公室工作,就是在执行一个线程。
线程必须要依赖进程的资源。
线程是动态的,进程是静态的。
你也可以把线程看成是不同的工作任务。
我们每个软件运行起来以后,都有一个进程和一个主线程。
当然,办公室可以有两个或者更多的人在工作,
所以一个进程里面也可以有多个线程。
你可能会问,一个软件要多线程干什么?
原因就是,可以同时执行不同的工作。
比如,我们一些作者对软件进行一些反调试的处理。
软件启动后,会新开一个线程。
这个线程的工作就是对当前的调试进行检测。
还有的作者会把一些关键的数据放在新开的线程里。
如果你跳过了这个线程,软件将无法获得关键数据。
以上的内容,我觉得有必要在此给新人们交流一下,起到解惑的作用。
当然,我也是新人,在这些知识的理解上也只是皮毛,错误之处,敬请谅解。
其实,这些东西当初也困扰了我许久。
查了一些资料,但是总是搞不太明白。
希望我的一些认识和感悟能够给新人们一点启发。
最后,给大家提供一个刚写的CM,大家玩玩。
剧透一下:
这个软件对于新手有些挑战。
软件验证用到了线程。
兄弟们,一起玩玩吧!
如果您觉得我发的内容确实对您有所帮助,请麻烦您支持一个热心值,进行精神鼓励,也是我继续写下去的动力!
玩玩破解,写给新人看(第一集)
玩玩破解,写给新人看(第二集)
玩玩破解,写给新人看(第三集)
玩玩破解,写给新人看(第四集)
玩玩破解,写个新人看(第五集)
玩玩破解,写给新人看(第六集)
玩玩破解,写给新人看(第七集)
玩玩破解,写给新人看(第八集)
玩玩破解,写给新人看(第九集)
玩玩破解,写给新人看(第十集)
玩玩破解,写给新人看(第十一集)
玩玩破解,写给新人看(第十二集)
玩玩破解,写给新人看(阶段练习1)
玩玩破解,写给新人看(第十三集)
玩玩破解,写给新人看(第十四集)
玩玩破解,写给新人看(第十五集)
玩玩破解,写给新人看(第十六集)
玩玩破解,写给新人看(第十七集)
玩玩破解,写给新人看(第十八集)
玩玩破解,写给新人看(第十九集)
玩玩破解,写给新人看(第二十集)
玩玩破解,写给新人看(第二十一集)
玩玩破解,写给新人看(第二十二集)
玩玩破解,写给新人看(第二十三集)
玩玩破解,写给新人看(第二十四集)
闲谈如何破解软件?
玩玩破解——小白实战1,你也行!
玩玩破解——小白实战2,巧搜字符串
玩玩破解——小白实战3,易语言字符串比较通杀
玩玩破解——小白实战4,冰火两重天
对新人们学习《玩玩破解》系列教程的集中解答
玩玩破解—加点油,再前行!
52POJIExlove 开局搜test edx,3 在真假码对比处下断点
再搜FF55FC5F5E并对其下断点后单步步进(F7进入)
持续往下单步步过(F8单步执行),直到有个call跳转到了我们之前在真假码对比处下的断点处
再接着F8,直到一个小跳过,因为我之前都是拿qwe测试的,所以经常运行到这里不会跳过去而进入下面的call,然后报错数组长度不够,可以直接nop掉或者进去后直接把第一行改成retn即可,
或者直接把这个跳转改成jmp爆破都是可行的
最后运行到一个call下面有个jmp,跟随jmp可以发现直接就结束了,所以到现在还没看到成功画面的我们知道这个call肯定很重要,按F7跟进去看看
由于手指按废了,我直接F9运行了,发现程序又一次断在了真假码对比处,跳出去接着F8
一路F8,路过几次真假码对比没发现啥有用的,也没有啥关键跳就没关,一直到这个地方发现有个大跳,赶紧停下来看一看啥情况
再接着运行发现就成了...破解码是52POJIExlove,"52POJIE"和"x"我都放上了,后面那个love我跳过了,大家可以自己在那几次真假码对比中找到
朴实无华的流程,我也试过GetWindowTextA或者别的啥操作,但是都太麻烦了,最后只能通过FF55FC5F5E的按钮特征码和test edx,3 真假码对比的特征码来下断点调试,
如果大家有更好的方法欢迎告知我一下
前排学习,感谢大神的精彩文章 感谢老师老师的教程最棒 感谢不吝赐教 楼主好文章,小白受教了。
前排学习,感谢大神的精彩文章 52POJIExyyhd 我看不懂,但是还要攒一下 不错,通俗易懂,认真看完了。 此帖能解开小白许多困惑,感谢大佬的分享!