吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1837|回复: 10
收起左侧

[CrackMe] 简单crc

[复制链接]
mochongli 发表于 2023-2-4 13:54
CM是什么?Crackme是什么?这是什么东西?楼主发的什么?
他们都是一些公开给别人尝试破解的小程序,制作 Crackme 的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位 Cracker,想挑战一下其它 Cracker 的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破解,KeyGenMe是要求别人做出它的 keygen (序号产生器), ReverseMe 要求别人把它的算法做出逆向分析, UnpackMe 是要求别人把它成功脱壳,本版块禁止回复非技术无关水贴。

仅对.text代码段进行校验

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册[Register]

x

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
yiwangguli + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

DEATHTOUCH 发表于 2023-2-4 19:10
本帖最后由 DEATHTOUCH 于 2023-2-4 19:15 编辑

程序一运行就调用00007FF662141270计算当前.text段的crc32,然后循环调用检查有没有下断点之类的运行时发生的代码篡改。
所以只要在运行之后随便f2下一个断点就会输出true了,但是如果在运行前下了断点就不会被检测出来。
00007FF66214114C判断crc32的值,第一次运行的结果在r13d,然后和刚刚调用的结果比较,之后就是输出结果。
只要把00007FF662141151的setne dl改成xor dl,dl就可以了。
而且你这个汇编写的效率低了点,crc32在x64可以一次取8个字节的。
关于crc32指令的介绍本人去年写过一篇。

补充一下,代码有重定位,但是最后两位的偏移是固定的,1270,1151这几个是不变的。
yiting8 发表于 2023-2-4 14:07
空竹 发表于 2023-2-4 14:57




下访问断点找到crc32所在函数,函数第一行直接改ret

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册[Register]

x
pj10234 发表于 2023-2-4 16:43
取巧的办法直接搜索字符串改掉.text或者另一种办法把00007FF62DCA1151处代码取反条件,其他方式待发现
 楼主| mochongli 发表于 2023-2-5 03:49
DEATHTOUCH 发表于 2023-2-4 19:10
程序一运行就调用00007FF662141270计算当前.text段的crc32,然后循环调用检查有没有下断点之类的运行时发生 ...

还有啥优化的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册[Register]

x
DEATHTOUCH 发表于 2023-2-5 19:28


在x64的情况下可以直接用crc32 r14, rax
这样可以一次处理8个字节,然后结果在r14d
其他没什么了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册[Register]

x
 楼主| mochongli 发表于 2023-2-8 16:20
DEATHTOUCH 发表于 2023-2-5 19:28
在x64的情况下可以直接用crc32 r14, rax
这样可以一次处理8个字节,然后结果在r14d
其他没什么了。

一样的,64位寄存器要比32位慢。
DEATHTOUCH 发表于 2023-2-8 19:43
mochongli 发表于 2023-2-8 16:20
一样的,64位寄存器要比32位慢。

你确定吗?给你个exe看看,跑一下看看时间差,
关键代码在1000016F0和100001740,你可以用IDA F5一下看看,


源码也可以给你参考:
[Pascal] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
program fastcrc32c;
 
{$mode objfpc}
{$AsmMode Intel}
 
uses
  SysUtils;
 
const
  bufsize = 1024*1024*1024; // 1GiB
 
function crc32_1(crc:DWord; buf:Pointer; len:PtrInt):DWord;assembler;nostackframe;
asm
@start:
  xor rax, rax
  mov eax, ecx
  xor eax, $FFFFFFFF
@check:
  cmp r8, 0
  jle @out
@loop:
  cmp r8, 8
  jl @loop2
  mov rcx, [rdx]
  crc32 rax, rcx // 一次处理8字节
  add rdx, 8
  sub r8, 8
  jmp @loop
@loop2:
  cmp r8, 0
  je @out
  mov cl, [rdx]
  crc32 eax, cl
  inc rdx
  dec r8
  jmp @loop2
@out:
  xor eax, $FFFFFFFF
end;
 
function crc32_2(crc:DWord; buf:Pointer; len:PtrInt):DWord;assembler;nostackframe;
asm
@start:
  xor rax, rax
  mov eax, ecx
  xor eax, $FFFFFFFF
@check:
  cmp r8, 0
  jle @out
@loop:
  cmp r8, 4
  jl @loop2
  mov ecx, [rdx]
  crc32 eax, ecx // 一次处理4字节
  add rdx, 4
  sub r8, 4
  jmp @loop
@loop2:
  cmp r8, 0
  je @out
  mov cl, [rdx]
  crc32 eax, cl
  inc rdx
  dec r8
  jmp @loop2
@out:
  xor eax, $FFFFFFFF
end;
 
var
  buf:Pointer;
  t:QWord;
  c:DWord;
begin
  GetMem(buf,bufsize);
  FillChar(buf^,bufsize,1); // 相当于用memset置1
 
  t:=GetTickCount64;
  c:=crc32_1($ffffffff,buf,bufsize);
  t:=GetTickCount64-t;
  Writeln('Result: ',c,', ',t,' ms');
 
  t:=GetTickCount64;
  c:=crc32_2($ffffffff,buf,bufsize);
  t:=GetTickCount64-t;
  Writeln('Result: ',c,', ',t,' ms');
 
  Freemem(buf);
  Readln;
end.

需要使用64位fpc编译器编译

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册[Register]

x
 楼主| mochongli 发表于 2023-9-21 16:49
@DEATHTOUCH

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册[Register]

x
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-5-25 01:12

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表