md5在ida中的识别

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] BYREFv4 = (*a1 >> 3) & 0x3F;if ( v4 > 0x37 )v3 = 120 - v4;elsev3 = 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_6044dcd 指定是低位的  
按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.mzph.cn/news/857943.shtml

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

相关文章

xss.haozi.me靶场通关参考

url&#xff1a;https://xss.haozi.me/ 文章目录 0x000x010x020x030x040x050x060x070x080x090x0A0x0B0x0C00xD00xE00xF0x100x110x12 0x00 先看js代码&#xff0c;第一关给你热热手&#xff0c;没给你加过 payload&#xff1a; <script>alert(1)</script>0x01 这…

【大数据】—量化交易实战案例(基础策略)

声明&#xff1a;股市有风险&#xff0c;投资需谨慎&#xff01;本人没有系统学过金融知识&#xff0c;对股票有敬畏之心没有踏入其大门&#xff0c;所以只能写本文来模拟炒股。 量化交易&#xff0c;也被称为算法交易&#xff0c;是一种使用数学模型和计算机算法来分析市场数…

FlinkCDC pipeline模式 mysql-to-paimon.yaml

flinkcdc 需要引入&#xff1a; source端&#xff1a; flink-cdc-pipeline-connector-mysql-xxx.jar、mysql-connector-java-xxx.jar、 sink端&#xff1a; flink-cdc-pipeline-connector-paimon-xxx.jar flinkcdc官方提供connect包下载地址&#xff0c;pipeline模式提交作业和…

Python 函数注解,给函数贴上小标签

目录 什么是函数注解? 为什么使用函数注解? 如何编写函数注解? 实战演练 与类型提示(Type Hints)的关系 类型安全的运算器 什么是函数注解? 函数注解(Function Annotations)是Python 3中新增的一个特性,它允许为函数的参数和返回值指定类型。 这些注解不会改变…

Paimon Trino Presto的关系 分布式查询引擎

Paimon支持的引擎兼容性矩阵&#xff1a; Trino 是 Presto 同项目的不同版本&#xff0c;是原Faceboo Presto创始人团队核心开发和维护人员分离出来后开发和维护的分支&#xff0c;Trino基于Presto&#xff0c;目前 Trino 和 Presto 都仍在继续开发和维护。 参考&#xff1a;

win10 安装openssl并使用openssl创建自签名证书

win10创建自签名证书 下载安装配置openssl 下载地址&#xff1a; https://slproweb.com/download/Win64OpenSSL-3_3_1.exe https://slproweb.com/products/Win32OpenSSL.html 完成后安装&#xff0c;一路next&#xff0c;到达选位置的之后选择安装的位置&#xff0c;我这里选…

已成功见刊检索的国际学术会议论文海报展示(2)

【先投稿先送审】第四届计算机、物联网与控制工程国际学术会议&#xff08;CITCE 2024) 大会官网&#xff1a;www.citce.org 时间地点&#xff1a;2024年11月1-3日&#xff0c;中国-武汉 收录检索&#xff1a;EI Compendex&#xff0c;Scopus 主办单位&#xff1a;四川师范…

计算机组成原理 —— 存储系统(主存储器基本组成)

计算机组成原理 —— 存储系统&#xff08;主存储器基本组成&#xff09; 0和1的硬件表示整合结构寻址按字寻址和按字节寻址按字寻址按字节寻址区别总结 字寻址到字节寻址转化 我们今天来看一下主存储器的基本组成&#xff1a; 0和1的硬件表示 我们知道一个主存储器是由存储体…

C++ | Leetcode C++题解之第174题地下城游戏

题目&#xff1a; 题解&#xff1a; class Solution { public:int calculateMinimumHP(vector<vector<int>>& dungeon) {int n dungeon.size(), m dungeon[0].size();vector<vector<int>> dp(n 1, vector<int>(m 1, INT_MAX));dp[n][m …

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

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

MySQL学习笔记-进阶篇-视图和存储过程

四、视图和存储过程 视图 存储过程 基本语法 创建 CREATE PROCEDURE ([参数列表]) BEGIN --SQL END; 调用 CALL 存储过程名&#xff08;[参数列表]&#xff09; 查看 --查看指定数据库的存储过程及状态信息 SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SHCEMA…

indexedDB---掌握浏览器内建数据库的基本用法

1.认识indexedDB IndexedDB 是一个浏览器内建的数据库&#xff0c;它可以存放对象格式的数据&#xff0c;类似本地存储localstore&#xff0c;但是相比localStore 10MB的存储量&#xff0c;indexedDB可存储的数据量远超过这个数值&#xff0c;具体是多少呢&#xff1f; 默认情…

【软件设计】详细设计说明书(word原件,项目直接套用)

软件详细设计说明书 1.系统总体设计 2.性能设计 3.系统功能模块详细设计 4.数据库设计 5.接口设计 6.系统出错处理设计 7.系统处理规定 软件全套资料&#xff1a;本文末个人名片直接获取或者进主页。

C语言笔试题:实现把一个无符号整型数字的二进制序列反序后输出

目录 题目 实例 方法一&#xff1a;直接交换 方法二&#xff1a;间接交换 拓展 题目 编写一个函数&#xff0c;将一个无符号整数的所有位逆序&#xff08;在32位机器下&#xff09; 实例 例如有一个无符号整数 unsigned int num 32; unsigned int 在32位系统中占4个字…

洛谷 P10584 [蓝桥杯 2024 国 A] 数学题(整除分块+杜教筛)

题目 思路来源 登录 - Luogu Spilopelia 题解 参考了两篇洛谷题解&#xff0c;第一篇能得出这个式子&#xff0c;第二篇有比较严格的复杂度分析 结合去年蓝桥杯洛谷P9238&#xff0c;基本就能得出这题的正确做法 代码 #include<bits/stdc.h> #include<iostream&g…

测试辅助工具(抓包工具)的使用2 之 抓包工具的基本用法

1.过滤设置: Filters- --- 勾选use Filters- --- 下拉选择show only the following hosts ---- 输入域名或者ip地址(多个地址用;隔开) --- 点击action(Run filterset now) 2.删除数据 方式一:点击Remove all 方式二: 黑窗口输入cls,回车 删除一条数据:选中数据---右键选择Rem…

C++ | Leetcode C++题解之第179题最大数

题目&#xff1a; 题解&#xff1a; class Solution { public:string largestNumber(vector<int> &nums) {sort(nums.begin(), nums.end(), [](const int &x, const int &y) {return to_string(x) to_string(y) > to_string(y) to_string(x);});if (nu…

基于riscv架构的DAYU800开发板套件介绍

一、简介 润和-SCDAYU800 开发平台基于平头哥高性能 RISC-V 开源架构曳影 TH1520 芯片&#xff0c;集成4核高性能RISC-V处理器玄铁C910的平头哥曳影1520&#xff0c;AI算力达4TOPs支持蓝牙、音频、视频和摄像头等功能,支持多种视频输入输出接口,并提供丰富的扩展接口&#xff…

Apple - Cocoa Event Handling Guide

本文翻译整理自&#xff1a;Cocoa Event Handling Guide&#xff08; https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/EventOverview/Introduction/Introduction.html#//apple_ref/doc/uid/10000060i 文章目录 一、导言本文件的组织另见 二、事件…