引例:海博TV

思路:抓包发现请求头有一些Signature加密,简单的用一个java层自吐 。发现没有hook到。这时 候盲猜在so。试试search 【System.loadLibrary("】 与本包名有关的刚好就一个找到hook一下 接下来 就是 bbbbbblalala 的跟着流程往下找在so中找到sha1。

emmm,这里的话是在libm2o_jni.so, 传入的明文是个地址( &p ),因此hook时需要

hexdump(ptr.readPointert())

snprintf (     )

SHA1

基本思路都是将信息分成N个分组,每组64个字节(512 位),每个分组都进行摘要运算。

当一个分组的摘要运算完毕后,将上一个分组的结果也用于下一个分组的运算。

当最后一个分组长度小于448 b那么会加上0x80 然后补足448 ,在最后64位为长度标识,大端序

=========================================================================

对压入数据的处理:(以 ”abc“ 为例)

61 62 63 80 00 00 00 00 00 00 00 00 00 00 00 00               61 62 63 对应 97 98 99 即 a b c

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00               0x80   对应128 二进制10000000

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 18              18代表24位 即明文所占bit

因共有64位表示数据大小

那么sha1 的摘要极限是2的63次方

=========================================================================

SO:sha1_encode:

1.SHA1_Init(v10);

int __fastcall SHA1_Init(_DWORD *a1)
{int result; // r0memset(a1, 0, 0x60u);a1[1] = -271733879; //0xEFCDAB89;*a1 = 1732584193;   //0x67452301;result = 1;a1[2] = -1732584194;//0x98BADCFE;a1[3] = 271733878;  //0x10325476;a1[4] = -1009589776;//0xC3D2E1F0;return result;
}

初始化常量

  1. 0x67452301;
  2. 0xEFCDAB89;
  3. 0x98BADCFE;
  4. 0x10325476;
  5. 0xC3D2E1F0;

2.SHA1_Update((int)v10, a1);

//压入数据
int SHA1Input(SHA1Context *context, const uint8_t *message_array, unsigned length) {while (length-- && !context->Corrupted) {context->Message_Block[context->Message_Block_Index++] = (*message_array & 0xFF);context->Length_Low += 8;if (context->Length_Low == 0) {context->Length_High++;if (context->Length_High == 0) {/* Message is too long */context->Corrupted = 1;}}//如果当前index = 64 那么先进行一轮计算if (context->Message_Block_Index == 64) { SHA1ProcessMessageBlock(context);}message_array++;}return shaSuccess;
}

3.SHA1_Final();

void SHA1ProcessMessageBlock(SHA1Context *context) {const uint32_t K[] = { /*  SHA1 的K表 */0x5A827999,0x6ED9EBA1,0x8F1BBCDC,0xCA62C1D6};int t; /* Loop counter */uint32_t temp; /* Temporary word value */uint32_t W[80]; /* Word sequence */uint32_t A, B, C, D, E; /* Word buffers *//** Initialize the first 16 words in the array W*/for (t = 0; t < 16; t++) {W[t] = context->Message_Block[t * 4] << 24;W[t] |= context->Message_Block[t * 4 + 1] << 16;W[t] |= context->Message_Block[t * 4 + 2] << 8;W[t] |= context->Message_Block[t * 4 + 3];}for (t = 16; t < 80; t++) {W[t] = SHA1CircularShift(1, W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16]);//W[t] = W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16];}A = context->Intermediate_Hash[0];B = context->Intermediate_Hash[1];C = context->Intermediate_Hash[2];D = context->Intermediate_Hash[3];E = context->Intermediate_Hash[4];for (t = 0; t < 20; t++) {temp = SHA1CircularShift(5, A) +((B & C) | ((~B) & D)) + E + W[t] + K[0];E = D;D = C;C = SHA1CircularShift(30, B);B = A;A = temp;}for (t = 20; t < 40; t++) {temp = SHA1CircularShift(5, A) + (B ^ C ^ D) + E + W[t] + K[1];E = D;D = C;C = SHA1CircularShift(30, B);B = A;A = temp;}for (t = 40; t < 60; t++) {temp = SHA1CircularShift(5, A) +((B & C) | (B & D) | (C & D)) + E + W[t] + K[2];E = D;D = C;C = SHA1CircularShift(30, B);B = A;A = temp;}for (t = 60; t < 80; t++) {temp = SHA1CircularShift(5, A) + (B ^ C ^ D) + E + W[t] + K[3];E = D;D = C;C = SHA1CircularShift(30, B);B = A;A = temp;}context->Intermediate_Hash[0] += A;context->Intermediate_Hash[1] += B;context->Intermediate_Hash[2] += C;context->Intermediate_Hash[3] += D;context->Intermediate_Hash[4] += E;context->Message_Block_Index = 0;
}

#SHA1 pad

void SHA1PadMessage(SHA1Context *context) {/** Check to see if the current message block is too small to hold* the initial padding bits and length. If so, we will pad the* block, process it, and then continue padding into a second* block.*/if (context->Message_Block_Index > 55) {context->Message_Block[context->Message_Block_Index++] = 0x80;while (context->Message_Block_Index < 64) {context->Message_Block[context->Message_Block_Index++] = 0;}SHA1ProcessMessageBlock(context);while (context->Message_Block_Index < 56) {context->Message_Block[context->Message_Block_Index++] = 0;}} else {context->Message_Block[context->Message_Block_Index++] = 0x80;while (context->Message_Block_Index < 56) {context->Message_Block[context->Message_Block_Index++] = 0;}}/** Store the message length as the last 8 octets*/context->Message_Block[56] = context->Length_High >> 24;context->Message_Block[57] = context->Length_High >> 16;context->Message_Block[58] = context->Length_High >> 8;context->Message_Block[59] = context->Length_High;context->Message_Block[60] = context->Length_Low >> 24;context->Message_Block[61] = context->Length_Low >> 16;context->Message_Block[62] = context->Length_Low >> 8;context->Message_Block[63] = context->Length_Low;SHA1ProcessMessageBlock(context);
}

【 逆向基础 】密码学实现(SHA1)相关推荐

  1. 20145335郝昊《网络攻防》Bof逆向基础——ShellCode注入与执行

    20145335郝昊<网络攻防>Bof逆向基础--ShellCode注入与执行 实验原理 关于ShellCode:ShellCode是一段代码,作为数据发送给受攻击服务器,是溢出程序和蠕虫 ...

  2. Unity3D逆向基础教程第一课

    课程名称:Unity3D逆向基础教程第一课 课程类型:Unity3D 课程内容: 1.unity逆向环境搭建 2.unity文件介绍 3.reflector工具使用 课程时长:25分钟 课程作者:Sa ...

  3. 不反编译、无逆向基础也能轻松编写Android App Hook插件? Xposed的远房表弟,Hookworm来也!

    前言 Xposed的大名相信很多同学都不陌生,它提供了一种能力,可以在不修改原apk的情况下,以插件的方式改变目标App的某些行为. 但随着Android系统版本的迭代,原来的Xposed已经不适合在 ...

  4. 爬虫逆向基础,认识 SM1-SM9、ZUC 国密算法

    这是「进击的Coder」的第 507 篇技术分享 作者:K小哥 来源:K哥爬虫 " 阅读本文大概需要 7 分钟. " [01x00] 简介 国密即国家密码局认定的国产加密算法,爬虫 ...

  5. 爬虫逆向基础,认识 SM1/SM2/SM3/SM4/SM7/SM9/ZUC 国密算法

    文章目录 [01x00] 简介 [02x00]算法概述 [03x00]算法详解 [03x01]SM1 分组加密算法 [03x02]SM2 椭圆曲线公钥加密算法 [03x03]SM3 杂凑算法 [03x ...

  6. iOS逆向(1)-密码学(RSA)

    要讲逆向,那么肯定少不了密码学,因为所有的逆向(攻防)都是对已加密的数据进行解密.所以我们必须初步了解加密的方式有哪些,毕竟知己知彼,才能百战百胜. 接下来,我将从以下四方面来讲述密码学相关的内容: ...

  7. android des ecb加密_Android逆向 | 基础知识篇 01

    常见加密算法 编码 Base64 所有的数据都能被编码为只用65个字符就能表示的文本. 标准的Base64每行为76个字符,每行末尾添加一个回车换行符(\r\n).不论每行是否满76个字符,都要添加一 ...

  8. JS逆向基础知识个人总结

    函数相关 函数自动执行-1 (function auto(){console.log("自动执行"); })(); 函数自动执行-2 $(function auto(){conso ...

  9. Android 逆向基础

    Android 反编译教程 博客内容 基本知识 几个重要的工具 技术原理 apktool dex2jar + jd-gui DEX文件结构学习 Monkey使用手册 Android权限列表以及说明 博 ...

最新文章

  1. MySQL二进制日志文件过期天数设置说明
  2. 如何打印出 SAP Spartacus 调用 OCC API 消费的所有 endpoint
  3. 使用vs自带的性能诊断工具
  4. 【 HRBUST - 1055】Single(模拟,dp,打表)(总结)
  5. 第1章 Express MongoDB 搭建多人博客
  6. 【随机过程】马尔可夫链(2)
  7. DTNSim.java注释摘要(学习性质,有错漏的可能,红色为不明确部分)
  8. Configure Javadoc and Source Code for JRE in Eclipse JDT
  9. 伯努利试验及n重伯努利试验
  10. 9、电话区号信息API接口,免费好用
  11. 4.1 使用旋转和镜像工具制作图标 [Illustrator CC教程]
  12. 近似概率编程文献综述
  13. 小程序云开发请求云函数成功,但result为空/null的处理,四种问题处理方法汇总
  14. 3dsmax-3dsmax技巧
  15. 聚乳酸(PLA)简介
  16. NATAPP 购买隧道的优惠码,免费拿走不谢
  17. HNUCM湖南中医药大学信息科学与工程学院第二届新生赛
  18. python爬取标题和作者时间的小程序
  19. 如何用matlaab把csv转为mat文件_数学建模竞赛学习笔记:用TOPSIS模型进行综合评价
  20. 伪装地理位置软件任我行“android版本发布

热门文章

  1. 【运算放大器仿真方式记录】
  2. 攻防世界,如来十三掌的writeup
  3. 想跳槽涨薪的必看!企业java开发用什么软件
  4. ppt模板怎样用到html中,如何添加套用 PPT 模板?教你两种方法
  5. 人生的本质,就是‬一个人活着不要对别人心存太多期‬待
  6. 第五十七篇:VS2015建立一个完整的c++工程:头文件.h 源文件.cpp,自动生成类
  7. PMP错题整理6.6
  8. Python除法使用注意
  9. 历届物联网竞赛中职组单片机CC2530开发板程序源码(可用于学习)
  10. 线性代数——PCA主成分分析计算步骤