前言
今天还原一个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';
}
}