零基础学CE,手把手教程!!!(软件逆向进阶篇)

1.本次报告针对扫雷游戏,分析“初级”,“中级”,“高级”的棋盘内存地址范围

2.找出“雷数”,“笑脸”,“计时器”的内存地址

3.分析地雷存放的算法

4.利用思维导图分析“扫雷”游戏软件的工作原理

1.分析“初级”,“中级”,“高级”的棋盘内存地址范围

1.1内存地址范围:

根据一般步骤将进程导入CE,点击扫雷棋盘上到左上角第一个值(多次尝试,最好是位数字),然后在CE中进行内存扫描(由于不知道数字1在内存中的存放格式,所以需要进行模糊搜索),先选择未知初始值和字节选项;然后进行首次扫描,实验结果有很多,重置游戏点击笑脸后再点击棋盘第一个格子,如果数字与第一次扫描时的数字相同则选择未变动的值进行再次扫描,如果不同,则选择变动的值进行再次扫描,发现结果会变少,不断地重置游戏,重复上述步骤,直到找到对应的内存地址,将其放入地址栏点击进行查看,浏览其对应的内存地址范围;再通过点击最后一个格子找到相应的内存地址,与第一次扫描结果一起分析之后,即可得出结论。

1.1.2“初级”棋盘内存地址范围:

扫描类型 选择未知的初始值,点击初级棋盘上第一格,进行首次扫描

零基础学CE,手把手教程!!!(软件逆向进阶篇)_第1张图片

重置棋盘,点击第一格,如果与第一次扫描的值相同,扫描类型选择变动的数值 然后进行再次扫描

零基础学CE,手把手教程!!!(软件逆向进阶篇)_第2张图片

 重置棋盘,点击第一格,如果与第一次扫描的值不同,扫描类型选择变动的数值 然后进行再次扫描

零基础学CE,手把手教程!!!(软件逆向进阶篇)_第3张图片

零基础学CE,手把手教程!!!(软件逆向进阶篇)_第4张图片

 重复进行上述操作,直到出现基址

零基础学CE,手把手教程!!!(软件逆向进阶篇)_第5张图片

初级棋盘内存起始地址:01005361

同理可得:点击最后一个格子找到相应的内存地址零基础学CE,手把手教程!!!(软件逆向进阶篇)_第6张图片初级棋盘内存最终地址:01005469

所以初级棋盘内存地址范围:01005361-01005469

1.1.3“中级”棋盘内存地址范围:零基础学CE,手把手教程!!!(软件逆向进阶篇)_第7张图片中级棋盘内存起始地址:01005361零基础学CE,手把手教程!!!(软件逆向进阶篇)_第8张图片中级棋盘内存最终地址:01005550

所以中级棋盘内存地址范围:01005361-01005550

1.1.3“高级”棋盘内存地址范围:零基础学CE,手把手教程!!!(软件逆向进阶篇)_第9张图片高级棋盘内存起始地址:01005361零基础学CE,手把手教程!!!(软件逆向进阶篇)_第10张图片高级棋盘内存最终地址:0100555E

所以高级棋盘内存地址范围:01005361-0100555E

2.2找出“雷数”,“笑脸”,“计时器”的内存地址

2.2.1关键值地址查找

扫雷游戏主要包括时间,地雷数以及笑脸等关键值。

接下来详细分析寻找地雷内存地址的具体过程,同2.1一样将游戏进程导入CE软件后,与其不同的是寻找地雷数是已知数值,通过精确查找例如高级棋盘的99地雷数,进行首次扫描会出现很多数值,难以判断,由于地雷数与标记棋子数是一样的数值,我们可以通过标记地雷数来确定扫描类型,首先我们随意标记一处棋子会发现地雷数也会少一,通过精确查找98数字,可以扫描出一部分地址,如此重复知道地址栏里只剩下一个地址,并且会观察到该数值与地雷数是一样的,由此便找出了地雷数所在的地址,将其放入下方地址栏后我们可以通过修改特征值来使自己获胜,例如可以修改为一,可以达到一击必胜的效果。

查找时间的地址范围,一开始是0,我们可以通过精确值查找来锁定时间的范围,第一次扫描之后,时间会一直改变通过选择变动的数值进行再次扫描,在此过程中不必点击任何动作,因为其他数值不变,只有时间不停的改变点击变动的值进行再次扫描可以快速定位地址,由此就找到了时间的内存地址。

2.2.2雷数的内存地址

扫描类型选择精确数值数值类型选择字节先找初级棋盘的雷数,输入10进行首次扫描零基础学CE,手把手教程!!!(软件逆向进阶篇)_第11张图片我们可以先插入一个旗子旗子数就会变成9.进行再次扫描该地址是旗子的地址01005194零基础学CE,手把手教程!!!(软件逆向进阶篇)_第12张图片------------------------------------------------------------------------------------------------------------

首先我们先用初级棋盘精确搜索10,然后切换成中级棋盘精确搜索40,再次扫描首先排除旗子的基址。然后将剩下两个地址改成1,之后重新开始游戏,如果可以直接过关,则该地址为雷数的基址。零基础学CE,手把手教程!!!(软件逆向进阶篇)_第13张图片零基础学CE,手把手教程!!!(软件逆向进阶篇)_第14张图片

所以雷数的内存地址是:010056A4

2.2.3笑脸的内存地址

首先通过扫描未知的初始值,如果没有遇上炸弹,就扫描未变动的数值再次扫描,如果遇上炸弹就扫描变动的数值再次扫描,如果游戏结束即笑脸,数值也会发生变化。零基础学CE,手把手教程!!!(软件逆向进阶篇)_第15张图片零基础学CE,手把手教程!!!(软件逆向进阶篇)_第16张图片 零基础学CE,手把手教程!!!(软件逆向进阶篇)_第17张图片 所以笑脸的内存地址是:01005160

2.2.4计时器的内存地址

首次扫描类型选择未知的初始值零基础学CE,手把手教程!!!(软件逆向进阶篇)_第18张图片 然后开始游戏,时间逐渐增加,扫描类型切换为 变动的数值 进行多次扫描,发现计时器的基址零基础学CE,手把手教程!!!(软件逆向进阶篇)_第19张图片所以计时器的内存地址是:01005794

2.3分析地雷存放的算法

扫雷游戏是一款十分经典的单机小游戏。它的精髓在于,通过已翻开格子所提示的周围格地雷数,来判断未翻开格子里是否是地雷。

现在出n行m列的雷区中的地雷分布,要求计算出每个非地雷格的周围格地雷数。

注:每个格子周围格有八个:上、下、左、右、左上、右上、左下、右下。

Input

 第一行包含两个整数n和m,分别表示雷区的行数和列数。接下来n行,每行m个字符,‘*’表示相应格子中是地雷,‘?’表示相应格子中无地雷。字符之间无任何分隔符。

Output

 n行,每行m个字符,描述整个雷区。若相应格中是地雷,则用‘*’表示,否则用相应的周围格地雷数表示。字符之间无任何分隔符。

Hint算法思想

借用两个数组,一个字符数组a存放起字符,一个int型数组b存放数字,起始初始化为0。判断a中哪个位置是否有雷,如果有将b中对应位置的相邻八个位置的数据加1。

由于输入时需要输入空格,所有提前输入一个字符t,刚好在后面位置与输入的空格 “抵消” 掉,当然少输入一个字符,最后还要在输入一个字符t

#include

int b[101][101]={0};

char a[101][101],t;

int main()

{

int n,m;

int i,j,i1,i2,j1,j2;

    scanf("%d %d",&n,&m);

    scanf("%c",&t); //先输入一个字符,正好把后面敲的空格给填上

    for(i=1;i<=n;i++)

{

        for(j=1;j<=m;j++)

{

            scanf("%c",&a[i][j]);

            if(a[i][j]=='*')

{

//有*在b数组中对应相邻八个位置各加1

i1=i-1;

i2=i+1;

j1=j-1;

j2=j+1;

                b[i1][j1]++;

                b[i1][j2]++;

                b[i1][j]++;

                b[i2][j1]++;

                b[i2][j2]++;

                b[i2][j]++;

                b[i][j1]++;

                b[i][j2]++;

            }

        }

        scanf("%c",&t); //由于空格的原因少输入一个字符,最后再补上

}

    for(i=1;i<=n;i++)

{

        for(j=1;j<=m;j++)

{

            if(a[i][j]=='*')

                printf("%c",a[i][j]);

            else

                printf("%d",b[i][j]);

        }

        putchar('\n');

    }

    return 0;

}

2.4利用思维导图分析“扫雷”游戏软件的工作原理(设计原理)零基础学CE,手把手教程!!!(软件逆向进阶篇)_第20张图片

2.5分析结论

 在本次逆向分析报告中,我们通过CE软件逆向分析,从而定位了初级中级高级各个棋盘的地址内存范围,并且通过该软件成功定位并修改了关键数值以帮助自己在最短的时间内获胜,在最后一部分通过查阅相关资料以及搜索浏览相关文献分析扫雷游戏的C语言代码,最后完成其设计导图。

在此次过程当中查阅了大量的文献资料,对于逆向分析技术有了更深的领悟同时对于相关软件技术更深刻地掌握,最难的部分应该是最后一部分对于个人能力要求较高参考了很多资料才得以完成。这次独立写本次逆向分析报告在过程中克服了很多困难,同时增强了自己写报告的能力并且对于学习过的知识有了更深的掌握。

你可能感兴趣的:(java,算法,前端)