先上这次学习破解的参考文章链接:
《LINUX的crackme的逆向小记(全文完) 采臣·宁》 https://bbs.pediy.com/thread-11315.htm
《MAC使用IDA PRO远程调试LINUX程序》https://www.cnblogs.com/wanyuanchun/p/5117553.html
破解所需软件
操作平台: Debian 版本7.11(wheezy)64位,内核Linux 3.2.0-6-amd64,使用的桌面GNOME 3.4.2
逆向工具:
反汇编 -- objdump 、lida( http://lida.sourceforge.net/ )、windows下的ida
压缩工具 -- upx (http://upx.sourceforge.net)
说到破解这个软件的原因,很狗血,前一段时间在某宝上购买了一个Linux下的可以虚拟出真实硬件的虚拟机软件,一个激活码要50块,没错,是一个激活码,呐,遂购买了一个激活码,但是因为一次手残,把Linux系统搞坏了,然后修复了几天一直无法修复,后来就使用万能大法重装。。。,装好之后安装这个虚拟机软件,发现每一次打开激活码都是动态的。。。没错,想要用这个软件还需要掏50块钱激活。。。遂
以学习的心态尝试破解试试看
上图,打开软件后是下面的界面
机器码是动态变化的,每次启动软件动态码都不同。。。。激活码自然也不同~
在Linux下
打开控制台,切换到程序所在目录。运行“ objdump -x ema ”,显示下图:
根据参考文章《LINUX的crackme的逆向小记(全文完) 采臣·宁》
使用十六进制工具 hexedit 查看程序信息。安装
hexedit ,并运行命令:hexedit ema ,显示如下:
软件使用UPX进行了压缩
安装upx,并运行命令“ upx -d ema ”把程序解压缩 ,如下图
再运行“ objdump -x ema ”
查看程序
解压完成,下一步,直接把解压后的程序拷贝进windows下,在windows下打开IDA进行静态分析,当然也可以从windows的IDA连接到Linux进行动态分析。
使用IDA打开解压后的ema文件
使用F5~~~
int __cdecl main(int argc, const char **argv, const char **envp)
{
char **v3; // ST08_8
const char *v4; // rbx
char *v5; // rax
unsigned int v6; // eax
__int64 v7; // rdi
__int64 v8; // rbx
__int64 v9; // rax
__int64 v10; // rbx
__int64 v11; // rax
__int64 v12; // rbx
__int64 v13; // rax
v3 = (char **)envp;
gtk_init(0LL, 0LL);
g_envp = v3;
v4 = *argv;
v5 = getcwd(0LL, 0LL);
g_root_dir = abs_dir(v5, v4);
check_relative_dir("conf");
check_relative_dir("disk");
scan_cfg();
v6 = time(0LL);
v7 = v6;
srandom(v6);
g_builder = gtk_builder_new(v7);
gtk_builder_add_from_string(g_builder, &g_guistr, -1LL, 0LL);
v8 = gtk_window_get_type();
v9 = object("win_top");
g_window = g_type_check_instance_cast(v9, v8);
if ( !g_window )
__assert_fail("g_window", "single.c", 0x6B9u, "main");
g_signal_connect_data(g_window, "destroy", >k_main_quit, 0LL, 0LL, 0LL);
v10 = gtk_window_get_type();
v11 = object("win_acode");
g_win_acode = g_type_check_instance_cast(v11, v10);
if ( !g_win_acode )
__assert_fail("g_win_acode", "single.c", 0x6BDu, "main");
g_signal_connect_data(g_win_acode, "destroy", >k_main_quit, 0LL, 0LL, 0LL);
v12 = gtk_window_get_type();
v13 = object("win_auth");
g_win_auth = g_type_check_instance_cast(v13, v12);
if ( !g_win_auth )
__assert_fail("g_win_auth", "single.c", 0x6C1u, "main");
g_signal_connect_data(g_win_auth, "destroy", >k_main_quit, 0LL, 0LL, 0LL);
if ( (unsigned int)verify_acode_from_file() )
prompt_acode();
else
setup_main_win();
gtk_main();
return 0;
}
程序的主流程就是这个样子,下面使用VMware搭建虚拟机安装这个程序,以便远程调试这个程序
VMware搭建虚拟机 略。。。拷贝程序啥的可以用UltraISO把文件做成光盘镜像载入虚拟机的光驱内
具体IDA配置远程调试过程
1:在IDA目录下找到linux_server程序,把它拷贝传到LINUX的某个文件目录下。
2:修改文件访问权限。chmod a+x 命令将文件改成所有用户可执行。
3:启动./linux_server IDA,Linux程序
4:打开IDA Debugger菜单下的Select debugger。
5: 选择Remote Linux
debugger,点击OK
6:
打开IDA Debugger菜单下的Process options,参照下图进行设置,然后点击OK
现在开始调试程序
首先观察main函数很幸运有这一句看起来很像验证是否激活。。。
下断点,按F5调试
调试至 if 语句,跟进,verify_acode_from_file(),发现该函数调用了“load_file_content_under_home()”函数读取了一个“.ema_sn”文件,然后调用“call_check_code()”进行验证
调试过程中由于没有
“.ema_sn”文件,该函数进行了返回。
返回后,经过 if 判断 ,调用prompt_acode()函数,继续跟进
prompt_acode()
函数
发现了这么一句“ text(" text("tbx_mcode", ptr);", ptr);”ptr变量是个字符串,根据"tbx_mcode”这个,判断ptr应该是机器码。。。跟进上面产生ptr的get_fp()函数
跟进
encrypt(),有两个随机数函数。。。每次打开软件机器码会变化是因为机器码产生过程中有随机数的参与,
调试程序回到main函数,经调试可知,if ( (unsigned int)verify_acode_from_file() )是判断程序是否激活的关键,只需要修改if的流程,就可以达到免激活的目的,结束调试,查看这一句的汇编指令
jz short loc_4088D2,将“jz short loc_4088D2” 修改为 “jnz short loc_4088D2”,修改方法:
鼠标点击这一行,然后点击下图菜单
再按下图修改,后点击OK:
接着,点击下图菜单,输出文件,
完成后,将破解后的二进制文件导入虚拟机中,调整权限为可执行,试运行,如图,暴力破解成功
至此,破解完成,在call_check_code((__int64)ptr)函数里有包含激活码的比对代码,如下图,对照着代码应该是可以写出注册机的, 但是由于水平太低,代码看得晕头转向。。。麻烦指教一下注册机如何编写。。。。
附当时购买的虚拟机软件及解压和破解后的程序,解压密码:123456
上传不了附件是什么情况???
==================================
由于千脑无法访问,于2020年10月8日重传附件
点击进入下载-IDA_Pro_v7.0_Portable.zip
提取码:1111
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2020-10-8 00:28
被转身~编辑
,原因: 重传附件