好友
阅读权限 10
听众
最后登录 1970-1-1
本帖最后由 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处下断点
F8 run过,可以看到ASCII “License File CRC error.”
继续F8 run至08050a1d,查看地址08055560中存放的是088de410 (记住这个地址08055560)
查看088de410处,如下图,看到3587C9F4FAF0316EC32488E937AE4D70了吧?就是前面的Registration key
好,我们Debug -> Restart 重新运行程序,前面的地址08055560还记得吧?在Data Dump区定位到这个地址,并下硬件写入断点,如下图
F9运行断在下面的位置0804C455
看下Data Dump区看下08055560
去08f27410看一下,Registration key已经出来了。
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
很少的几个子程序,从后往前看下,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
选中EDX,右键Follow In Dump,来到ff9d0d70,
按两次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里的数据
总结下,其实就是 Registration key = sub_804DC20(10237010)= 3587C9F4FAF0316EC32488E937AE4D70
这个sub_804DC20是个什么功能呢?
IDA中用用FindCrypt3看一下
双击第一行的地址跳转到下面的地址
Function Call看一下
所以sub_804DC20其实就是MD5
验证下
不就是 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,是软件的目录
两次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]
看红色框里的内容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
回到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 )分析破解某加密软件 (二)”里再分享吧!
免费评分
查看全部评分
发帖前要善用【论坛搜索 】 功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。