day10 10.1 C语言基础之编译器安装

发布时间 2023-07-25 22:48:08作者: Chimengmeng

【一】学习C语言的原因

  • 一般公司的apk
    • 基于Java实现的加密
    • jadx反编译java,分析代码
  • NB公司的的apk,基于Java+C语言实现加密(JNI开发)
    • 加密一般使用C语言开发,在安卓项目中使用Java调用C语言开发的动态链接库文件
    • jadx反编译java,分析代码
      • 看不到加密
    • ida反编译c语言,分析代码
      • 能看到用C语言写的加密

【二】c语言动态链接库so文件反编译工具

【1】动态链接库文件介绍

  • Windows:
    • xx.dll
  • Linux/Mac/安卓:
    • xx.so
  • 使用c语言写的代码,可以编译成 xx.exe 可执行文件,也可以编译成 xx.so/xx.dll
  • 动态链接库文件(Dynamic Link Library,DLL)是一种在多个程序中共享的可执行代码和数据的文件格式。

  • 动态链接库文件通常是使用C语言编写的代码经过编译生成的二进制文件。

    • 与静态链接库不同,动态链接库在应用程序运行时可以被加载到内存中并被多个程序共享使用。
  • 使用动态链接库可以实现代码的模块化和重用,提高开发效率和便捷性。

    • 通过将常用的函数和资源封装在动态链接库中,可执行文件只需包含对动态链接库的引用,而不需要将完整的代码和数据包含在自身中。
    • 这样可以减小可执行文件的体积,提高系统资源利用率,并且方便进行库文件的升级和维护。
  • 在使用动态链接库时

    • 可执行文件在运行时需要加载动态链接库,并通过动态链接以及符号表解析的方式来获取库文件中的函数和数据,并在必要时调用和使用它们,完成整个项目的功能。
  • 总结来说

    • 动态链接库文件是一种可在多个程序之间共享的二进制文件格式
    • 通过将常用的代码和数据封装在库文件中,实现了代码的模块化和重用,降低可执行文件的体积,提高开发效率和系统资源利用率。
    • 它在应用程序运行时可以被加载到内存中,并通过动态链接和符号表解析的方式实现对库文件功能的调用和使用。

【2】为什么会有动态链接库文件

  • 可以保证我们可执行文件不会过大
  • 后期打开可执行文件后,再加载动态链接库,完成整个项目的功能
  • 代码模块化和重用:

    • 使用动态链接库可以将代码分割成独立的模块,提高代码的可管理性和重用性。

    • 不同的模块可以分别编写、测试和维护,使整个项目更加灵活和可扩展。

  • 减小可执行文件体积:

    • 动态链接库允许将一些常用的函数和资源从可执行文件中分离出来,以库的形式提供。

    • 这样可以降低可执行文件的体积,减少资源占用并提高加载速度。

    • 同时,由于多个程序可以共享同一个动态链接库,节省了系统存储空间。

  • 系统更新和维护:

    • 动态链接库允许在系统运行时对库进行更新和替换,而无需重新编译整个应用程序。

    • 这样可以方便地修复漏洞、改进功能和提高性能,同时减少用户的等待时间。

  • 动态加载和延迟加载:

    • 动态链接库具有动态加载的特性,意味着它们可以在运行时按需加载到内存中。
    • 这种灵活性使得应用程序在需要时才加载所需的功能,减少了启动时间和内存占用。
  • 总之
    • 动态链接库文件的存在可以实现代码模块化、重用和动态加载
    • 带来了诸多好处,包括减小可执行文件体积、方便系统更新和维护
    • 同时提高了应用程序的灵活性和性能。

【3】动态链接库文件反编译

  • 在C语言中,生成的可执行文件或共享库(.so文件)可以被反汇编和反编译,以还原源代码或了解其实现细节。
  • 下面是一些常用的C语言so文件反编译工具:
    • IDA Pro:
      • IDA Pro是一款强大的逆向工程工具,支持多种平台和架构,包括C语言。
      • 它提供了反汇编、反编译、调试等功能,能够帮助你还原C语言so文件的源代码。
      • 但需要注意的是,IDA Pro是商业软件,需要购买授权。
    • Ghidra:
      • Ghidra是一款由美国国家安全局(NSA)开发的开源逆向工程工具。
      • 它支持多种平台和架构,并提供反汇编、反编译、脚本编写等功能,可以用于分析和还原C语言so文件的代码。
    • Radare2:
      • Radare2是一个开源的逆向工程框架,提供了反汇编、反编译、调试等功能。
      • 它可以用于分析和还原C语言so文件的源代码,支持多种平台和架构。
    • Hopper Disassembler:
      • Hopper Disassembler是一款反汇编工具,支持多种平台和架构。
      • 它可以将C语言so文件反汇编为汇编代码,并提供可视化界面和一些高级分析功能。

【三】编译器安装

  • C语言是编译型语言,编写好代码之后,需要由编译器编译后成不同平台的可执行文件才能执行,常见的编译器GCC、MSVC、Clang

【1】mac,linux:

  • 默认自带gcc,不需要额外安卓,mac如果没有就去直接安装xcode。

xcode: https://developer.apple.com/xcode/

【2】win:

(1)MinGW介绍

  • MinGW
    • 全称为Minimalist GNU on Windows(Windows下的微型GNU)
    • 是将经典的开源C语言编译器GCC(GNU Compiler Collection)移植到Windows平台下的项目。
    • 它提供了在Windows环境中进行C语言开发和编译的工具链,包括编译器、链接器和调试器等。
  • MinGW是一种在Windows平台上使用GCC编译器的工具集合
    • 它使得开发者能够进行C语言开发
    • 并产生与Windows兼容的可执行程序。
  • 此外
    • MinGW还提供对Win32API和一些Linux开发工具的支持
    • 为开发者提供广泛的功能和灵活性。
  • 全称为:Minimalist GNU on Windows.

  • 将经典的开源C语言编译器GCC移植到了Windows平台下,并且包含了Win32API

  • 因此可以将源代码编译为在Windows中运行的可执行程序

  • 而且还可以使用一些Windows不具备的,Linux平台下的开发工具。

  • 概括来讲:MinGW 是GCC的Windows版本

(2)MinGW的主要特点

  • 移植的GCC:

    • MinGW使用了由GNU开发的GCC编译器,可以将C语言源代码编译为适用于Windows平台的可执行程序。
    • 这使得开发者能够在Windows上编写和调试高效的C语言代码,并生成与Windows兼容的可执行文件。
  • Win32API支持:

    • MinGW还包含了Windows 32位应用程序接口(Win32API),使开发者能够直接访问和使用Windows操作系统提供的功能和资源。
    • 这样可以轻松地编写与操作系统交互的程序,并实现各种Windows应用的功能。
  • Linux工具支持:

    • 除了提供Windows开发所需的工具链,MinGW还允许在Windows环境下使用一些Linux平台下常见的开发工具。
    • 例如,它支持使用GNU工具集中的一些命令行工具,如make和grep等,为开发者带来更多便利。

(3)MinGW-w64与MinGW的区别:

  • MinGW只能编译生产32位可执行程序;
  • MinGW-w64可以编译成64bit或者32bit可执行程序

【四】MinGW-w64安装

参考博客:Windows下MinGW-w64的安装 - 知乎 (zhihu.com)

【1】MinGW-w64下载

(1)懒人模式(百度云直接下载)

链接: https://pan.baidu.com/s/1aMyeF4iUl0Bfn-P8ILGliQ

提取码: mcv9

(2)官方下载

第一步:官方地址

官方地址:http://www.mingw-w64.org/doku.php

选择Downloads下载

第二步:选择SourceForge,进入下载页面。

第三步:看到如下页面,选择MinGW-W64-install.exe下载

地址:https://sourceforge.net/project

(3)MinGW-w64安装

第一步:双击MinGW-W64-install.exe

第二步:选择安装信息

  • Version:
    • 指的是 gcc 的版本,如果没有特殊的需求,一般选择最高的版本号即可。
    • 最高版本是8.1.0 ,选中它即可
    • 选默认
  • Architechture:
    • 电脑系统是 64位的,选择 x86_64;
    • 如果是 32位 系统,则选择 i686
    • 选x86_64
  • Threads:
    • 如果是 Windows ,选择 win32
    • 如果是 Linux、Unix、Mac OS 等其他操作系统要选择 posix
    • 选win32
  • Exception
    • seh 是新发明的,而 sjlj 则是古老的。
    • seh 性能比较好,但不支持 32位。
    • sjlj 稳定性好,支持 32位。
    • 建议64位操作系统选择seh
    • 选seh

第三步:最终选择如下:

第四步:一路下一步

第五步:如下

(4)配置环境变量

属性

高级系统设置

环境变量

将安装路径中的bin文件路径添加到系统环境变量中

  • 将之前安装的的 MinGW-w64 的 bin 文件夹地址,复制到新增的空白变量位置里,即可完成 MinGW-w64 的配置工作

(5)验证安装成功

  • 打开cmd窗口,输入gcc -v并按回车键,如下图即安装成功

【五】MinGW安装

【1】下载

下载地址:https://osdn.net/projects/mingw/downloads/68260/mingw-get-setup.exe/

备用地址:https://sourceforge.net/projects/mingw/files/latest/download

【2】安装

install

continue

安装中

continue

安装所有的库

Apply Changes

Apply

安装成功 - close

添加系统环境变量

命令行测试

【六】IDEA安装

  • 我们使用jetbrains公司的CLion作为IDE

【1】下载

下载地址:https://www.jetbrains.com/clion/download/other.html

【2】安装

  • 一路下一步

【3】使用

新建项目

选择 C Executable

选择解释器

运行项目

【4】小问题 - clion中文乱码问题

解决方案一

  • 按住 Ctrl+Shift+Alt+/ 选中Registry...
找到Registry

取消 run.process.with.pty

解决方案二

打开 settings - File Encodeings

直接修改文件编码

Conert

【七】Hellow World

【1】新建文件

  • main.c
# include <stdio.h>

int main(int argc, char const *argv[]) {
    
    printf("hello world\n");
    
    return 0;
}

【2】编译文件

gcc main.c 
  • 产生新文件 a.exe(win下) a.out(mac/lin下)

  • 直接运行