某软件破解实验过程(记录)

本文记录了一次尝试破解带有加密狗验证的专业软件的过程。通过对软件的逆向工程分析,逐步揭示了加密狗验证机制的工作原理,并最终实现了软件的破解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

这是某位前辈的软件,因为加密狗丢了,所以没法用,叫我帮他破解一下看看,我也不确定破解能成功与否,然后这里记录一下过程

刚刚试了一下大概的破解,都不行,这个程序会在运行的时候,先和加密狗通信,确定加密狗存在之后,才会继续运行程序,现在我们就试试,就当练练手


1.软件截图

当我们运行这个软件的时候,如果没有加密狗,会崩出这个东西

图片

然后用IDA打开看看

图片

这里很奇怪

因为一般IDA打开之后,会提示你要不要看那个关系图,除非你关了才没有,但是这个程序不会跳出那个东西

图片

那我们之后无图分析了

函数开始的时候就是做一些基本操作

图片

然后就是准备调用这个0040721c,我们这里留个路标,这里注释一下是我们第一个遇到的函数,比如function_1之类的

我们进来这个函数看看

图片

这里压入了一个参数EBX0,然后就调用了这个函数GetModuleHandleA这个函数

然后EBX的值现在是

EBX

这个值是分配给程序的内存未初始化的垃圾值

所以这个函数是这样的GetModuleHandleA(NULL),返回调用进程本身的句柄

这里是要返回这个程序本身的句柄

然后这个函数的返回值是一个字符串

图片
然后下面继续执行

图片

这里将EAX赋值给了DS: [75A0B8]

然后将EAX置为0之后,又赋值给了DS: [75A0BC]DS: [75A0C0]

然后便是调用函数call 00407210这个东西

图片

其实这个函数就在上面

这里将一个函数赋值给了EAX之后

图片

开始调用00406A04这个函数

然后就是进入下面这些函数

图片

最后函数返回之后

图片

图片

这里EDXEAX是相同的值

然后就准备调用函数004047A8,我们单步调试进去看看

图片

这里其他都不重要,重要的是这个调用的函数004046A0

图片

这里做了一些基本的函数操作
然后就返回了

然后从这个小函数出来后调用了这个00404748

图片

我们单步进入看看

图片

1-5行都是一些基本的函数操作

然后第六行的地方

图片

将这个值00758F08赋值给了EAX

然后test看看EAX是否为0,如果为0的话,JE跳转,在OD中懒得改结果跳去看看的话,可以用IDA搜索这个地址看看

图片

这个函数是退出函数,把栈中的这些值都弹出,然后就返回

然后把EBX0之后,和ESI进行比较

图片

到这里的时候,我们看一下寄存器值

图片

EBX已经被置为了0,不论怎么运行代码,这个值到这里的时候肯定都0,然后ESI的值我们可以看看是哪里改变的

图片

最近一次修改ESI的值是这里,将EAX的值赋值给了它

这里比较之后,这里是用JLE这个指令,这个指令跳转的条件是ZF=1 or SF<>OF

什么SF什么OF什么的我们暂时不管,就看ZF的值,如果CMP ESI, EBX中,ESIEBX的值相等,ZF=1,那这个JLE就会跳转,这时候就不用管SFOF

然后我们看看会跳去哪里

图片

然后这个函数就是来到这里,做了一些操作之后,又会跳去4047A2这个地方,4047A2之后就会返回了

看来这个函数是不能跳转的

函数这里通过一个赋值给EAX的方式,调用函数

图片

MOV EAX, DWORD PTR DS: [EDI + EBX * 8]这个指令,EBX刚刚才被置为了0

这里就是把EDI的地址执行的值给了EAX这个地方

图片

现在的EAX=00407290, 这个函数我们可以用IDA找找看看

图片

就是这里,然后我们执行,此时对应内存地址的内存如下

图片

执行之后

图片

这里稍微说明一下BYTEWORD还是DWORDBYTE字面意思就是只会修改一位的数据,也是就FF这么多,WORD的话就是FF FFDWORD就是FF FF FF FF这么多的数据

这个函数把76366c的数据都置为了F,因为-1表示为FF ...

然后就return了函数

然后就是这些函数

图片

这里还是要ESIEBX比较大小,这和上面那个是一样的

这时候的寄存器的值

图片

ESI=12Eh也就是302d,然后EBX=1

不过这里的跳转指令是JG了,这个函数的跳转是ZF=0 or SF=OF

我们看看要跳转的地址是什么

图片

这个函数也就是我们刚刚上面执行过的地址

图片

也就这个指令会一直不断的执行这个跳转,循环302遍,,然后直到ESI=EBX,我们再回去看看,下一个要执行的EAX是多少

上一个EAX的值是407290,我们看看此时的EDI

图片

然后是在内存中的值

图片

左上角的四位就是我们刚刚执行那个函数的地址,在地址407290上的操作是

图片
就是把内存地址都置为F的那个操作

然后我们看看下一个地址

图片

然后下一个地址就是407084,也就是内存中的下一行数据的前四个

图片

这个函数在IDA中显示如下

图片

第一行的指令是将7635BC地址上DWORD大小,也就是4BYTE的空间都置为F

然后就是JNB,这个跳转的条件是CF=0,也就是进位标志位,要求就是上面那个操作没有产生进位

我们去内存中看看7635BC地址上的数据

图片

不出所料,都是0,那sub之后肯定会产生一个借位,所以一定的是CF=1

的确,我们执行完之后,CF=1

图片

然后这个函数就会跳转,我们看看会跳到哪里

图片

函数跳转之后就是一个返回结束,我们看看如果不返回会发生什么

所以如果没有产生借位,就会返回退出,这是一种测试内存地址是否为0的方式

然后我突然就把这个软件破解了。。。。不写了。。。就是一个判断跳转改一下的问题哈哈哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值