CrackMe160-003
爆破思路
输入字符会报错哦,并不是电脑环境的问题
同001、002,这里不做介绍
序列生成
因为是第一次遇到浮点数相关的,以前对这些知识的了解比较少,所以在流程中会夹杂一些基础知识
基本思路002也讲过了,都是首先找到输入的Name产生的最终Serial,然后一步步分析是怎么产生的就可以了
这里我输入的是1111,而最终产生的可以通过一步步执行得到是1066822,下面介绍是如何得到的
这里还是和002一样,首先获取长度,然后长度*15B38,再加上首字母的ANSI值,最后转换成十进制355601
然后这里就涉及到浮点了,首先有个概念,在汇编指令中和浮点有关的指令基本上都是f开头,像这里fld、fdiv之类的
最基本的几个浮点指令fld(入栈)、fstp(出栈),类似于push、pop
不过呢,这个入的栈可不是ss
入的是右边的st(x)
这个st就是一个专门给浮点数(float)用的栈,其他的和正常的栈一样,都是从上往下压栈,右边显示的是十进制
这里fdiv就是浮点数除法,我们可以查看这个dword(双字32位)的值是多少,鼠标右键浮点->浮点(32位)
这里显示的都是有符号的十进制数
所以4082FE这条指令的意思是st(0)/5,可以看到st(0)是10,所以就是10/5,结果为2,存入目的操作数,也就是st(0),所以st(0)就变成2了
后面陆续还有几个操作,这里只放图不说明了
最后这个就可以得到1066822
搞定!
去除NAG
NAG是烦人的意思,这里指一些因为未付费或者未破解的一些弹窗或者开屏广告之类的
关于这个NAG的去除,我查看了一些师傅的介绍,并没有一个容易弄明白的原理性的教程,只是晕晕乎乎学了一个4C法则,因为只学到了皮毛所以这里也只好总结个皮毛
首先来到程序入口点(注意是程序领空不是系统领空,x64bug模块名应该要是主程序的名字)
以下是师傅的原文:(师傅使用的是ollydbg,所以会显示的有些不同)
VB程序有个特点:入口点处都是一个PUSH指令,然后一个CALL指令,看JMP 后面跟的MSVBVM50,应该是VB5.0编写的。(如果不是这种情况的话,那么该程序可能被加过壳), PUSH将要压入堆栈的是004067D4,现在我们在数据窗口中定位到这个地址。显示上图:
现在就要用至4C了,也就是从当前定位的地址往后偏移4C,数据窗口CRTL+G(你也可以用鼠标点),输入4067d4+4c,显示如下:
数据窗口继续跟踪:00406820处的DWORD值,00406868,内容如下:
选中这个dword,右键跟随
这里我们可以看到两块类似的数据,每块50(十六进制)个字节的长度,每块数据的第24(十六进制)个字节处都有一个标志(第一个是01,第二个是00)。该标志指定了每块代码(也就是程序启动后要加载的窗体)出现的顺序,先加载00,也就是我们要去的NAG窗口,再加载01,是主窗口。所以这里我们将各两个标志的值颠倒一下,01改00,00改01,二进制修改,保存文件,运行测试,NAG窗口去除了。
不知为何,我这里的顺序和师傅是反过来的,不过颠倒一下也可以了
这个00和01是执行顺序,只要颠倒了开头的NAG就到程序执行完之后去了,但是程序执行完是在我们点叉叉的时候,所以这个NAG就不会显示啦
可以保存试试看(x64选择补丁文件)