算法还原练习-20160920

前言

今天还原一个Demo的算法,程序是vc6写的c++程序。
程序比较小,几十KB. 将每个函数都扫了一遍,初步的命名。找到了疑似算法的周边函数.
但是如何按照程序流程走到算法函数执行的事情上,出了点问题。
IDA分析全局类方法偏移时,将函数列表后面标成对齐值了, 和算法相关的成员函数偏移被挡在对齐值的后面. 不知道哪里调用的。
后面修正了类方法偏移表后面的对齐值为成员函数地址(验证了一下,真是成员函数地址), 然后再找类成员方法偏移的首地址,就可以找到交叉参考了。
在出现类偏移首地址的附近, 注意看call[reg + offset]在IDA提示区的函数地址,如果符合流程,就可以跟进去看了。
如果出现ecx的赋值或等价赋值,然后 call [reg +offset], offset是4的倍数,那一定是调用了类成员函数。
出现类成员函数地址偏移表,说明,这种类实例一定是全局的类,类数组或类指针.

算法还原试验

// testCase1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>

/**
url decrypt

param 3: 22 bytes length
param 2: char*
00BCFF9C  2D B2 C9 3C 09 AD 60 F3 BC 9A 2C 35 ED F1 D1 48  -采<.璥蠹?5眈袶

pwd is char, from [00BCFF9C + 0] to [00BCFF9C + 15]

param 1: 52 bytes :

00BCE638  72 F1 8A 7B 04 B5 78 B3 FC DA 35 7B EA B3 8D 0A  r駣{.祒滁?{瓿?
00BCE648  2B AB 9D 64 53 B5 34 AD EA 82 79 6B B1 A3 C8 1E  +珴dS?倅k保?
00BCE658  69 F5 72 F1 8A 7B 04 B5 78 B3 FC DA 35 7B EA B3  i鮮駣{.祒滁?{瓿
00BCE668  8D 0A 2B AB 9D 64 53 B5 34 AD EA 82 79 6B B1 A3  ?+珴dS?倅k保
00BCE678  C8 1E 69 F5 00 00 00 00 00 00 00 00 00 00 00 00  ?i?...........

100023F8    E8 37000000     call <91C7DF6D.fnDecAry>
100023FD    8B7D 10         mov edi,dword ptr ss:[ebp+0x10]

00BCE638  68 74 74 70 3A 2F 2F 77 77 77 2E 79 30 75 6B 75  http://www.y0uku
00BCE648  31 2E 63 6F 6D 2F 63 69 61 2F 62 69 6B 65 2E 61  1.com/cia/bike.a
00BCE658  73 70 72 F1 8A 7B 04 B5 78 B3 FC DA 35 7B EA B3  spr駣{.祒滁?{瓿

dst char = src ^ pwd ^ '7'
*/

#define ENC_LEN 0x22

const BYTE ucKeyAry[16] = {0x2D, 0xB2, 0xC9, 0x3C, 0x09, 0xAD, 0x60, 0xF3,
                           0xBC, 0x9A, 0x2C, 0x35, 0xED, 0xF1, 0xD1, 0x48
                          };

BYTE ucEncDecBuffer[ENC_LEN + 1] = {0x72, 0xF1, 0x8A, 0x7B, 0x04, 0xB5, 0x78, 0xB3,
                                    0xFC, 0xDA, 0x35, 0x7B, 0xEA, 0xB3, 0x8D, 0x0A,
                                    0x2B, 0xAB, 0x9D, 0x64, 0x53, 0xB5, 0x34, 0xAD,
                                    0xEA, 0x82, 0x79, 0x6B, 0xB1, 0xA3, 0xC8, 0x1E,
                                    0x69, 0xF5, 0x0
                                   };

void urlDec(BYTE* ucEncDecAry, int iLenEncDecAry, const BYTE* ucKeyAry);

int main(int argc, char* argv[])
{
    urlDec(ucEncDecBuffer, ENC_LEN, ucKeyAry);
    printf("%s\n", ucEncDecBuffer);
    system("pause");
    return 0;
}

void urlDec(BYTE* ucEncDecAry, int iLenEncDecAry, const BYTE* ucKeyAry)
{
    for (int i = 0; i < iLenEncDecAry; i++) {
        ucEncDecBuffer[i] = (ucEncDecBuffer[i] ^ ucKeyAry[i % 16]) ^ '7';
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值