某文件被加密了(基于时间的随机种子破解)

某文件被加密了

最后修改时间是2019/04/11 22:10:34。 猜测大概2019/04/11
22点11分之前,某一刻用户运行了genprik,生成了密钥加密文件。
加密算法已知,通过分析密文,只能得出密钥第1个字节是0x25第2个字节是0x61。 求完整的16个字节的密钥。

刚开始用IDA打开,IDA会提示exe的入口点在其他的位置,应该是有壳,先对它进行查壳脱壳:
在这里插入图片描述

再用IDA打开:
在这里插入图片描述

int __cdecl main(int argc, const char **argv, const char **envp)
{
   
  __time32_t v3; // ST40_4@1
  DWORD Seed; // ST38_4@1
  int v5; // eax@2
  signed int v7; // [sp+24h] [bp-34h]@1

  v3 = time32(0i64);        //0i64表示int64_t类型的0,time3()表示返回自1970年1月1日午夜起经过的秒数,或者在出现错误时返回-1
  Seed = GetCurrentProcessId() ^ v3;   //获取当前进程的唯一标识
  srand(Seed);
  v7 = 0;
  do
  {
   
    v5 = rand();
    printf(Format, (v5 >> 7) & 0xFF);
    ++v7;
  }
  while ( v7 < 16 );
  return 0;
}

这就是代码的关键部分,获取当前系统时间和进程号,来进行运算生产16字节的密钥,所以我们将时间调整到2019/04/11 22:10:34之前进行爆破,因为我们是进行爆破,所以时间不用太准确,只要在这之前都行,当然这里的2019/04/11 22:10:34可能是老师给的hint:设置密钥的正确事件。我将当前时间设为了2019/04/11 22:10:00开始,先将它转换成从1970年1月1日以来持续时间的秒数:
源代码:time.c

#include<stdio.h>
#include<time.h>
/**
struct tm {
    int tm_sec;// 秒 - 取值区间为[0,59] /
    int tm_min; // 分 - 取值区间为[0,59] /
    int tm_hour; / 时 - 取值区间为[0,23] /
    int tm_mday; / 一个月中的日期 - 取值区间为[1,31] /
    int tm_mon; / 月份 (从一月开始,0代表一月) - 取值区间为[0,11] /
    int tm_year; / 年份,其值等于实际年份减去1900 /
    int tm_wday; / 星期 - 取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 /
    int tm_yday; / 从每年的1月1日开始的天数 - 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 /
    int tm_isdst; / 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的时候,tm_isdst为0;不了解情况时,tm_isdst()为负. /
};
*/
int main(void)
{
   
    //获取时间差
    struct tm tnNormal;
    ///开始的时间:2019/04/11 22:10:00
    tnNormal.tm_year = 2019-1900;
    tnNormal.tm_mon = 4-1;
    tnNormal.tm_mday = 11;
    tnNormal.tm_hour = 22;
    tnNormal.tm_min = 10;
    tnNormal.tm_sec = 0
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值