这是一年前的一个初级逆向面试题,题目比较简单,对于刚刚学习逆向的新手练习还是不错的

比较可恶的事情就是我做完了题目,告诉我需要去实地面试

MFC的程序,下面使用xspy进行定位按钮的代码 001429B0经过验证 这个就是按钮响应函数

经过分析,第三个push是要计算的值 也就是seed

第一个push是返回值 也就是key 

上图的call dword ptr ds:[edx] 就是算法函数 下面就是算法函数的实现,可以发现它还有一个参数ecx

函数中有使用到ecx+4 ecx+8 ecx+c 这三个值是不固定的,需要寻找算法

通过多次调用算法函数发现ECX的值是固定的,使用内存写入断点即可定位到ecx的算法

下面是我进行还原的算法,本题是可以直接扣汇编的,由于题目要求,我还原为了C++代码

#include "stdafx.h"
#include "windows.h"

unsigned char ecx4 = 0;
unsigned char ecx8 = 0;
unsigned char ecxC[0x100] = { 0 };

void InitializeKey(unsigned int a2, unsigned int a3)
{
	for (unsigned int i = 0; i < 0x100; i++)
	{
		ecxC[i] = i;
	}
	unsigned int var_4 = 0;
	for (unsigned int i = 0; i < 0x100; i++)
	{
		unsigned char eax = (*(((unsigned char*)&a2) + (i % a3)) + var_4);
		var_4 = (ecxC[i] + eax) % 256;
		unsigned char Temp = ecxC[i];
		ecxC[i] = ecxC[var_4];
		ecxC[var_4] = Temp;
	}
}

int ObtainingResults(unsigned int arg_0,unsigned int arg_4,unsigned char* arg_8)
{
	int i = 0;

	for (int i = 0; i < 4; i++)
	{
		ecx4 = (ecx4 + 1) % 256;;
		ecx8 = (ecxC[ecx4] + ecx8) % 256;

		unsigned char esiTemp = ecxC[ecx8];
		ecxC[ecx8] = ecxC[ecx4];
		ecxC[ecx4] = esiTemp;

		unsigned char edx = (ecxC[ecx4] + ecxC[ecx8]) % 256;
		arg_8[i] = *((unsigned char*)&arg_0 + i) ^ ecxC[edx];
	}
	return 0;
}

int main()
{
	unsigned int nInput = 123;
	InitializeKey(nInput,4);
	unsigned char ret[4] = { 0 };
	ObtainingResults(nInput,4,ret);
	printf("%u\r\n",*(unsigned int*)ret);
	system("pause");
    return 0;
}


上传的附件 样本.rar

最新回复:
Besttwuya 2024-06-03 05:33:50
前段时间,我也面试这家公司,一样的面试题.
旺仔_小可爱 2024-06-03 12:00:36
Besttwuya 前段时间,我也面试这家公司,一样的面试题.[em_1]
我看了一下 他们已经不招聘了 最后活跃时间几个月前
Besttwuya 2024-06-03 13:41:06
还有招人,我也是简单,线上面试一下。
旺仔_小可爱 2024-06-04 01:36:35
Besttwuya 还有招人,我也是简单,线上面试一下。
那有可能是不同公司 用的一个题
mb_qhtgvshx 2024-06-05 10:09:31
“通过多次调用算法函数发现ECX的值是固定的,使用内存写入断点即可定位到ecx的算法” 请问 这里是如何通过内存写入断点定位到的ecx初始化表算法的?
appview 2024-06-05 11:06:27
xspy是什么工具,有下载链接吗?
chased 2024-06-05 17:46:58
mb_qhtgvshx “通过多次调用算法函数发现ECX的值是固定的,使用内存写入断点即可定位到ecx的算法” 请问 这里是如何通过内存写入断点定位到的ecx初始化表算法的?
不一定要内存断点,设硬件写入断点也能断下在密码表初始化的地方。不知道为啥我设内存断点就会报异常,硬件断点就不会
mb_qhtgvshx 2024-06-05 18:09:54
chased 不一定要内存断点,设硬件写入断点也能断下在密码表初始化的地方。不知道为啥我设内存断点就会报异常,硬件断点就不会
那请问硬件断点怎么下呢 ? 我的意思是怎么找到ecx初始化表算法
chased 2024-06-05 20:07:44
mb_qhtgvshx 那请问硬件断点怎么下呢 ? 我的意思是怎么找到ecx初始化表算法
因为ecx是个固定值,密码表结果存在ecx+c的位置,你先找到ecx的值,往后加c个字节,就是存表的指针,存的是个内存地址,你在内存窗口跳到那个内存地址上,下硬件写入断点就能断下