Crackme--ajj1

先说坑点,之前一直有x32dbg在调,没发现反汇编代码的不同造成的影响,在做这一题的时候,被坑的有点惨。
这是od的反汇编代码
image
这是在x32dbg下的反汇编代码
image
只有在内存窗口查看才能看出是消息处理函数的函数名
image
回到正题,解决这道题
首先先用peid看下程序,发现是gui程序且用delphi编写的
image
然后使用DeDeDark反编译一下,从事件中我们可以看到有单机、双击、按键抬起等事件,这里还有消息处理函数的入口地址
image
这个程序是没有登录之类的按钮的,猜测可能与某个事件监听有关
image
这两个编辑框的消息处理函数一个叫KeyUp,一个叫chkcode
image
我们需要在程序中找到这两个消息处理函数的入口看看对输入做了哪些处理
在程序中大致翻一遍可以看到我们要找的消息处理函数的名以及函数地址
image
0x457e4c这个地址的函数是用户名编辑框的消息处理函数,0x457c40是序列号一栏的消息处理函数
先看下用户名这块的处理
输入一个字符的时候,exa=1,同时0x004e1c00地址处的值也变为了1
image
image
取消断点,在用户名一栏输入,观察此处内存值的变化,可以看到每当我输入一个字符,这里的值就+1,而且数值与字符长度相等
image
再看下注册码这块的处理
先快速调一遍这部分代码,可以看到出现了一个注册码的东西
image
分析下组成:

黑头Sun Bird+数字+dseloffc-012-ok+用户名

除了数字和用户名之外,其余两部分都是固定值
用户名这部分没做额外的处理,那就看看这个数字是怎么来的吧
这部分代码的意思是,先将之前计算出的用户名长度赋值给esi,再给esi+5,此时esi=10和我们之前看到的数字部分相等
image
注册机代码如下:


#include <stdio.h>
#include <string.h>
int main()
{
    char szBuffer[30] = {0};
    printf("请输入用户名:");
    scanf("%s", szBuffer);
    int len = strlen(szBuffer);
    printf("黑头Sun Bird%ddseloffc-012-OK%s", len+5,szBuffer);
    return 0;
}

此时即使输入正确的用户名和序列号,仍然无法通关,因为还差最后一步。
我们追踪下注册成功的字符串,发现此字符串处于鼠标单击事件的响应消息中,需要我们在输入正确的用户名和序列号后双击验证,再单击才能显示图片。(具体验证过程下回分解)
image
最终就能看到女神的图片啦!!!
image

posted @ 2023-07-28 14:56  墨宸  阅读(57)  评论(0)    收藏  举报