psycongroo 发表于 2020-11-5 23:54

[我的代码传]更改FastStoneCapture使用期限

# 往昔
依稀还记得那段在记忆中逐渐模糊的大学时光:那天是某个月的周四晚上。
“哎呀,明天就得交实验课作业的,交报告就算了怎么报告还要截图。”我满脸疑问的说着。
“是啊,太诡异,明明有原件还要搞个复印件,这是搞个球。”舍友一边赶着报告一边附和着。
“话说这报告怎么截,我三页子呢,就算按PtrSc也只能...”还没等我说完,一个煞笔舍友说了:“用FastStone啊,滚动截图。”
“这么神奇还滚动截图,你赶紧发过来给我试试...不是啊,你怎么发的怎么还是正版的,大哥。”
“管他呢,你点试用不就好了,你写个报告要30天那么久?用完就泄啦。”



就这样在说不出具体的日期里,FastSone的滚动截图深深的留在我的脑海里,以至于我毕业设计的报告也是使用的它...

# 如今
如今也毕业两年了,直到最近看到有人发的FastStone的注册码分析过程我才又回想起来,我开始反思既然我那么深爱着这个软件,我能为它做点什么呢?

看着试用期30天剩余日期一天天的减少,就像当时数着倒计时高考以及大学毕业一样,心中倍感交加,于是对于正在学习逆向工程的我,下定了决心要把时间**倒流。**
# 尝试
说是要倒流试用时间,可谈何容易呢?该不会右下角更改系统时间就好了吧...我对自己这种忽然袭来的惊为天人的想法感到可笑和难堪,心想不应该这么容易吧...



草,成了,原本做好面对重重困难的心里准备的我,突然感到一丝难过,我的帖子是不是就这么终结了呢?

既然这样,我就改它的安装时间好了,这样应该会显得更加的“高级”一点,于是我又重新振奋了起来,屁颠屁颠地查了壳并打开了x32dbg,随手搜了30。





万万没想到又直接出来了,很好,非常好,很有精神,然后我们直接来到提示语附近的汇编代码,轻轻往上滑,一个刺眼的跳转出现在了眼前:



这也太直接了吧,我甚至一看到1E就知道这里肯定就是关键跳了。因为1E的十进制就是30,试用期期限的30,那很明显,eax肯定就是一个当前第几天的计数值了,也就是天数差(当前日期减去安装日期)。

我长叹一口气,用着工地英语说道:“Thats so great!”我开始搞不懂我自己了,难道简单快速的解决问题不好吗?我为什么还要对没有如期而至的困难感到难过呢?这不就是吃饱了撑着吗?

这一刻我释怀了,我吹着口哨,网抑云不再抑郁。随后经过一番过于简单的运行,我找到了时间差值来源的call:



在进去之前,为了防止有大量的未被识别的系统函数,我轻快地点开了IDA,并把delphi的相关符号加载,这样Faststone就会显得越来越亲切,对,就像妈一样。



在x32dbg里跟进了call,习惯性的滚动了滚轮,一看,哎呀我的妈,它糊了!



从开始的更改系统时间,查壳,字符串搜索都那么顺利,为什么要这里就糊了。我仔细思考着这些诡异的过程,缓缓说出了一个让我自己也感到充满水平的四字成语:欲盖弥彰。

这里其实就是一个简单的花指令,其实我们不要动滚轮就行了,亦或者把前面的垃圾数据改成0:



当然,我们也可以在IDA里看,这样也是十分清楚的。我们得清楚自己不能被一时的花招所扰乱,遵循自己的原则,先把这层的call都跑过一次,看能不能得出什么信息。

这次结合了IDA,又经过一次算不上困难回溯,发现三个call的功能也十分明显:



注意时间的返回会记录在浮点寄存器中,第一个call返回的便是安装的时间。可以说在使用了IDA并加载对应的符号文件后真的是事倍功倍唷。

整个过程其实就是跟踪值来源,分析call功能,跟踪值来源...这样一个反复且颇有枯燥的过程,继续跟进第一个call,使用上述的方法我们最后到达了一个call里:



此时的我粗略一看,哎呀妈呀全是shr,and位运算心里突然起了毛。可冷静下来仔细一想,有什么加密是全得位运算的,运算类型的单一不就是暗示了什么吗?

经过一顿分析,我得出了答案:这里其实是拿取eax的高16位,通过位运算得出ax年,dx月,cx日,也就是说,这个高16位eax存储了年月日,并通过位移的方法提取出来。

那事情就很简单的,就拿例中eax的高16位为5163h来说,他的二进制是‭‭101 0001 0110 0011‬‬,根据算法,前6位(101000)再加上7BC(1980标准校对时间)就是年,后4位是月,再后面是日:



当我分析出来的时候,无不为自己的聪明才智所折服。天哪,这么简单我怎么看了那么久...

接下来的事情显而易见了,只要找到这个eax高16位的来源就可以了,最后通过层层回溯我们来到了一个神秘的地方:



当然,得通过IDA和x32dbg共同调试才能看清很多函数...话说回来,当我看到这个长得那么像路径的字符串的时候,我已经猜测十有八九的这个安装日期是不是藏在里面:



果然是这样,我拍着桌子大声的呐喊,不知情的人以为我都疯了。这看上去似乎是个配置文件,我也搜到了目标值(这里被我改了)。

到这里,我长叹了一口气,看来是到了结束的时候呢。无论上学的时光多么美好,该来的还是得来了。

小时候渴望成为大人,想买什么就买什么。大学的时候渴望早点毕业,期盼甩开作业,无限期暑假的那一天的到来。如今我只想回到过去,在那充满欢声笑语煞笔舍友的宿舍里,哈哈大笑。

# 后续
锵锵锵,问题来了,不想手动修改文件怎么办呢?这时候我诞生了一个惊奇的想法,用一个工具修改成当前天数,这样时间就会永远定格在30天。于是我打开了vs较为顺畅的写下了些代码:

```
WORD getResult(WORD year, WORD month, WORD day) {
    WORD from1980 = year - 1980;//现在到1980的差值
    WORD encodeYear = from1980 << 9;
    WORD encodeMonth = month << 5;
    WORD encodeDay = day;
    WORD result = encodeYear | encodeMonth | encodeDay;
    cout << "结果为:" << result << endl;
    return result;
}
```
毕竟都知道数据格式了,位运算即可,最后盛上源码和成品:
[点击我进入到gayhub.com](https://github.com/prprDog/FSCapture_ChangeTime)
成品:
(https://share.weiyun.com/CHS2PWGq)

使用方法:找到C:\Users\用户名\AppData\Local\FastStone\FSC目录,将该exe放在下面并运行即可。

ps:使用前请自行备份fsc.db

涛之雨 发表于 2020-11-6 11:27

zhangheng7758 发表于 2020-11-6 10:33
这个软件,我好像一直都在白嫖使用,论坛有单文件的,功能也只用到了滚动截完整网页

Chrome内核浏览器f12打开控制台,按快捷键“Ctrl+shift+p”输入full,敲回车即可网页截图(根据浏览器页面渲染截图)

mokson 发表于 2020-11-6 08:29

nzkboy 发表于 2020-11-6 00:09

好文章,学习了

Dboykey 发表于 2020-11-6 00:35

赶紧学习!谢谢楼主

涛之雨 发表于 2020-11-6 02:04

分析了这么久。。。我以为会是注册机{:301_1008:}

miqi1314 发表于 2020-11-6 06:29

好文,值得学习

bright21vn 发表于 2020-11-6 06:46

他山之石可以攻玉

ciker_li 发表于 2020-11-6 08:02

这个时间是不是还得每隔30天改一次?
为啥不改程序呢

redapple2015 发表于 2020-11-6 08:39

太有才了。好故事啊!

freeflys 发表于 2020-11-6 09:09

不能修改成300天吗?
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: [我的代码传]更改FastStoneCapture使用期限