吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2291|回复: 16
收起左侧

[原创] 用EDB(Linux下的ollydbg)分析破解某加密软件 (一)

[复制链接]
Marriner 发表于 2025-7-23 18:02
本帖最后由 Marriner 于 2025-7-23 22:16 编辑

一、EDB的安装
之前写过一篇关于EDB的安装,版本是1.3.0,过程挺麻烦的,而且1.3.0版经常会有些显示不正常的问题,最近安装了下最新的1.5.0版,安装居然异常顺利,而且使用了一段时间,也很稳定,所以这里再简单分享下。

1. 准备工作,安装好需要用到的工具
    以下为需要的工具列表(请注意版本,版本选得不好的话,可能后面会备受折磨,此处省略若干字......)

    操作系统版本:CentOS Linux release 7.9.2009 (Core)

    boost   =>  1_75_0
    gcc => 9.2.0
    cmake => 3.12.1
    capstone => 4.0.1
    graphviz => 2.40.1
    Qt => 5.10.1

2.  设置下环境变量 (可以写入文件如edb.setup.csh,安装edb前,source edb.setup.csh
setenv EDB_ROOT /YOUR_PATH/edb
setenv BOOSTDIR $EDB_ROOT/boost_1_75_0
setenv Boost_INCLUDE_DIR $BOOSTDIR/include/boost

setenv CMAKE_HOME $EDB_ROOT/cmake-3.12.1-Linux-x86_64
set path = ($CMAKE_HOME/bin $path)

setenv QMAKE_HOME $EDB_ROOT/Qt5.10.1/5.10.1
set path = ($QMAKE_HOME/gcc_64/bin $path)
################################################################
# settings below  will make find capstone and libgvc
################################################################

setenv PKG_CONFIG_PATH $EDB_ROOT/capstone-4.0.1/lib/pkgconfig:/graphviz-2.40.1/lib/pkgconfig

setenv GCC_HOME /ux/Tools/GCC/9.2.0/x86_64/rhel7
set path = ($GCC_HOME/bin $path)

setenv LD_LIBRARY_PATH $EDB_ROOT/capstone-4.0.1/lib64:$GCC_HOME/lib64:$GCC_HOME/lib:$BOOSTDIR/lib:/usr/local/lib:$LD_LIBRARY_PATH

setenv CAPSTONE_INCLUDE_DIRS $EDB_ROOT/capstone-4.0.1/include
setenv CAPSTONE_LIBRARY_DIRS $EDB_ROOT/capstone-4.0.1/lib64
setenv GRAPHVIZ_INCLUDE_DIRS $EDB_ROOT/graphviz-2.40.1/include
setenv GRAPHVIZ_LIBRARY_DIRS $EDB_ROOT/graphviz-2.40.1/lib

setenv CPLUS_INCLUDE_PATH $EDB_ROOT/boost_1_75_0/include:$EDB_ROOT/graphviz-2.40.1/include:$EDB_ROOT/capstone-4.0.1/include
3. 安装edb
(a) 到下面网站下载最新版edb源文件 edb-debugger-1.5.0.tgz
      https://github.com/eteran/edb-debugger
(b)  新建一个edb安装目录,解压 tar zxvf edb-debugger-1.5.0.tgz
(c)  cd edb-debugger
(d) 修改文件
     在文件src/arch/x86-generic/ArchProcessor.cpp中加入下面一行
              
     #define __X32_SYSCALL_BIT 0x40000000

(e) mkdir bin
(f) cd bin,然后依次运行以下命令
     souce edb.setup.csh (见上)
     cmake ..
     make
......
[100%] Linking CXX shared library ../../libHeapAnalyzer.so                                                                  
[100%] Built target HeapAnalyzer

好了,大功告成。

二、用EDB分析破解某加密软件

1.  软件下载: https://pan.baidu.com/s/1LYZ-GwTzH0i7RcrFZ7ghNQ  提取码: 52pj

2.  引言
     软件用途:加密某编程脚本的(因为脚本里有些信息需要保密),然后将加密后的脚本提供给终端用户使用。
     破解背景:这款软件是十几年前下载的试用版本,license过期后只是简单修改了下软件中过期后的跳转指令,就一直用到现在,好好的都没什么问题。最近账户迁移,迁移后发现软件报License CRC错误,尝试将账户迁移回去,然后将软件从备份恢复,居然还是报错。原来的网站可以申请license,但是license格式有些变化(binary的),似乎不能用在旧版的软件上,而新版的加密软件要求使用新的操作系统,而我们的运行环境大部分还是比较老的操作系统,没办法,只能耐着性子去破解了。

3.  软件破解
     先从下面的出错信息入手
     re (re为程序文件名,不带参数执行软件)
     License file CRC error.
     ......
     Registration key: 3587C9F4FAF0316EC32488E937AE4D70

     IDA载入文件re,String view里搜索CRC error,定位到如下位置

.text:08050A07                                             loc_8050A07:                  ; CODE XREF: sub_8050970+104↓j
.text:08050A07 C7 04 24 D8 37 05 08          mov     dword ptr [esp], offset aLicenseFileCrc ; "License file CRC error."
.text:08050A0E E8 AD 82 FF FF                     call    _puts
.text:08050A0E
.text:08050A13 8D 8D E8 FB FF FF                lea     ecx, [ebp+dest]
.text:08050A19 89 4C 24 0C                         mov     [esp+0Ch], ecx
.text:08050A1D 8B 35 60 55 05 08               mov     esi, ds:dword_8055560

edb载入程序在08050A07处下断点

Snap1.jpg
F8 run过,可以看到ASCII “License File CRC error.”

继续F8 run至08050a1d,查看地址08055560中存放的是088de410 (记住这个地址08055560)

查看088de410处,如下图,看到3587C9F4FAF0316EC32488E937AE4D70了吧?就是前面的Registration key

Snap2.jpg

好,我们Debug -> Restart 重新运行程序,前面的地址08055560还记得吧?在Data Dump区定位到这个地址,并下硬件写入断点,如下图

Snap3.jpg

F9运行断在下面的位置0804C455

Snap4.jpg

看下Data Dump区看下08055560

Snap5.jpg

去08f27410看一下,Registration key已经出来了。

Snap6.jpg

IDA里看下0804C455附近的代码

.text:0804C445                                    loc_804C445:                  ; CODE XREF: sub_804C400+20↑j
.text:0804C445 89 04 24                     mov     [esp], eax            ; filename
.text:0804C448 E8 C3 FE FF FF            call    sub_804C310
.text:0804C448
.text:0804C44D 83 F8 01                    cmp     eax, 1
.text:0804C450 A3 60 55 05 08          mov     ds:dword_8055560, eax
.text:0804C455 19 C9                         sbb     ecx, ecx
.text:0804C457 0F B6 D1                    movzx   edx, cl

sub_804C310应该是关键call,在IDA里看下sub_804C310的Function Call
Snap7.jpg

很少的几个子程序,从后往前看下,edb里Debug -> Retart重新run,在0804C3AB处下断点

.text:0804C3AB 89 54 24 08                     mov     [esp+8], edx          ; int
.text:0804C3AF E8 6C 18 00 00                call    sub_804DC20

注意ESI里的内容10237010

Snap10.jpg

选中EDX,右键Follow In Dump,来到ff9d0d70,

Snap8.jpg

Snap9.jpg

按两次F8,run过0804C3AF停在0804C3B4
.text:0804C3AF E8 6C 18 00 00                call    sub_804DC20
.text:0804C3B4 C7 04 24 21 00 00 00      mov     dword ptr [esp], 21h ;

再看Data Dump区ff9d0d70里的数据

Snap11.jpg

总结下,其实就是 Registration key = sub_804DC20(10237010)= 3587C9F4FAF0316EC32488E937AE4D70

这个sub_804DC20是个什么功能呢?

IDA中用用FindCrypt3看一下

Snap12.jpg

双击第一行的地址跳转到下面的地址

Snap13.jpg

Function Call看一下

Snap14.jpg

所以sub_804DC20其实就是MD5

验证下

Snap15.jpg

不就是 Registration key = sub_804DC20(10237010)= 3587C9F4FAF0316EC32488E937AE4D70

下面再看下这个10237010怎么来的。

edb重run,在0804C348下断点

.text:0804C348 89 44 24 04                   mov     [esp+4], eax          ; filename
.text:0804C34C E8 9F C9 FF FF               call    ___xstat
.text:0804C351 8B 85 74 FF FF FF          mov     eax, [ebp+var_8C]

断下后看eax,是软件的目录

Snap16.jpg

两次F8,run过0804C34C停在0804C351
.text:0804C34C E8 9F C9 FF FF               call    ___xstat
.text:0804C351 8B 85 74 FF FF FF           mov     eax, [ebp+var_8C]

Snap17.jpg

看红色框里的内容1009D81,这个数又是怎么来的呢

偶然间发现,原来是这样

stat /tmp/re-1.3-eval/bin
  File: ‘tmp/re-1.3-eval/bin‘  Size: 126             Blocks: 0          IO Block: 4096   directory
  Device: 802h/2050d      Inode: 16817537


Snap18.jpg

回到IDA View-A,按F5看下伪代码
  __xstat(3, filename, &s);
  v1 = 0;
  if ( s.st_ino )
  {
    v2 = __ROL4__(s.st_ino, 5);
    v3 = (2 * (v2 & 0x55555555)) | ((v2 & 0xAAAAAAAA) >> 1);
    if ( (v2 & 0xFFFF0000) == 0 )
      v3 |= v2 << 16;
    v4 = 0;
    sprintf(v11, "%08X", v3);
    sub_804DC20(v11, 8, (int)v12);
    ......
  }

stat命令的Inode部分由十进制16817537 转化为十六进制1009D81
1009D81左移5位(__ROL4__(s.st_ino, 5)),
再经过(2 * (v2 & 0x55555555)) | ((v2 & 0xAAAAAAAA) >> 1)变成10237010,
然后MD5(10237010) = 3587C9F4FAF0316EC32488E937AE4D70 最终得到Registration key。


这个stat的Inode值,一旦文件夹变动,即使是从备份中恢复到原来的目录,Inode的值也会改变,也就导致Registration key随之变动,自然与原来的license不匹配,导致License CRC error,这么设计Registration key,真是让人无语啊,可能是因为是TEMP license,正式版应该不会这么处理吧。


Regstration key部分的分析到此结束,至于license部分,关键算法是Blowfish算法,相对独立,既可以作为这款软件破解的一部分,也可以作为像我这样的算法小白初学Blowfish算法参考案例,详细分析起来也挺耗时耗篇幅的,有时间放在“用EDB(Linux下的OllyDbg)分析破解某加密软件 (二)”里再分享吧!
     

免费评分

参与人数 8威望 +1 吾爱币 +27 热心值 +7 收起 理由
TanXin + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
DQQQQQ + 1 + 1 鼓励转贴优秀软件安全工具和文档!
hszt + 2 + 1 谢谢@Thanks!
mormas + 1 + 1 用心讨论,共获提升!
lawless + 1 + 1 我很赞同!
HenryL + 1 linux系统的强啊&amp;amp;#128077;
gunxsword + 1 + 1 谢谢@Thanks!

查看全部评分

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

aaaa25852 发表于 2025-7-23 19:15
这个不错哦。。还是centeros7系统的构建
wang5170 发表于 2025-7-23 19:18
wang5170 发表于 2025-7-23 19:20
wang5170 发表于 2025-7-23 19:32
学习学习学习
殇。默语 发表于 2025-7-23 19:56
努力学习学习
小洲 发表于 2025-7-23 21:28
golang能逆向吗
Hoki 发表于 2025-7-23 23:21
感谢分享,学习学习
xixicoco 发表于 2025-7-23 23:59
Linux下的破解还是有点牛逼的
qte123 发表于 2025-7-24 00:30
感谢分享,学习学习
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2026-2-3 15:09

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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