creakme 学习

Welcome to http://aiqg.vip/

密码: 4x5q

#Acid burn


这里写图片描述

点击Cheak it Baby!弹出
这里写图片描述

OD按字符串定位到字符串
网上翻发现取了ID前四个字符 并进行了一系列运算(后来发现与key完全没有关系)
这里写图片描述

向下步过发现
这里写图片描述
跟进
这里写图片描述
再跟进发现一段
这里写图片描述
这里不断循环求eax/10的余数 直到eax为0(不就是把eax上的十六进制数转换成十进制数么)… 向上翻 发现eax是从0x431750来的
重新调试 发现0x431750的相关计算
这里写图片描述

=>>取ID的第一个字符 乘以0x29 然后自己加自己一次

综上 对于任意ID(多于4个字符)的key就是:
取ID的第一个字符 乘以0x29 然后自己加自己一次 得到一个十六进制数 再转换成十进制
再将key组合
CW-(转换得到的十进制数)-CRACKED
附上代码

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string input;
    cin>>input;
    cout<< "CW-"<<inputp[0]*0x29+input[0]*0x29<<"-CRACKED"<<endl;
    return 0;
}

这里写图片描述

在"Try Again!"处下断点 程序停在"Check it Baby!“按钮上
这里写图片描述
可以发现有一个字符串"Hello Dude!”
以及下面的跳转
进入42F4D0处调用的函数

004039FC  /$  53            push ebx
004039FD  |.  56            push esi
004039FE  |.  57            push edi
004039FF  |.  89C6          mov esi,eax
00403A01  |.  89D7          mov edi,edx
00403A03  |.  39D0          cmp eax,edx
00403A05  |.  0F84 8F000000 je Acid_bur.00403A9A
00403A0B  |.  85F6          test esi,esi
00403A0D  |.  74 68         je short Acid_bur.00403A77
00403A0F  |.  85FF          test edi,edi
00403A11  |.  74 6B         je short Acid_bur.00403A7E
00403A13  |.  8B46 FC       mov eax,dword ptr ds:[esi-0x4]
00403A16  |.  8B57 FC       mov edx,dword ptr ds:[edi-0x4] 
00403A19  |.  29D0          sub eax,edx
00403A1B  |.  77 02         ja short Acid_bur.00403A1F
00403A1D  |.  01C2          add edx,eax
00403A1F  |>  52            push edx
00403A20  |.  C1EA 02       shr edx,0x2 
00403A23  |.  74 26         je short Acid_bur.00403A4B
00403A25  |>  8B0E          /mov ecx,dword ptr ds:[esi] 
00403A27  |.  8B1F          |mov ebx,dword ptr ds:[edi]  
00403A29  |.  39D9          |cmp ecx,ebx
00403A2B  |.  75 58         |jnz short Acid_bur.00403A85
00403A2D  |.  4A            |dec edx  
00403A2E  |.  74 15         |je short Acid_bur.00403A45
00403A30  |.  8B4E 04       |mov ecx,dword ptr ds:[esi+0x4]
00403A33  |.  8B5F 04       |mov ebx,dword ptr ds:[edi+0x4]
00403A36  |.  39D9          |cmp ecx,ebx
00403A38  |.  75 4B         |jnz short Acid_bur.00403A85
00403A3A  |.  83C6 08       |add esi,0x8
00403A3D  |.  83C7 08       |add edi,0x8
00403A40  |.  4A            |dec edx
00403A41  |.^ 75 E2         \jnz short Acid_bur.00403A25
00403A43  |.  EB 06         jmp short Acid_bur.00403A4B
00403A45  |>  83C6 04       add esi,0x4
00403A48  |.  83C7 04       add edi,0x4
00403A4B  |>  5A            pop edx   
00403A4C  |.  83E2 03       and edx,0x3
00403A4F  |.  74 22         je short Acid_bur.00403A73
00403A51  |.  8B0E          mov ecx,dword ptr ds:[esi] 
00403A53  |.  8B1F          mov ebx,dword ptr ds:[edi]
00403A55  |.  38D9          cmp cl,bl
00403A57  |.  75 41         jnz short Acid_bur.00403A9A
00403A59  |.  4A            dec edx
00403A5A  |.  74 17         je short Acid_bur.00403A73
00403A5C  |.  38FD          cmp ch,bh
00403A5E  |.  75 3A         jnz short Acid_bur.00403A9A
00403A60  |.  4A            dec edx
00403A61  |.  74 10         je short Acid_bur.00403A73
00403A63  |.  81E3 0000FF00 and ebx,0xFF0000
00403A69  |.  81E1 0000FF00 and ecx,0xFF0000
00403A6F  |.  39D9          cmp ecx,ebx
00403A71  |.  75 27         jnz short Acid_bur.00403A9A
00403A73  |>  01C0          add eax,eax
00403A75  |.  EB 23         jmp short Acid_bur.00403A9A
00403A77  |>  8B57 FC       mov edx,dword ptr ds:[edi-0x4]
00403A7A  |.  29D0          sub eax,edx
00403A7C  |.  EB 1C         jmp short Acid_bur.00403A9A
00403A7E  |>  8B46 FC       mov eax,dword ptr ds:[esi-0x4]
00403A81  |.  29D0          sub eax,edx
00403A83  |.  EB 15         jmp short Acid_bur.00403A9A
00403A85  |>  5A            pop edx  
00403A86  |.  38D9          cmp cl,bl
00403A88      75 10         jnz short Acid_bur.00403A9A
00403A8A  |.  38FD          cmp ch,bh
00403A8C      75 0C         jnz short Acid_bur.00403A9A
00403A8E  |.  C1E9 10       shr ecx,0x10
00403A91  |.  C1EB 10       shr ebx,0x10
00403A94  |.  38D9          cmp cl,bl
00403A96      75 02         jnz short Acid_bur.00403A9A
00403A98  |.  38FD          cmp ch,bh
00403A9A  |>  5F            pop edi  
00403A9B  |.  5E            pop esi  
00403A9C  |.  5B            pop ebx  
00403A9D  \.  C3            retn

看到了一系列的跳转和cmp
基本上就是字符串对比了
跟一遍发现是将输入与"Hello Dude!"对比
=>得出key:Hello Dude!

repne scas byte ptr es:[edi]指令:
1、常用于求字符串长度
2、遇到字符串与al相等的值或ecx为0停止。
经典的求字符串长度代码。


#Afkayas


随意输入点东西
这里写图片描述

根据字符串找到弹出提示的跳转
向上翻 找到点击OK后开始运行的代码
下断点一步步跟
到这里发现EAX似乎组合出了key
这里写图片描述
copy出来试试看.正确
这里写图片描述
再跟一遍关注682814在哪第一次出现
发现是由16进制转换来的
0xA6B3E转换成682814
这里写图片描述

关注0xA6B3E在哪第一次出现
这里写图片描述
edi为0xA6B3E 之前加了个edx(0x61 正好是’a’)

00402436     03FA          add edi,edx     

再往前看 发现edx与ax有关

00402433    0FBFD0        movsx edx,ax

发现edi乘了个0x17CFB

00402420    69FF FB7C0100 imul edi,edi,0x17CFB

再往前 发现edi来自eax (这里eax正好保存的是ID的字符串长度)

0040241B     8BF8          mov edi,eax

由此可以推出计算key的第一步是将ID的长度乘以0x17CFB

进入0x40242D处的函数看看eax怎么来的
发现把’a’(0x61)放到了ax里
这里写图片描述
所以最后一步就是ax将保存的’a’传给edx
然后edx和edi相加

得出key的计算:
取ID的长度乘以0x17CFB再加上ID的第一个字符转行成十进制
然后组合字符串
AKA-(转换得到的十进制数)
代码如下

#include <iostream>
#include<string>
using namespace std;
int main()
{
    string input;
    cin>>input;
    cout<< "AKA-"<<input.length()*0x17cfb+(int)input[0]<<endl;
    return 0;
}

#AfKayAs.2

随意输入点东西
这里写图片描述
同上题 断在"Try Again"处找到OK按钮逻辑 然后从按钮开头一步步走
发现有个特殊字符串(ID为abcdefg)"1866958"尝试输入 正确
开始寻找"1866958"第一次出现的位置
发现第一次是以浮点数形式出现的
由 1866958.000 减 -15 得来 (可以找到-15是常量)
这里写图片描述
于是开始寻找1866958.000第一次出现的位置
发现是由1866945.000减2.000得来
而1866945.000是由622315.000乘以3.000得来(可以找到3.000是常量)
这里写图片描述
于是开始寻找622315.000第一次出现的位置
发现是由622313.000 + 10/5得来 (10 和 5 都是常量)
这里写图片描述
于是开始寻找622313.000第一次出现的位置
发现是由0x97E88 + ‘a’(输入ID的首位) 得来
而0x97E88 是由7(abcedfg的长度)乘以0x15B38(常量)得来
这里写图片描述

将以上分析倒过来即是程序取得key的逻辑
(输入ID的长度 * 0x15B38 + 输入ID的首位 + 10/5) * 3 - 2 - (-15)
然后转换成十进制

input:abcdefg
7(length) * 0x15B38 = 622216
622216 + ‘a’ = 622313(0x97E99)
622313 + 10/5 = 622315
622315 * 3 = 1866945
1866945 - 2 = 1866943
1866943 - (-15) = 1866958
1866958 (0x30D12C)

附上代码

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string input;
    cin>>input;
    cout<<( input.length() * 0x15B38 + (int)input[0] + 10 / 5 ) * 3 - 2 - (-15)<<endl;
    return 0;
}

#ajj.1

(未完成)
一封来自历史的信件 …

前两天我和[CCG]的大哥Sun Bird兄闲聊时引出一个话题,
我要想想办法难为一下Sun Bird兄。
因此就用了两个半天的时间,作了一个小东东。
这个CKme与一般的软件注册过程不一样,它没有"确定"键,
当然CK这样的软件其实一点也不麻烦,没遇到过的朋友可要动动脑子了。 8)
另外这个CKme还作了一点别的手脚,不多说了,自己看着办吧。
这个软件是用Delphi编的,由于我刚学了一星期的Delphi,
有很多想法在这个小程序里没有实现,因此这个CKme应该算是比较简单的了。
如果你成功的注册了,请给我来封信好吗?谢谢!!!
还有你千万不要告诉我你只用了2分钟就搞定了,如果是这样我就。。8~~~(
ajj
2000/08/30
欢迎光临我的主页
http://ajj.126.com
oicq:396717

随便输入点东西
这里写图片描述
点击灰色方块
没有失败提示信息
直接搜索字符串
这里写图片描述
有个成功的提示
在上方的跳转下断
发现在0x458031处有一个关键比较
这里写图片描述
必须等于0x85才能成功

cmp dword ptr ds:[esi+0x30C],0x85

上翻找到了ds:[esi+0x30C]被mov的地方
然鹅不知道怎么让程序运行到此(显然至少有两处关键的比较)
这里写图片描述

百度后才知道这题是真的特殊…

1、程序获取了按键弹起的信息 记录字符数(所以不能复制粘贴) (然鹅字符是按下按键时输入的。有个骚操作…在其他地方按下按键,然后鼠标选定注册码框,再松开按键,程序仍然判断为输入,但输入框并没有这个字符)
2、需要先双击灰色方框(完成关键的赋值),再单击灰色方框完成关键的跳转。

参考链接:
https://www.52pojie.cn/thread-613337-1-1.html

另外百度了一下ajj的题…
基本上解法都和开魔法阵一样…

第一步:新建一个路径为X:\ajj.126.c0m\j\o\j\o\ok.txt的文本文件,文件内容的二进制为 20 61 6A 6A D0 B4 B5 C4 43 4B 6D 65D5 E6 C0 C3 21 FF FF,给出二进制的原因主要是因为后面两个字符FF FF打文本打不出来,这句话的文本显示为“ajj写的CKme真烂!这个文件的作用就是会在界面中多显示出一个输入框(下面记为Edit2),但是初始是禁用的,输不了东西。
第二步:打开程序,初始化完成之后,鼠标右键点击“注册”按钮5次。记住一定是鼠标右键,而且必须是点击5次,如果点错不要找我哦;

第五步:输入完成之后,双击Edit2;
第六步:在图片3(“性相近“)出现时,移动鼠标从界面的右下角外部进入程序界面;
第七步:在图片2(“性本善“)出现时,移动鼠标从界面的左下角外部进入程序界面;
第八步:在图片 4(“习相远“)出现时,鼠标左键点击1次图片4,右键点击8次图片4.注意这是最后一步,可能每台机器的状况都不一样。请勿按照上面说的点击。 其实这一步中点击图片1(“人之初“),图片2、图片3、图片4哪些图片,鼠标左键和右键各点击多少次,这个是一个很复杂的算法。决定点击方式的参数就是输入的两个字符串,以及程序所在磁盘的剩余磁盘空间,在第五步的双击Edit2时候会计算出一个值存储在ds:[ebx+0x30C]中,根据这个值就可以知道如何点击图片。
——引用自此链接


#aLoNg3x.1

这里写图片描述
打开点击About-Help
得到提示

这里写图片描述这里写图片描述这里写图片描述这里写图片描述

拖进 Delphi Decompiler
直接看到程序的事件
这里写图片描述

0x442A3C让Ok可用(后来发现Cancella消失后 Ok自动变成可用)
这里写图片描述
对于任意ID(至少5个字符)

#include <iostream>
#include <string>
using namespace std;
int main()
{
    int temp;
    //key:
    string input;
    cout<<"输入ID"<<endl;
    cin>>input;
    int key=(int)input.length();
    for(int i=0;i<input.length()-1;i++)
    {
        temp=input[i]*input[i+1]*(i+1);
        key=key+temp;
    }
    key=key-0x29A;
    cout<<"解锁Ok的key:0x"<<hex<<key<<endl;
    return 0;
}

0x442AF4让Cancella消失
1.先取ID的第5(eax+0x4)位,对0x7取余,再加上0x2,得到一个操作数(下称为k)
2.然后计算k!(k的阶乘)
3.最后ID的每一位分别乘以k! 并相加,得到对应的key
这里写图片描述
对于任意ID(至少5个字符)

#include <iostream>
#include <string>
using namespace std;
int main()
{
    int temp;
    string input;
    cout<<"输入ID"<<endl;
    cin>>input;
    int themod=input[4] % 0x7 + 0x2;
    temp=themod-1;
    while(temp!=0)//阶乘
    {
        themod*=temp;
        temp--;
    }
    int ans=0;
    temp=0;
    for(int i=0;i<input.length();i++)
    {
        temp=input[i];
        temp*=themod;
        ans+=temp;
    }
    cout<<"可以让Cancella消失:0x"<<hex<<ans-0x7a69<<endl;
    return 0;
}

0x442BA0由key计算ID

直接进入Ok按钮逻辑
发现有将ID和key保存进eax和edx 然后call
紧接着是个test 通过则Ok按钮消失
这里写图片描述

进入call看看
发现key长度要大于0x5 才能进入加密循环
加密是从key最后一位逐一
1.自乘一次
2.再乘当前字符所在位数
3.对0x19取余
4.余数加上0x41
5.保存
循环之后与ID比较
这里写图片描述
对于任意key(多于5个字符)

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string input;
    string ID="";
    cout<<"输入key:"<<endl;
    cin>>input;
    int temp=0;
    for(int i=0;i<(int)input.length();i++)
    {
        temp=input[i]*input[i];
        temp=temp*(i+1);
        temp=temp%0x19;
        temp=temp+0x41;
        ID+=temp;
    }
    cout<<"能让Ok消失的ID:"<<ID<<endl;
    return 0;
}

思路是先让Cancella消失
然后再让Ok消失
但是找不到ds:[eax+0x47]在哪里被修改(后来发现这是个flag,Cancella消失后修改。所以必须先让Cancella消失)
Cancella消失后 Ok变成可用 所以不需要让Ok变成可用的key了

之前发现了几个switch
以为是根据key进行不同的加密
后来发现是将16进制的key转换成10进制
这里写图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值