0%

crackme160

介绍

软件破解相关知识。

破解

Acid burn

破解

  1. 首先查壳是VC写的。使用BP快捷操作中的BP MessageBoxA操作对消息框进行截断,

  1. 运行程序,进入Serial/Name子程序,输入任意字符串,点击Check It Baby

  1. 进入调用堆栈Alt+K或者小按钮k查看,找到调用函数,右键显示调用.

  1. 向上翻找,找到入口处,设下断点。

  1. 再次运行程序,在断点处截断,查看右下角堆栈处右键选择反汇编窗口跟随。或者再次通过Alt+k找到调用堆栈,跳转至调用函数。

  1. 找到注册码生成的核心逻辑。

注册机

  1. 核心逻辑

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main(){
char* serial="abcd";
int tmp1 = serial[0];
int tmp2 = tmp1*0x29;
int tmp3 = tmp2+tmp2;
printf("CW-%d-CRACKED",tmp3);
}

  1. 注册码组装。

  1. 点击Serial按钮,进入子程序,和上面方法一样,BP MessageBoxA下断点。最后找到固定的注册码。

Afkayas.1

破解

  1. 查壳是VB写的,正常运行程序发现有MessageBox,故使用VB的快速特征断点。BP rtcMsgBox,运行程序,输入伪码,断下程序。

  1. 查看调用堆栈,追踪最上面的目标,就是函数调用方的地址,右键。跟随目标。

  1. 向上寻找关键跳转,设置断点,使用nop填充,使用补丁修补文件输出到破解软件。

注册机

  1. 在这个代码块中寻找注册码计算逻辑,分析得知,edi=6 edi*0x17cfb,然后乘以用户名第一位的ascii码的算法.

1
2
3
4
5
6
7
8
9
#include <stdio.h>

int main(){
char* serial="abcd";
int tmp1 = serial[0];
int tmp2 = tmp1*0x29;
int tmp3 = tmp2+tmp2;
printf("CW-%d-CRACKED",tmp3);
}

Afkayas.2

破解

  1. 破解方法同上。
  2. 去除Nag。使用4C方法。先找到入口处入栈的地址0x4067D4,在数据窗口总使用表达式找到4C偏移处的内存地址。

  1. 找到第一个位置的内存地址,右键,在内存敞口中转到指定的DWORD

  1. 这个地址我们能够看到两块相似数据,在第37块数据上,我们能够发现两个不一样的数据,一个是00,另一个是01,这个标志位标识了窗口的启动顺序,如果我们调换启动顺序,则可以消除Nag窗口,最后写出破解程序。

注册机

  1. 注册机无法修改Nga窗口的启动顺序。
  2. 向上寻找。

算法如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>

int main()
{
// 使用name: 111111
// 使用serial: 222222
int tmp1 = 6;
int tmp2 = 6 * 88888;
int tmp3 = tmp2 + 0x31;
// printf("%x\n", tmp3);
// printf("%d\n", tmp3);
double tmp4 = tmp3;
double tmp5 = tmp4 + 2;
double tmp6 = tmp5 * 3;

// printf("%f\n", tmp6);
double tmp7 = tmp6 - 2;
double tmp8 = tmp7+15;
printf("%f\n", tmp8);


}

CKme

破解

由于x64dbg出现了向后反汇编错误,故本次破解使用了Ollydbg.

  1. 本项目中查壳发现是Dolphin编写的,故使用各种常规断点,无法断下程序。后使用E2A(Dolphin事件到地址查询工具),得到输入框2中有OneKeyUp事件,函数名chkcode,根据函数地址下断点,BP 457C40

  1. 输入伪码,运行程序,使用单步跟踪。

  2. 发现可疑call,因为发现疑似注册码的字符串被这个call处理了,故步入此call。

1
00457CA4  |.  E8 93BFFAFF     call CKme.00403C3C
  1. 单步步过,发现注册码在一个循环体中拼接完成。
1
2
3
4
5
6
7
8
9
00403C5A   > /8B449C 14     mov eax,dword ptr ss:[esp+ebx*4+0x14]
00403C5E . |89F2 mov edx,esi
00403C60 . |85C0 test eax,eax
00403C62 . |74 0A je short CKme.00403C6E
00403C64 . |8B48 FC mov ecx,dword ptr ds:[eax-0x4]
00403C67 . |01CE add esi,ecx
00403C69 . |E8 76EBFFFF call CKme.004027E4
00403C6E > |4B dec ebx
00403C6F .^\75 E9 jnz short CKme.00403C5A
  1. 当循环跳出时,在栈帧中发现疑似的注册码。
1
0019FB54   02325788  ASCII "黑头Sun Bird11dseloffc-012-OK111111"
  1. 暂时解除所有断点,进行注册码测试,在后续代码中发现对比流程。
1
2
3
4
5
00457D2C  |.  8B45 E0       mov eax,[local.8]                        ;  用户输入的注册码
00457D2F |. 8B93 18030000 mov edx,dword ptr ds:[ebx+0x318] ; 计算出来的注册码
00457D35 |. E8 52BFFAFF call CKme.00403C8C ; 对比注册码
00457D3A |. 75 0A jnz short CKme.00457D46 ; 关键跳转
00457D3C |. C783 0C030000>mov dword ptr ds:[ebx+0x30C],0x3E ; 存入0x3e
  1. 当输入正确的注册码后,这里不会执行跳转,而是讲一个数据存入了数据地址中。发现注册成功的标志并没有显示出来,所以猜测,注册码比对事件不是在chkcode函数中实现的,而是另外实现的,所以寻找其他事件地址,进行调试,我们发现panel上面有两个事件,onclickondbclick,故需要分别调试,不然ondbclick可能会被onclick事件获取。首先,不进行断点注册,使用单击panel发现没有反应,双击后象征注册成功的照片出现,说明对比事件发生在ondbclick事件中,对双击事件的地址00457E7C下断点。发现在这里对数据进行了对比,如果对比成功,则写入0x85。
1
2
3
00457EF5  |.  83BE 0C030000>cmp dword ptr ds:[esi+0x30C],0x3E        ;  数据对比
00457EFC |. 75 0A jnz short CKme.00457F08
00457EFE |. C786 0C030000>mov dword ptr ds:[esi+0x30C],0x85
  1. onclick事件下断点,对panel进行单击,发现这里会对0x30C处的数据进行比对,如果比对成功,则不会跳过下面的流程,注册成功的信息也会显示出来。
1
2
00458031  |.  81BE 0C030000>cmp dword ptr ds:[esi+0x30C],0x85
0045803B |. 75 76 jnz short CKme.004580B3

注册机

这个注册机很简单,就是黑头Sun Bird11dseloffc-012-OK拼接用户名即可。

出现的函数

vbaR8Str:将整数转换为双精度小数

vbaStrI4: 转换数字到字符串的函数

遇到的问题

x64dbg出现的问题

逆向工程 - 强制解释 x64dbg 中的代码 向后反编译的问题 (52sbl.cn)

Dolphin在Win10系统上出现的问题

在脱壳时IAT修复失败,常常会出现找不到的函数。

恰饭,恰饭