md5在ida中的识别

news2024/11/26 3:43:51

ida中 识别md5 ,先右键转为hex 或者按h

_DWORD *__fastcall MD5Init(_DWORD *result)
{
  *result = 0;
  result[1] = 0;
  result[2] = 1732584193;
  result[3] = -271733879;
  result[4] = -1732584194;
  result[5] = 271733878;
  return result;
}

在ida中当然也可以使用搜索
search imdate-value 搜索立即数 0x67452301; 这是上面的init中的state一个数···

 v2 = __ROR4__((v66 & ~v99 | v83 & v99) + v133 + v116 - 0x28955B88, 25);
 __ROR4__ 是循环右移 
 鼠标右键 invert  sign可以改正一些纠正一下负号    3 + 0x242070DB

数值类型转换

int __fastcall MD5Final(unsigned int *a1, unsigned __int8 *a2)
{
  unsigned int v3; // [sp+8h] [bp-28h]
  unsigned int v4; // [sp+10h] [bp-20h]
  unsigned __int8 v7[8]; // [sp+1Ch] [bp-14h] BYREF

  v4 = (*a1 >> 3) & 0x3F;
  if ( v4 > 0x37 )
    v3 = 120 - v4;
  else
    v3 = 56 - v4;
  MD5Encode(v7, a1, 8u);
  MD5Update(a1, PADDING, v3);
  MD5Update(a1, v7, 8);
  MD5Encode(a2, a1 + 2, 0x10u);
  return _stack_chk_guard;
//这是识别的final   ,计算长度,压入padding放入长度 拼接 
====》padding
.data:00006000                 AREA .data, DATA
.data:00006000                 ; ORG 0x6000
.data:00006000                 EXPORT PADDING
.data:00006000 PADDING         DCD dword_80            ; DATA XREF: LOAD:00000520↑o
.data:00006000                                         ; MD5Final(MD5_CTX *,uchar *)+5A↑o ...
.data:00006004                 ALIGN 0x40
.data:00006040                 DCD unk_6044

dcd 指定是低位的  
按D 会转  dcb   ====>
6000                 EXPORT PADDING
.data:00006000 PADDING         DCB 0x80                ; DATA XREF: LOAD:00000520↑o
.data:00006000                                         ; MD5Final(MD5_CTX *,uchar *)+5A↑o ...
.data:00006001                 DCB    0
.data:00006002                 DCB    0
.data:00006003                 DCB    0
.data:00006004                 ALIGN 0x40
.data:00006040                 DCD unk_6044
dcq代表八个字节

ida的算法识别 md5

某个libwtf.so的算法
image.png
这个final 中的update 中的update padding
thumb 有两个字节 有四个字节 ,arm 是四个字节

find hash 的使用

把 findhash.xmlfindhash.py 放到ida plugins 文件夹下
用之前写的revdemo来试一下
点击 plugins/findhash

Python 3.11.6 (tags/v3.11.6:8b6ee5b, Oct  2 2023, 14:57:12) [MSC v.1935 64 bit (AMD64)] 
IDAPython 64-bit v7.4.0 final (serial 0) (c) The IDAPython Team <idapython@googlegroups.com>
---------------------------------------------------------------------------------------------
Propagating type information...
Function argument information has been propagated
lumina: Invalid remote certificate
The initial autoanalysis has been finished.
findHash (v0.1) plugin has been loaded.
这个脚本只考虑了32位SO的反编译代码,64位未适配。
***************************在二进制文件中检索hash算法常量************************************
0x4b100:padding used in hashing algorithms (0x80 0 ... 0)
0x1e978:函数MD5Init(MD5_CTX *)疑似哈希函数,包含初始化魔数的代码。
0x1eb98:函数MD5Transform(uint *,uchar *)疑似哈希函数运算部分。
0x20634:函数MD5InitMagic(MD5_CTX *)疑似哈希函数,包含初始化魔数的代码。
0x2c114:函数sub_2C114疑似哈希函数,包含初始化魔数的代码。
0x317dc:函数sub_317DC疑似哈希函数,包含初始化魔数的代码。
0x31f18:函数sub_31F18疑似哈希函数,包含初始化魔数的代码。
0x330dc:函数sub_330DC疑似哈希函数,包含初始化魔数的代码。
0x33dcc:函数sub_33DCC疑似哈希函数,包含初始化魔数的代码。
0x33fdc:函数sub_33FDC疑似哈希函数,包含初始化魔数的代码。
0x3436c:函数sub_3436C疑似哈希函数,包含初始化魔数的代码。
0x3b248:函数sub_3B248疑似哈希函数,包含初始化魔数的代码。
0x3bb84:函数sub_3BB84疑似哈希函数,包含初始化魔数的代码。
***************************存在以下可疑的字符串************************************
0x4f3b:Java_com_koohai_revdemo_utils_EncryptCUtils_md5
0x4fe4:md5(std::__ndk1::basic_string<char,std::__ndk1::char_traits<char>,std::__ndk1::allocator<char>> const&)
0x5189:Java_com_koohai_revdemo_utils_EncryptCUtils_md5_1magic
0x51c0:md5magic(std::__ndk1::basic_string<char,std::__ndk1::char_traits<char>,std::__ndk1::allocator<char>> const&)
生成对应的hook脚本如下:
frida -UF -l E:\Coding\XposedDemo\app-debug\lib\arm64-v8a\librevdemo_findhash_1719082084.js
***********************************************************************************
花费 40.45436191558838 秒,因为会对全部函数反编译,所以比较耗时间哈

只能说插件强大,把之前的md5 和md5_magic都识别了
插件自动生成的hook代码如下:

function hook_suspected_function(targetSo) {
    const funcs = [['MD5Init(MD5_CTX *)', '函数MD5Init(MD5_CTX *)疑似哈希函数,包含初始化魔数的代码。', '0x1e978'], ['MD5Transform(uint *,uchar *)', '函数MD5Transform(uint *,uchar *)疑似哈希函数运算部分。', '0x1eb98'], ['MD5InitMagic(MD5_CTX *)', '函数MD5InitMagic(MD5_CTX *)疑似哈希函数,包含初始化魔数的代码。', '0x20634'], ['sub_2C114', '函数sub_2C114疑似哈希函数,包含初始化魔数的代码。', '0x2c114'], ['sub_317DC', '函数sub_317DC疑似哈希函数,包含初始化魔数的代码。', '0x317dc'], ['sub_31F18', '函数sub_31F18疑似哈希函数,包含初始化魔数的代码。', '0x31f18'], ['sub_330DC', '函数sub_330DC疑似哈希函数,包含初始化魔数的代码。', '0x330dc'], ['sub_33DCC', '函数sub_33DCC疑似哈希函数,包含初始化魔数的代码。', '0x33dcc'], ['sub_33FDC', '函数sub_33FDC疑似哈希函数,包含初始化魔数的代码。', '0x33fdc'], ['sub_3436C', '函数sub_3436C疑似哈希函数,包含初始化魔数的代码。', '0x3436c'], ['sub_3B248', '函数sub_3B248疑似哈希函数,包含初始化魔数的代码。', '0x3b248'], ['sub_3BB84', '函数sub_3BB84疑似哈希函数,包含初始化魔数的代码。', '0x3bb84']];
    for (var i in funcs) {
        let relativePtr = funcs[i][2];
        let funcPtr = targetSo.add(relativePtr);
        let describe = funcs[i][1];
        let handler = (function() {
        return function(args) {
            console.log("\n");
            console.log(describe);
            console.log(Thread.backtrace(this.context,Backtracer.ACCURATE).map(DebugSymbol.fromAddress).join("\n"));
        };
        })();
    //Interceptor.attach(funcPtr, {onEnter: handler});
    hook_native_addr(funcPtr)  
    //替换为下面的函数 ,可以打印参数。 
}
}
//他会自己给出疑似的地址,就直接在so进行hook    MD5InitMagic 这个自己魔改了初始址 也被发现了 


对于这个算法,可以稍微改进一下,让他生成的js 加上打印参数 ,MD5的话 transfrom 第二个参数 的64个字节 就是明文,拼起来就是完整的铭文。
//ptr(addr)主要用于呈现地址本身的易读形式,
//而hexdump(addr)则用于展示该地址指向的内存区域的详细十六进制内容

function print_arg(addr){
	var module = Process.findRangeByAddress(addr);
	if(module != null){
		return hexdump(addr) + "\n";
	}else{
		return ptr(addr) + "\n";
	}
}

function hook_native_addr(funcPtr){
	var module = Process.findModuleByAddress(funcPtr);
	Interceptor.attach(funcPtr, {
		onEnter: function(args){
      console.log(Thread.backtrace(this.context,Backtracer.ACCURATE).map(DebugSymbol.fromAddress).join("\n"));
       
			this.args0 = args[0];
			this.args1 = args[1];
			this.args2 = args[2];
			this.args3 = args[3];
			this.logs = [];
			this.logs.push("call " + module.name + "!" + ptr(funcPtr).sub(module.base) + "\n");
			this.logs.push("this.args0 onEnter: " + print_arg(this.args0));
			this.logs.push("this.args1 onEnter: " + print_arg(this.args1));
			this.logs.push("this.args2 onEnter: " + print_arg(this.args2));
			this.logs.push("this.args3 onEnter: " + print_arg(this.args3));
			
		}, onLeave: function(retval){
			this.logs.push("this.args0 onLeave: " + print_arg(this.args0));
			this.logs.push("this.args1 onLeave: " + print_arg(this.args1));
			this.logs.push("this.args2 onLeave: " + print_arg(this.args2));
			this.logs.push("this.args3 onLeave: " + print_arg(this.args3));
			this.logs.push("retval onLeave: " + retval + "\n");
			console.log(this.logs);
		}
	});
}
//这里可以打印参数。 在离开的时候一起打印 
// 参数可能是地址 或者数值 明文指针/长度  需要判断。 地址的话就打印整个内容 。数值就打印数值。
//ptr(addr)主要用于呈现地址本身的易读形式,
//而hexdump(addr)则用于展示该地址指向的内存区域的详细十六进制内容

===》
frida-trace 能获取到所有地址
把地址放到上面的so hook中,就可以hook所有函数 加参数
//更多代码,更多内容请移步公众号一起请添加图片描述
学习,同篇笔记会有更新喔

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1852336.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分布式系统的演化(单机架构/应用符合和存储服务分离架构/应用服务集群架构/主从分离架构/冷热分离架构)

文章目录 单机架构应用服务和存储服务分离应用服务集群架构读写分离/主从分离架构冷热分离架构--引入缓存分库分表 单机架构 单机架构只有一台服务器&#xff0c;使用一台服务器负责所有的工作 举个例子&#xff1a;假设有以下电商网站&#xff0c;商品、用户、交易等功能服务…

实验六:三维图形修改器的综合应用

如果文章有写的不准确或需要改进的地方&#xff0c;还请各位大佬不吝赐教&#x1f49e;&#x1f49e;&#x1f49e;。朱七在此先感谢大家了。&#x1f618;&#x1f618;&#x1f618; &#x1f3e0;个人主页&#xff1a;语雀个人知识库 &#x1f9d1;个人简介&#xff1a;大家…

【STM32-启动文件 startup_stm32f103xe.s】

STM32-启动文件 startup_stm32f103xe.s ■ STM32-启动文件■ STM32-启动文件主要做了以下工作&#xff1a;■ STM32-启动文件指令■ STM32-启动文件代码详解■ 栈空间的开辟■ 栈空间大小 Stack_Size■ .map 文件的详细介绍■ 打开map文件 ■ 堆空间■ PRESERVE8 和 THUMB 指令…

OCC显示渲染结构剖析

1.Display显示 2.Drawer 3.Graphics 4.InteractiveContext 5.Render 6.Selection 7.View

探索计算机视觉(人工智能重要分支)的发展与应用

引言 在当今快速发展的科技时代&#xff0c;计算机视觉作为人工智能领域的重要分支&#xff0c;正日益成为各行各业不可或缺的关键技术。从简单的图像处理到复杂的智能系统&#xff0c;计算机视觉的发展不仅改变了我们看待世界的方式&#xff0c;也深刻影响着工业、医疗、交通等…

数据结构与算法引入(Python)

华子目录 引入第一次尝试第二次尝试 算法的概念算法的五大特性 算法效率衡量执行时间单靠时间值绝对可信吗&#xff1f; 时间复杂度与 "大O记法"如何理解 “大O记法” 最坏时间复杂度时间复杂度的几条基本计算规则 算法分析常见的时间复杂度常见时间复杂度之间的关系…

两种单例模式(保证线程安全)

开始前&#xff0c;球球各位读者给个三连吧&#xff0c;有错误感谢指出&#xff0c;谢谢 单例模式也叫单个实例&#xff0c;也就是这个类只有且只能有一个实例对象&#xff0c;这样一个类就叫做“单例”&#xff1b;单例模式有很多种&#xff0c;这里只介绍“饿汉模式”和“懒…

vscode+picgo+gitee实现Markdown图床

vscode中编辑Markdown文件&#xff0c;复制的图片默认是保存在本地的。当文档上传csdn时&#xff0c;会提示图片无法识别 可以在gitee上创建图床仓库&#xff0c;使用picgo工具上传图片&#xff0c;在Markdown中插入gitee链接的方式来解决该问题。 一、 安装picgo工具 1.1 v…

1-Wire的使用

代码&#xff1a; ds18b20.c /*《AVR专题精选》随书例程3.通信接口使用技巧项目&#xff1a;1-Wire 单总线的使用文件&#xff1a;ds1820.c说明&#xff1a;DS18B20驱动文件。为了简单&#xff0c;没有读取芯片地址&#xff0c;也没有计算校验作者&#xff1a;邵子扬时间&…

Golang | Leetcode Golang题解之第167题两数之和II-输入有序数组

题目&#xff1a; 题解&#xff1a; func twoSum(numbers []int, target int) []int {low, high : 0, len(numbers) - 1for low < high {sum : numbers[low] numbers[high]if sum target {return []int{low 1, high 1}} else if sum < target {low} else {high--}}r…

http1.x和http2.0的一些区别

1、http2.0采用多路复用技术&#xff0c;可以同时发送多个请求或回应 2、http2.0可以由服务器主动向客户端推送数据 3、http2.0对头信息进行压缩&#xff0c;并维护一张信息表&#xff0c;生成头信息索引号&#xff0c;发送时只发送索引号

使用普通定时器产生半双工软件串口

代码&#xff1a; /*《AVR专题精选》随书例程3.通信接口使用技巧项目&#xff1a;使用普通定时器和外中断实现半双工软件串口文件&#xff1a;softuart.c说明&#xff1a;软件串口驱动文件作者&#xff1a;邵子扬时间&#xff1a;2012年12月16日*/ #include "softuart.h&…

YOLOv9基础 | 实时目标检测新SOTA,手把手带你深度解析yolov9论文!

前言:Hello大家好,我是小哥谈。YOLOv9是Chien-Yao Wang等人提出的YOLO系列的最新版本之一(截止到目前,YOLOv10已发布),于2024年2月21日发布。它是 YOLOv7的改进版本,两者均由Chien-Yao Wang及其同事开发。本节课就以YOLOv9论文为基础带大家深入解析YOLOv9算法。🌈 …

web基础学习

1、安装 1.1、创建一个 React 新项目 如果你正在学习 React 或者考虑将其应用到现有的项目中&#xff0c;你可以 利用 script 标签将 React 添加到任何 HTML 页面 来快速开启学习之旅。如果你的项目需要许多组件和许多文件&#xff0c;那就需要考虑以下方式了&#xff01; 1…

WinMerge v2 (开源的文件比较/合并工具)

前言 WinMerge 是一款运行于Windows系统下的免费开源的文件比较/合并工具&#xff0c;使用它可以非常方便地比较多个文档内容甚至是文件夹与文件夹之间的文件差异。适合程序员或者经常需要撰写文稿的朋友使用。 一、下载地址 下载链接&#xff1a;http://dygod/source 点击搜…

【干货】Android中高级开发进阶必备资料(附:PDF+视频+源码笔记)

4、数据传输与序列化 5、Java虚拟机原理 6、高效IO 设计思想解读开源框架 随着互联网企业的不断发展&#xff0c;产品项目中的模块越来越多&#xff0c;用户体验要求也越来越高&#xff0c;想实现小步快跑、快速迭代的目的越来越难&#xff0c;插件化技术应用而生。如果没有…

Python: HexBinDecOct

因为&#xff1a; f0b1001110# 十进制 int()a0*2**01*2**11*2**21*2**30*2**40*2**51*2**6print(a)# 八进制 oct()print(78/8,78%8)# 110 001 001 8 116print(1*2**00*2**10*2**2,1*2**00*2**10*2**2,0*2**01*2**11*2**2)#十六进制 hex()#0 100 1110 16 4Eprint(sixteenFoo(0*…

leetcode 二分查找·系统掌握 第一个错误版本

题意&#xff1a; 题解&#xff1a; 就是经典的~01~泛型查找&#xff0c;而且一定存在这样错误的版本所以查找不会"失败"&#xff0c;返回每次查找结果即可。 int firstBadVersion(int n) {long l1,rn,mid;while(l<r){mid(lr)>>1;if(isBadVersion(mid))r…

wordpress教程自动采集并发布工具

随着互联网的快速发展&#xff0c;越来越多的人开始关注网络赚钱。而对于许多人来说&#xff0c;拥有一个自己的个人网站是一个不错的选择。然而&#xff0c;要让自己的个人网站内容丰富多样&#xff0c;就需要不断地进行更新。那么&#xff0c;有没有一种方法可以让我们轻松地…

【大数据 复习】第7章 MapReduce(重中之重)

一、概念 1.MapReduce 设计就是“计算向数据靠拢”&#xff0c;而不是“数据向计算靠拢”&#xff0c;因为移动&#xff0c;数据需要大量的网络传输开销。 2.Hadoop MapReduce是分布式并行编程模型MapReduce的开源实现。 3.特点 &#xff08;1&#xff09;非共享式&#xff0c;…