-
-
[旧帖] [求助]incredibuild3_10破解 0.00雪花
-
发表于: 2008-3-18 08:43 3009
-
关于incredibuild的破解分析
经过实验分析出该软件验证方法为:当软件客户端第一次运行时从服务端所在机器取得系统日期然后存于客户端所在机器上(经分析位置在注册表中有4项,在其他地方一定还有,比如某个文件或者某个扇区)
完全破解方法:1 找到代码中计算时间差的地方,跳到正确方向。
过程:因为它的启动方式为以插件形式随VC启动,没办法直接加载加载下对话框断点,所以只能单独加载。先PEID载入查壳,无壳,为Delphi编写。下断GetLocalTime,断在 7C80A7D4 > 8BFF mov edi, edi,F9跟进3次回到应用程序领空,来到调用GetLocalTime的地方向上找,到这一句:
000D61E2 |. E8 553DF4FF call 00019F3C
我分析CALL的该过程是取得系统时间并计算差值,但是问题是我跳过了GetLocalTime程序还是可以取得系统时间,所以我猜测可能它的服务进程也有相关作用,对于它的服务进程我现在没有办法。
完全破解方法:2 就在000D61E2 |. E8 553DF4FF call 00019F3C
这一句之前查看内存地址:0F554C8的内容为”Now”在这一句之后该地址内容为”29”,29即为软件剩余时间,当修改系统时间改变时间差的时候该地址内容也会随着改变,并且总是保证内容是正确的差值(若改变系统时间使时间差大于30天,比如33,则内存中此地址内容为-3)综上分析,我觉得源代码可能是这样:int Temp=(NewTime-StoreTime)
If(Temp>30)
Temp=-Temp%30
If(Temp)可用
else 不可用
地址0f554c8即为变量Temp地址。对此先找到大小合适的文件间隙,改变EIP指针,让程序执行到此的时候先执行我插入的一段指令,然后在跳回。修改后的程序如下:
000D61E2 E8 553DF4FF call 00019F3C
000D61E7 E9 1D6A0100 jmp 000ECC09//转移EIP
000D61EC 90 nop
000D61ED 90 nop
000D61EE 90 nop
000D61EF 8BC6 mov eax, esi
000D61F1 BA 03000000 mov edx, 3
000D61F6 E8 FDDFF3FF call 000141F8
000ECC09 50 push eax
000ECC0A B8 20000000 mov eax, 3230H
000ECC0F A3 C854F500 mov dword ptr [F554C8], eax//直接向该地址写入数据20
000ECC14 58 pop eax
000ECC15 68 C854F500 push 0F554C8 ; ASCII "29"
000ECC1A 68 C8640D00 push 000D64C8 ; ASCII " days left"
000ECC1F ^ E9 CB95FEFF jmp 000D61EF//恢复EIP
000ECC24 0000 add byte ptr [eax], al
000ECC26 0000 add byte ptr [eax], al
经调试运行程序可以正常运行,一段距离内该内存地址内容变为了想要的“20“。
但是弹出对话框还是没有出现剩余20天。出现此问题的原因有二:
第一:是还有其他写内存的位置。(GetLocalTime在程序启动的时候一共调用了三次,没分析出来都是做什么用的)
第二:在这样的环境下用汇编指令直接修改内存内容还有些忽略的地方。(这是我第一次这么干,没想到还真修改成功了,所以我觉得可能是我哪里还有问题)
经过实验分析出该软件验证方法为:当软件客户端第一次运行时从服务端所在机器取得系统日期然后存于客户端所在机器上(经分析位置在注册表中有4项,在其他地方一定还有,比如某个文件或者某个扇区)
完全破解方法:1 找到代码中计算时间差的地方,跳到正确方向。
过程:因为它的启动方式为以插件形式随VC启动,没办法直接加载加载下对话框断点,所以只能单独加载。先PEID载入查壳,无壳,为Delphi编写。下断GetLocalTime,断在 7C80A7D4 > 8BFF mov edi, edi,F9跟进3次回到应用程序领空,来到调用GetLocalTime的地方向上找,到这一句:
000D61E2 |. E8 553DF4FF call 00019F3C
我分析CALL的该过程是取得系统时间并计算差值,但是问题是我跳过了GetLocalTime程序还是可以取得系统时间,所以我猜测可能它的服务进程也有相关作用,对于它的服务进程我现在没有办法。
完全破解方法:2 就在000D61E2 |. E8 553DF4FF call 00019F3C
这一句之前查看内存地址:0F554C8的内容为”Now”在这一句之后该地址内容为”29”,29即为软件剩余时间,当修改系统时间改变时间差的时候该地址内容也会随着改变,并且总是保证内容是正确的差值(若改变系统时间使时间差大于30天,比如33,则内存中此地址内容为-3)综上分析,我觉得源代码可能是这样:int Temp=(NewTime-StoreTime)
If(Temp>30)
Temp=-Temp%30
If(Temp)可用
else 不可用
地址0f554c8即为变量Temp地址。对此先找到大小合适的文件间隙,改变EIP指针,让程序执行到此的时候先执行我插入的一段指令,然后在跳回。修改后的程序如下:
000D61E2 E8 553DF4FF call 00019F3C
000D61E7 E9 1D6A0100 jmp 000ECC09//转移EIP
000D61EC 90 nop
000D61ED 90 nop
000D61EE 90 nop
000D61EF 8BC6 mov eax, esi
000D61F1 BA 03000000 mov edx, 3
000D61F6 E8 FDDFF3FF call 000141F8
000ECC09 50 push eax
000ECC0A B8 20000000 mov eax, 3230H
000ECC0F A3 C854F500 mov dword ptr [F554C8], eax//直接向该地址写入数据20
000ECC14 58 pop eax
000ECC15 68 C854F500 push 0F554C8 ; ASCII "29"
000ECC1A 68 C8640D00 push 000D64C8 ; ASCII " days left"
000ECC1F ^ E9 CB95FEFF jmp 000D61EF//恢复EIP
000ECC24 0000 add byte ptr [eax], al
000ECC26 0000 add byte ptr [eax], al
经调试运行程序可以正常运行,一段距离内该内存地址内容变为了想要的“20“。
但是弹出对话框还是没有出现剩余20天。出现此问题的原因有二:
第一:是还有其他写内存的位置。(GetLocalTime在程序启动的时候一共调用了三次,没分析出来都是做什么用的)
第二:在这样的环境下用汇编指令直接修改内存内容还有些忽略的地方。(这是我第一次这么干,没想到还真修改成功了,所以我觉得可能是我哪里还有问题)
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
他的文章
- [求助]11F6 4198
- [求助]驱动! 4031
- [原创]用户代码查找隐藏进程 4813
- [求助]OD条件断点! 3128
- [求助]关于RSA!!! 3431
看原图
赞赏
雪币:
留言: