简单CrackMe分析(样本名:ReverseMe)

2024-06-05 14:48

本文主要是介绍简单CrackMe分析(样本名:ReverseMe),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.首先基本套路,安装运行,确定目标,然后查壳,反编译


2..没有加壳,直接对样本进行调试,获取反编译后/lib目录下的libcheck.so文件,通过readelf -a *.so 命令获取文件信息,找到INIT_ARRAY段的偏移,如下图所示:


3.通过IDA找到INI_ARRY的偏移处,如图所示:


4.进入函数中,记录下地址,并在此处下断点,然后开始附加调试,如图所示:


5.加载so的程序为linker,因此,从手机中将linker下载到本地,通过特殊字符串“[Call”查找,找到加载so文件的函数及其偏移,然后将模块基地址与偏移相加找到动态调试的地址下断点,如图所示:


6.接下来找到libCheck.so模块的基地址,和之前的偏移相加为0x753ABF94,然后跳转到该地址,下断点。


7.执行到此处后,将进行libcheck.so的解密,直接运行使so完全加载完


8.继续运行再次回到,linker模块中


9.此时,libcheck.so已经解密,使用IDC脚本将该模块dump到文件中

static main(void)

{

auto fp, begin, end, dexbyte;

fp = fopen("d:\\dumpali.so", "wb");

begin = 0x753AC000;

end = begin + 0x6000;

for ( dexbyte = begin; dexbyte < end; dexbyte ++ )

fputc(Byte(dexbyte), fp);

}

10.再次使用IDA打开,然后设置基址为模块基地址


11.重新进入调试,再次运行到__arm_aeabi_1时断下,单步跟踪,如图所示:


12.根据libdvm.so找到调用的偏移,再根据基地址加上偏移计算出调用JNI_OnLoad的地址,如下所示:



13.运行后断下来,再单步跟进为解密后的JNI_OnLoad函数


14.对JNI_OnLoad函数进行分析,调用过程如下,JNI_OnLoad->__arm_aeabi_4->__arm_aeabi_3,该函数即为关键函数,在__arm_aeabi_4中进行解密和注册__arm_aeabi_3函数



15.再对__arm_aeabi_3进行分析,接下来对__arm_aeabi_3下断点,成功断下来后单步跟踪进行分析


16.此处生成了一串key,geek201508261314,如图所示:



17.将用户输入和key进行拼接,如下图所示:



18.对输入的密码进行转换,0-9,a-f,A-F按字节进行拼接,转换为16进制数



19.最后根据伪代码分析得到加密字符串,然后可以根据加密算法写出解密程序,如图所示:


20.解密算法如下:

int_tmain(intargc,_TCHAR*argv[])

{

       charszName[]={"y0nngeek201508261314"};

       bytepass[]={0x79,0x30,0x6e,0x6e,0x67,0x65,0x65,0x6B,0x32,0x30,0x31,0x35,0x30,0x38,0x32,0x36,0x31,0x33,0x31,0x34};

      

       byte*ch1=(byte*)pass;

       do

       {

              //*ch1 = (*ch1 - 0x78) ^ 0x22 -0x10;

              *ch1=(*ch1^0x22)+0x78;

              ++ch1;

       }while(ch1!=(byte*)pass+sizeof(pass));

       printf("密码为:");

       for(inti=0;i<sizeof(pass);i++)

       {

              printf("%x",pass[i]);

       }

       return0;

}

21.测试结果如下:



这篇关于简单CrackMe分析(样本名:ReverseMe)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1033363

相关文章

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

redis群集简单部署过程

《redis群集简单部署过程》文章介绍了Redis,一个高性能的键值存储系统,其支持多种数据结构和命令,它还讨论了Redis的服务器端架构、数据存储和获取、协议和命令、高可用性方案、缓存机制以及监控和... 目录Redis介绍1. 基本概念2. 服务器端3. 存储和获取数据4. 协议和命令5. 高可用性6.

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

使用IntelliJ IDEA创建简单的Java Web项目完整步骤

《使用IntelliJIDEA创建简单的JavaWeb项目完整步骤》:本文主要介绍如何使用IntelliJIDEA创建一个简单的JavaWeb项目,实现登录、注册和查看用户列表功能,使用Se... 目录前置准备项目功能实现步骤1. 创建项目2. 配置 Tomcat3. 项目文件结构4. 创建数据库和表5.