先跑一下,这个程序应该是有定时器,多久之后自动开启,测试一下输入,序列号以字母方式输入会出现类型不匹配,之后程序自动退出

但是如果以数字方式输入序列号,则会出现,Try Again,所以这里序列号应该是一个数字

直接找Try Again这个字符串的位置,同上一题,在IDA中还是找不到,所以看Ollydbg,在地址4086f9处,这里是前一部分的标号为

004086DB loc_4086DB

应该是从下面这句跳转过来的

.text:00408677                 jz      short loc_4086DB

验证一下,将00408677处的jz改成jnz,74改75,然后输入序列号111,则可以发现成功了

剩下的就是算法了。

从这个位置往前找,标志位应该是下面这句设置的

.text:00408665                 test    si, si

再往前找,有下面两句影响了si的值

.text:0040862E                 xor     esi, esi

.text:00408653                 neg     esi
xor的操作由下面这段代码决定

.text:0040860A                 fnstsw  ax
.text:0040860C test al, 0Dh        ;低位为0Dh
.text:0040860E jnz loc_4087BF
.text: call ds:__vbaFpR8
.text:0040861A fcomp ds:dbl_401028
.text: fnstsw ax
.text: test ah, 40h        ;也就是说ah不能为40h
.text: jz short loc_40862E
.text: mov esi,
.text:0040862C jmp short loc_408630
.text:0040862E ; ---------------------------------------------------------------------------
.text:0040862E
.text:0040862E loc_40862E: ; CODE XREF: .text:00408625↑j
.text:0040862E xor esi, esi      ;不能走到这里,esi被清零后就会跳到错误路径
.text:
.text: loc_408630: ; CODE XREF: .text:0040862C↑j

往前找到判断函数为__vbaFpR8的返回值,它的高16位不能为40h,这个是浮点寄存器的值

__vbar8Str   将一个字符串转为双精度单精度浮点型(8个字节)的数值形式

.text:004085CE                 mov     eax, [ebp-18h]      ;可以看出函数局部变量值ebp-18h表示的是序列号字符串
.text:004085D1 push eax
.text:004085D2 call ds:__vbaR8Str      ;此时参数为unicode编码字符串"111",也就是输入的序列号字符串
.text:004085D8 mov ecx, [ebp-1Ch]      ;根据下面这个值又可以推测出这个地方局部变量的值
.text:004085DB fstp qword ptr [ebp-0E4h]
.text:004085E1 push ecx            
.text:004085E2 call ds:__vbaR8Str      ;此时参数为unicode编码字符串"4533559"
.text:004085E8 cmp dword_409000,
.text:004085EF jnz short loc_4085F9
.text:004085F1 fdivr qword ptr [ebp-0E4h]
.text:004085F7 jmp short loc_40860A

向上追到这里就可以分析出ebp-18h和ebp-1ch这两个局部变量的值,后面的浮点运算就是比较这两个值,只不过换了形式而已。直接将4533559作为序列号输入,发现直接就可以输出正确结果了。

关于字符串"4533559"的来源就是计算序列号的算法的结果。

过一下整个这段函数,其实只需要关注vbaR8Str、__vbaStrMove、__vbaStrR8这几个函数,其他函数可以直接过掉,整个流程就是不断的将字符串转成浮点数,进行操作之后又转回字符串。

整个算法流程如下:

适合新手的160个creakme(三)的更多相关文章

  1. 适合新手的160个creakme(四)

    这题没有什么特殊字符串,Delphi写的,使用DeDeDark分析一下,找到几个特殊的事件 一个是KeyUp 一个是chkcode 还有就是中间区域的单击或是双击事件 直接跟进去这几个函数,然后找比较 ...

  2. 适合新手的160个creakme(二)

    先跑一下,然后找出关键字符串 关键字符串是You Get Wrong和Try Again,不过IDA好像识别不出来这个字符串,在Ollydbg中右键Search For,寻找所有字符串,可以找到这些字 ...

  3. 适合新手的160个creakme(一)

    先跑一下 直接使用这个字符串去check,发现提示信息有关键字符串 CODE:0042FB80 00000021 C Sorry , The serial is incorect ! 找到这个字符串的 ...

  4. 适合新手小白的UI学习路线完整版

    UI设计是很多年轻人活着想转行学习的人的新职业目标,越来越多的人看到UI设计良好的就业发展前景,纷纷投入到UI设计的大军中来,想学习UI设计,很多小白并不知道从何开始学起,用什么样的方法去学习,所以今 ...

  5. JavaSwing仿QQ登录界面,注释完善,适合新手学习

    使用说明: 这是一个java做的仿制QQ登录界面,界面仅使用一个类, JDK版本为jdk-11 素材包的名字为:素材(下载)请在项目中新建一个名字为“素材”的文件夹. 素材: https://pan. ...

  6. 适合新手:从零开发一个IM服务端(基于Netty,有完整源码)

    本文由“yuanrw”分享,博客:juejin.im/user/5cefab8451882510eb758606,收录时内容有改动和修订. 0.引言 站长提示:本文适合IM新手阅读,但最好有一定的网络 ...

  7. 最适合和最不适合新手使用的几款 Linux 发行版

    大多数知名的Linux发行版都属于"比较容易使用"这一类.一些观察人士可能会驳斥这个观点,但事实上,说到Linux,大多数并非从事IT或软件开发工作的人会被最容易的使用体验所吸引. ...

  8. git和github新手安装使用教程(三步入门)

    git和github新手安装使用教程(三步入门) 对于新手来说,每次更换设备时,github的安装和配置都会耗费大量时间.主要原因是每次安装时都只关心了[怎么做],而忘记了记住[为什么].本文从操作的 ...

  9. python环境搭建-requests的简单安装(适合新手)

    安装完python之后,一定要记住安装后的路径.这是我当前的路径. 下面是requests的安装步骤: 我们这里直接用pip安装(这样比较适合新手),新版python自带pip,python3.6.1 ...

随机推荐

  1. scrapy框架之shell

    scrapy shell scrapy shell是一个交互式shell,您可以在其中快速调试 scrape 代码,而不必运行spider.它本来是用来测试数据提取代码的,但实际上您可以使用它来测试任 ...

  2. H5的pushState与replaceState的用法

    一.简介 HTML5引入了 history.pushState()和 history.replaceState()方法,它们分别可以添加和修改历史记录条目.这些方法通常与window.onpopsta ...

  3. 测试puppeteer模拟度检测

    var puppeteer = require('puppeteer'); const devices = require('puppeteer/DeviceDescriptors'); const ...

  4. Spring boot 配置 Tomcat 临时文件缓存目录

    1. 问题现象 spring boot 项目中,Tomcat 接收到 content-type 为 multipart/form-data 的请求时,需要将接收的文件缓存到临时目录(默认下载 /tmp ...

  5. VUE数组操作方法的局限

    1.不能通过索引值直接设置一个项: vm.items[indexOfItem] = newValue 但是可以用set方法设置: Vue.set(example1.items,indexOfItem, ...

  6. apt如何列出所有已经安装的软件包

    apt如何列出所有已经安装的软件包 转 https://www.helplib.com/ubuntu/article_155294 问题: 我想将所有已安装软件包的列表输出到文本文件中,以便我可以查看 ...

  7. 17. dashboard

    17. dashboard dashboard的安装步骤: wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-bet ...

  8. QPixmap QImage 相互转化

    QPainter p(this); QPixmap pixmap; pixmap.load("E:\\参考文件\\image\\1.jpg"); //QPixmap->QIm ...

  9. scikit-learn机器学习(二)逻辑回归进行二分类(垃圾邮件分类),二分类性能指标,画ROC曲线,计算acc,recall,presicion,f1

    数据来自UCI机器学习仓库中的垃圾信息数据集 数据可从http://archive.ics.uci.edu/ml/datasets/sms+spam+collection下载 转成csv载入数据 im ...

  10. mysql自身报错、java、reids连接mysql数据库报错汇总

    1.Can't connect to local MySQL server through socket 'tmpmysql.sock' (2) 原因是mysql根本没有启动 2.Access den ...