逆向学习记录--开始

逆向工程无处不在

逆向思想

就是解密。但如果能不费力的获取想要的,不必多此一举。

  • 本质就是把一个已经封装好的东西想方设法的拆开,获取细节。(举例:分析竞品成分后复刻)即————执果索因
  • 逆向思想在生活中无处不在(eg.食品配方、创意设计),在计算机中可以用二分法划分维 软件逆向硬件逆向

逆向与密码学的关系

逆向就类似于密码学的解密,如把Java文件编译成二进制文件后,人眼看起来只是数量巨多的01二进制,但实际上并非无规律,Java文件是按照一定的规则被编译为二进制的,所以,对于有这套规则的机器,这份而二进制代码就是可读的。

  • 本质: 原文(C) <————> 规则 <————> 密文(M)

  • 逆向的目的: 用工具搜集尽可能多的且有用的信息,试图复原出规则,从而实现解密。(eg.分析特定二进制段出现次数,猜测它是否是有意义的内容)

    • 经典案例:二战时美国中途岛战役破获日本通信密码
  • 逆向成功的标准: 就像密文破译不一定需要彻底搞清楚,只要实现目的就好。

    • 密文破译程度的级别:完全破译、部分破译、密钥恢复、 密码系统漏洞发现…

逆向工程分类

针对不同要进行逆向工程的对象,采用的方法和工具也不同。

  • 如,作为食品制造商,对于配方采取成分分析法和仪器来实现食品领域的逆向。计算机中,则是属于它的独特方法。但无论对象是什么(食品or一份二进制代码),本质都是上面说的针对 原文(C) <————> 规则 <————> 密文(M) 的操作。
    • 其中,目的都相同,即解密。但根据不同对象采取的特点方法不同

    • 你可以为这些逆向工程取不同的名字,比如针对食品的“coca可乐配方逆向工程”。

      • 而在计算机中为了交流方便,大家把常见的几种逆向工程统一都起了特定的名字。(二进制逆向工程、软件逆向工程、硬件逆向工程、网络协议逆向工程、数据格式逆向工程)

计算机中的逆向工程

计算机中为啥要有逆向

实际开发中没必要发源码,直接可执行文件就能搞定为了保密和安全的考虑,导致无法接触到源码,所以才催生逆向。

  • 理论上你有了游戏的源码,正确修改就可以做到修改游戏内容的效果。(当然,这个方法对本地游戏最好用)或者给游戏打定制mod,这也是对游戏的修改。(当然,一部分软件主动支持mod,会主动提供部分API或脚本接口,这个时候就不需要逆向工程,但源码依旧不知道,只是使用了这个黑盒给出的接口罢了)

    • 举例
    游戏/Mod类型 是否依赖逆向闭源技术 技术实现
    《星露谷物语》XML Mod ❌ 否 直接修改官方支持的配置文件
    《怪物猎人:世界》插件 ✅ 是 逆向游戏DLL注入代码

常见的逆向工程

用户是否可以接触源码

可以但不常见
一般情况下,我们下载一个内容,是无法下载到它的源码的(除非开源,如Linux内核)。同时,对于普通用户,如果直接给源码,还得配置相关的编译器、运行环境以及库,确定CPU所使用的指令集等等,编译后才能运行,难度高。所以,即便开源,也不会直接给源码。(PS:Java采用了虚拟机的解决方法使得源码互通)

  • 所以,针对用户,根据不同的CPU指令集和OS类型直接编译好可执行文件,用户找到适合自己的文件后直接下载、点击运行就好
    • eg.x86_64-linux或arm64-windows(最终的可执行文件需要同时满足硬件兼容性和系统兼容性。)

下载的软件里是啥

电脑下载游戏或软件后,文件夹里的内容通常不是源码,而是编译后的可执行文件、资源文件和支持库。

1. 软件安装后,文件夹内一般包含以下内容:

  • 二进制文件(编译后的机器码):
    • 如.exe(Windows可执行程序)
    • .dll(动态链接库,包含功能模块)
  • 资源文件:
    • 如贴图(.png/.dds)、音频(.wav/.ogg)、3D模型(.fbx/.obj)
    • 配置文件(.ini/.json)
  • 运行时依赖:
    • 游戏引擎库(如Unity的UnityPlayer.dll)
    • 系统库(如DirectX的d3dx9_43.dll)

2. 如何区分“源码”和“编译后文件”?

特征 源码 编译后文件
文件类型 .c/.cpp/.py/.lua等文本 .exe/.dll/.so等二进制
可读性 用文本编辑器可直接阅读 乱码(需反编译工具如Ghidra)
修改方式 编辑后需重新编译 直接修改需逆向工程或资源替换

总结

由此,面对想要获取文件中的内容或者查看源码时,无法合理或者及时获取源码,就要进行反编译,即逆向工程。

你可能感兴趣的:(逆向工程,学习)