吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1437|回复: 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] 纯文本查看 复制代码
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, 2024-4-19 13:51

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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