zoukankan      html  css  js  c++  java
  • 加密数据包加解密部分逆向跟踪

     逆向跟踪了下某雷P2SP Content Distribution的协议中解密函数

    char __stdcall sub_21343310(int a1, int a2)
    {
    unsigned int v2; // ebx@1
    char result; // al@2
    int v4; // edi@5
    signed int v5; // esi@5
    int v6; // ecx@7
    int v7; // edx@7
    int v8; // eax@7
    int v9; // ecx@7
    char v10; // al@8
    char v11; // bl@10
    int v12; // [sp+0h] [bp-1D8h]@1
    char v13; // [sp+Ch] [bp-1CCh]@5
    char v14; // [sp+13Ch] [bp-9Ch]@5
    char v15; // [sp+194h] [bp-44h]@5
    int v16; // [sp+1A4h] [bp-34h]@5
    int v17; // [sp+1A8h] [bp-30h]@5
    int v18; // [sp+1ACh] [bp-2Ch]@5
    int v19; // [sp+1B0h] [bp-28h]@5
    int v20; // [sp+1B4h] [bp-24h]@5
    int v21; // [sp+1B8h] [bp-20h]@5
    int v22; // [sp+1BCh] [bp-1Ch]@5
    int v23; // [sp+1C0h] [bp-18h]@5
    void *Memory; // [sp+1C4h] [bp-14h]@5
    int *v25; // [sp+1C8h] [bp-10h]@1
    int v26; // [sp+1D4h] [bp-4h]@5

    v2 = 0;
    v25 = &v12;
    if ( a1 )
    {
    if ( (*(_BYTE *)a2 + 4) & 0xF )
    {
    result = 0;
    }
    else
    {
    v4 = operator new();
    Memory = (void *)v4;
    v26 = 0;
    md5_init(&v14);
    md5_update(&v14, (const void *)a1, 8u);
    md5_finish(&v14, (int)&v15);
    aes_init(&v13, 0x10u, &v15);
    v16 = 0;
    v20 = 0;
    v17 = 0;
    v21 = 0;
    v18 = 0;
    v22 = 0;
    LOBYTE(v26) = 1;
    v5 = 12;
    v19 = 0;
    v23 = 0;
    while ( *(_DWORD *)a2 != v5 )
    {
    v16 = *(_DWORD *)(v5 + a1);
    v17 = *(_DWORD *)(v5 + a1 + 4);
    v18 = *(_DWORD *)(v5 + a1 + 8);
    v19 = *(_DWORD *)(v5 + a1 + 12);
    aes_decrypt(&v13, (int)&v16, (int)&v20);
    v6 = v21;
    v7 = v2 + v4;
    v5 += 16;
    v2 += 16;
    *(_DWORD *)v7 = v20;
    v8 = v22;
    *(_DWORD *)(v7 + 4) = v6;
    v9 = v23;
    *(_DWORD *)(v7 + 8) = v8;
    *(_DWORD *)(v7 + 12) = v9;
    }
    memcpy((void *)(a1 + 12), (const void *)v4, v2);
    v10 = *((_BYTE *)Memory + v2 - 1);
    if ( v10 <= 0 || v10 > 16 )
    {
    v11 = 0;
    LOBYTE(v26) = 0;
    sub_214B2210(&v13);
    }
    else
    {
    LOBYTE(v26) = 0;
    *(_DWORD *)a2 = v2 - v10 + 12;
    v11 = 1;
    sub_214B2210(&v13);
    }
    sub_21572560(Memory);
    result = v11;
    }
    }
    else
    {
    result = 0;
    }
    return result;
    }

    参考:

    http://hi.baidu.com/vessial/item/75b3f03a18b5a1fe97f88d7c

  • 相关阅读:
    Spring Boot Common application properties(转载)
    SVN中trunk,branches,tags用法详解(转载)
    约定优于配置
    JavaScript封装一个MyAlert弹出框
    JavaScript封装一个实用的select控件
    JavaScript的8行代码搞定js文件引入问题
    JavaScript处理数据完成左侧二级菜单的搭建
    SpringMVC+Mybatis实现的Mysql分页数据查询
    十步完全理解 SQL(转载)
    sql语句练习50题
  • 原文地址:https://www.cnblogs.com/moonflow/p/2708627.html
Copyright © 2011-2022 走看看