【软件逆向-2023年初级逆向工程师面试题分析笔记 代码还原】此文章归类为:软件逆向。
这是一年前的一个初级逆向面试题,题目比较简单,对于刚刚学习逆向的新手练习还是不错的
比较可恶的事情就是我做完了题目,告诉我需要去实地面试

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;
}


最后于 2小时前
被旺仔_小可爱编辑
,原因:
更多【软件逆向-2023年初级逆向工程师面试题分析笔记 代码还原】相关视频教程:www.yxfzedu.com