Crackme7-笔记

大神的链接:https://www.52pojie.cn/thread-613691-1-1.html
太难了….搞不定…..看了答案都搞不定…..注册机写不出来…..
一、爆破
找到关键函数和关键跳转即可爆破,简单略
二、破解算法
这里写图片描述
1、进入点击注册键的程序入口点,进入关键函数
这里写图片描述
进入0x442FB9处的关键函数,查看算法

004429A8  /$  55               push ebp
004429A9  |.  8BEC             mov ebp,esp
004429AB  |.  83C4 F4          add esp,-0xC
004429AE  |.  53               push ebx
004429AF  |.  56               push esi
004429B0  |.  57               push edi
004429B1  |.  894D F8          mov [local.2],ecx                        ;  [local.2] = 用户名
004429B4  |.  8955 FC          mov [local.1],edx                        ;  edx = [local.1]
004429B7  |.  8BF8             mov edi,eax                              ;  edi = eax = 182a
004429B9  |.  8B45 F8          mov eax,[local.2]
004429BC  |.  E8 2712FCFF      call aLoNg3x_.00403BE8
004429C1  |.  33C0             xor eax,eax
004429C3  |.  55               push ebp
004429C4  |.  68 7A2A4400      push aLoNg3x_.00442A7A
004429C9  |.  64:FF30          push dword ptr fs:[eax]
004429CC  |.  64:8920          mov dword ptr fs:[eax],esp
004429CF  |.  8B45 F8          mov eax,[local.2]
004429D2  |.  E8 5D10FCFF      call aLoNg3x_.00403A34
004429D7  |.  83F8 04          cmp eax,0x4
004429DA  |.  0F8E 82000000    jle aLoNg3x_.00442A62
004429E0  |.  33DB             xor ebx,ebx                              ;  ebx清零
004429E2  |.  8B45 F8          mov eax,[local.2]
004429E5  |.  E8 4A10FCFF      call aLoNg3x_.00403A34
004429EA  |.  85C0             test eax,eax
004429EC  |.  7E 38            jle short aLoNg3x_.00442A26
004429EE  |.  8945 F4          mov [local.3],eax                        ;  [local.3] = 长度
004429F1  |.  BE 01000000      mov esi,0x1                              ;  esi = 1
004429F6  |>  8B45 F8          /mov eax,[local.2]                       ;  eax = 用户名
004429F9  |.  E8 3610FCFF      |call aLoNg3x_.00403A34
004429FE  |.  83F8 01          |cmp eax,0x1                             ;  eax = 长度
00442A01  |.  7C 1D            |jl short aLoNg3x_.00442A20
00442A03  |>  8B55 F8          |/mov edx,[local.2]                      ;  edx = 用户名
00442A06  |.  0FB65432 FF      ||movzx edx,byte ptr ds:[edx+esi-0x1]    ;  取第一个字母“5”
00442A0B  |.  8B4D F8          ||mov ecx,[local.2]
00442A0E  |.  0FB64C01 FF      ||movzx ecx,byte ptr ds:[ecx+eax-0x1]    ;  取最后一个字母“n"
00442A13  |.  0FAFD1           ||imul edx,ecx                           ;  edx * ecx = 16c6
00442A16  |.  0FAFD7           ||imul edx,edi                           ;  edx = edx * edi
00442A19  |.  03DA             ||add ebx,edx                            ;  ebx = 0
00442A1B  |.  48               ||dec eax                                ;  长度-1
00442A1C  |.  85C0             ||test eax,eax
00442A1E  |.^ 75 E3            |\jnz short aLoNg3x_.00442A03
00442A20  |>  46               |inc esi                                 ;  esi + 1
00442A21  |.  FF4D F4          |dec [local.3]                           ;  长度-1
00442A24  |.^ 75 D0            \jnz short aLoNg3x_.004429F6
00442A26  |>  8BC3             mov eax,ebx                              ;  eax = 0
00442A28  |.  99               cdq
00442A29  |.  33C2             xor eax,edx
00442A2B  |.  2BC2             sub eax,edx                              ;  eax = 0
00442A2D  |.  B9 2A2C0A00      mov ecx,0xA2C2A                          ;  ecx = 0xA2CAA
00442A32  |.  99               cdq
00442A33  |.  F7F9             idiv ecx                                 ;  eax/ecx = eax ...edx
00442A35  |.  8BDA             mov ebx,edx
00442A37  |.  8B45 FC          mov eax,[local.1]                        ;  算法
00442A3A  |.  B9 59000000      mov ecx,0x59
00442A3F  |.  99               cdq
00442A40  |.  F7F9             idiv ecx                                 ;  [local.1]/59取整
00442A42  |.  8BC8             mov ecx,eax
00442A44  |.  8B45 FC          mov eax,[local.1]
00442A47  |.  BE 50000000      mov esi,0x50
00442A4C  |.  99               cdq
00442A4D  |.  F7FE             idiv esi                                 ;  [local.1]/50取余
00442A4F  |.  03CA             add ecx,edx                              ;  加上刚[local.1]/59取整的结果
00442A51  |.  41               inc ecx                                  ;  +1= A4
00442A52  |.  894D FC          mov [local.1],ecx
00442A55  |.  3B5D FC          cmp ebx,[local.1]                        ;  结果与ebx作比较
00442A58  |.  75 04            jnz short aLoNg3x_.00442A5E              ;  关键跳转
00442A5A  |.  B3 01            mov bl,0x1
00442A5C  |.  EB 06            jmp short aLoNg3x_.00442A64
00442A5E  |>  33DB             xor ebx,ebx
00442A60  |.  EB 02            jmp short aLoNg3x_.00442A64

发现程序是,对用户名进行一定的运算后,与[local.1]/0x59取整 + [local.1]/0x50取余 + 1的结果进行比较,如果相同则隐藏按钮,否则不隐藏。
但是算法写不出来…..巨麻烦……日后再写吧…..

2、先直接爆破,将0x442a58处代码nop掉,运行,则成功隐藏register按钮,同时出现again按钮,保存文件。
这里写图片描述
对again按钮点击事件下断,发现关键函数和register按钮的关键函数相同,那就不用对他研究了。

3、仔细研究register关键函数的代码发现,最后算法实现时发现
(edi 老是为0,导致后面的eax老是为0,然后后面整个算法都不懂了,看了大神写的才发现自己太急躁啦,就不能耐心点好好追溯吗??)
这里写图片描述
而edi是由eax赋值而来:
这里写图片描述
而eax是在函数外被ds:[0x445838]赋值:
这里写图片描述
找ds:[0x445838]的来源,发现上次被赋值竟然是在输入注册码不正确时,被跳过了!所以……..考虑是不是得输入错误一次注册码(太难想了吧!!膜拜大神!!服气服气!!)
经过测试果然如此,先输入错误一次注册码(不是全数字即可),程序进入
这里写图片描述

4、那么,对于0x442F86处 mov ds:[0x445838],eax 中的eax是多少呢?所以进入0x442F81函数查看
这里写图片描述
python实现这个算法:

# -*- coding:utf-8 -*-
# 1、根据注册码(字符串)计算eax的值
string = raw_input("请输入注册码:")# 例如:abc123
i = 1
sum = 891 # 0x37B
while i < len(string):
    a = ord(string[i]) % 17 + 1
    b = ord(string[i-1]) * a
    sum =  sum + b
    #print sum
    i += 1
print sum # 6186=0x182a

然后运行,输入正确形式的注册码,则再次断在register入口处,但是这次跳过了非正确输入的代码段,进入关键函数,但是太复杂,搞不懂…..
python实现一点点:

name = raw_input("请输入用户名:")
i = 0
temp = 0
while i < len(name):
    j = len(name) - 1
    while j >= 0:
        temp = temp + ord(name[i]) * ord(name[j]) * sum
        j -= 1
    #print temp
    i += 1
print temp

猜你喜欢

转载自blog.csdn.net/qq_15727809/article/details/79857983
今日推荐