0x0:为什么写这个系列的文章

博客原本的定位是安卓游戏的破解,可是为什么写这系列的文章呢?

由于在破解过程中,我们是无法避免来敲代码的,恢复算法,模拟算法,游戏中对数据的解密。游戏中对保存在client金币的字段加解密,游戏中资源文件动态加解密释放。都离不开我们自己来通过分析之后。自己写出来代码。

当然,语言的选择有非常多。经常使用的为c,c++,python,java,lua,这些都是在游戏破解过程中所使用过的,我们精通一门语言的编写是非常有必要的,否则,仅仅是单纯地看着别人写的教程,对比着改动游戏,对技术上来说是没有不论什么进步的,仅仅能让打字。点击鼠标更快而已。

十一这几天。打算静下心来好好复习下c,由于前些日子自己的电脑重装系统为Ubuntu了,所以就找了一点linux下的c语言开发的一些知识。

这里,不过对这几天学习的简单记录,便于以后翻阅,当然,肯定是搜集一些资料来简单整理和实验的。并不能说全部东西都是原创。当然自己也没这本事闭门造车看官方文档就能写出来程序了,这里。感谢全部共享自己学习经验和学习资料的朋友。有分享。大家才干共同进步!


0x1:准备工作


在linux下。内置了非常多编译器,如gcc,所以我们不须要来找一些软件配置开发环境了,使用默认的gedit就可以,或者使用sublime 2。效果都是不错的,对一些特殊字段进行高亮显示。


0x2:測试代码的编写

Linux 以下,假设要编译一个 C 语言源程序,我们要使用 GNU 的 gcc 编译器。以下

我们以一个实例来说明怎样使用 gcc 编译器。

<span style="font-size:18px;">int main(int argc,char **argv)
{
printf("Hello Linux\n");
}</span>


watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3VpZ3V6aTExMTA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">



然后输入   ./hello





gcc 编译器就会为我们生成一个 hello 的可运行文件.运行./hello 就能够看到程序的输出结果了.命令行中 gcc 表示我们是用 gcc 来编译我们的源程序,-o 选项表示我们要求编译器给我们输出的可运行文件名称为 hello 而 hello.c 是我们的源程序文件。


gcc 编译器有很多选项,一般来说我们仅仅要知道当中的几个就够了。


 -o 选项我们已经知道了,表示我们要求输出的可运行文件名称。 

-c 选项表示我们仅仅要求编译器输出目标代码,而不必要输出可运行文件。 

-g 选项表示我们要求编译器在编译的时候提供我们以后对程序进行调试的信息。


知道了这三个选项,我们就能够编译我们自己所写的简单的源程序了,假设你想要知道很多其他的选项,能够查看 gcc 的帮助文档,那里有着很多对其他选项的具体说明。

0x3:Makefile文件的编写


假设我们有多个c文件须要编译的话,那么我们一般也就不这样一行行代码输入了。肯定要自己写一个shell脚本来编译,可是假设一个project有非常多文件须要编译的花,那么我们优先选择的就是编写一个Makefile文件,然后运行make命令来进行这项负责的操作就可以。


比如我们编写一些文件:





那么我们就编写相应的文件:

# 这是上面那个程序的 Makefile 文件


main:main.o mytool1.o mytool2.o

gcc -o main main.o mytool1.o mytool2.o

main.o:main.c mytool1.h mytool2.h

gcc -c main.c

mytool1.o:mytool1.c mytool1.h

gcc -c mytool1.c

mytool2.o:mytool2.c mytool2.h

gcc -c mytool2.c


有了这个 Makefile 文件,只是我们什么时候改动了源程序其中的什么文件,我们仅仅要运行make 命令,我们的编译器都仅仅会去编译和我们改动的文件有关的文件,其他的文件她连理都不想去理的。


以下我们学习 Makefile 是怎样编写的。


在 Makefile 中也#開始的行都是凝视行.Makefile 中最重要的是描写叙述文件的依赖关系的说明.一般的格式是:



target: components

TAB rule


第一行表示的是依赖关系.第二行是规则.


比方说我们上面的那个 Makefile 文件的第二行main:main.o mytool1.o mytool2.o


表示我们的目标(target)main 的依赖对象(components)是 main.o mytool1.o mytool2.o 当倚赖的对象在目标改动后改动的话,就要去运行规则一行所指定的命令.就象我们的上面那个 Makefile 第三行所说的一样要运行
 gcc -o main main.o mytool1.o mytool2.o


注意规则一行中的 TAB 表示那里是一个 TAB 键

Makefile 有三个很实用的变量.各自是$@,$^,$<代表的意义各自是:


$@--目标文件,$^--全部的依赖文件,$<--第一个依赖文件.


假设我们使用上面三个变量,那么我们能够简化我们的 Makefile 文件为:


# 这是简化后的 Makefile


main:main.o mytool1.o mytool2.o

gcc -o $@ $^

main.o:main.c mytool1.h mytool2.h

gcc -c $<

mytool1.o:mytool1.c mytool1.h

gcc -c $<

mytool2.o:mytool2.c mytool2.h

gcc -c $<


经过简化后我们的 Makefile 是简单了一点,只是人们有时候还想简单一点.这里我们学习一个 Makefile 的缺省规则


..c.o:

gcc -c $<


这个规则表示全部的 .o 文件都是依赖与对应的.c 文件的.比如 mytool.o 依赖于 mytool.c


这样 Makefile 还能够变为:


# 这是再一次简化后的 Makefile

main:main.o mytool1.o mytool2.o

gcc -o $@ $^

..c.o:

gcc -c $<


好了,我们的 Makefile 也差点儿相同了,假设想知道很多其它的关于 Makefile 规则能够查看对应的文档。







Linux下C编程的学习_1的更多相关文章

  1. Linux 下shell 编程学习脚手架

    linux body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-t ...

  2. linux 下 poll 编程

    poll 与 select 很类似,都是对描述符进行遍历,查看是否有描述符就绪.如果有就返回就绪文件描述符的个数将.poll 函数如下: #include <poll.h> int pol ...

  3. Linux下Socket编程的端口问题( Bind error: Address already in use )

    Linux下Socket编程的端口问题( Bind error: Address already in use ) 在进行linux网络编程时,每次修改了源代码并再次编译运行时,常遇到下面的地使用错误 ...

  4. Linux 下IOport编程訪问

    曾经写的一篇笔记.偶尔翻出来了,放在这里做个纪念 Linux 下IOport编程訪问 这里记录的方法是在用户态訪问IOport,不涉及驱动程序的编写. 首先要包括头文件 /usr/include/as ...

  5. linux下socket编程实例

    linux下socket编程实例一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.s ...

  6. linux下libnet编程 亲自测试可用

    linux下libnet编程 亲自测试可用 亲自测试  如果build包的时候 只要把类型改了 就能改成相应的协议. 0x0800 ip 0x0806 arp 0x86DD    IPv6 0x86e ...

  7. Linux下socket编程基本知识

    本文档主要讲解了Linux下socket编程的一些基本知识,主要包括套接字和字节序的概念,以及一些常用的结构体和函数. 本文是在网易云课堂学习过程中的记录,这个老师讲得很不错,推荐大家围观. Linu ...

  8. LInux下socket编程学习笔记

    1.socket套接字: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模 ...

  9. UNIX/Linux下C语言的学习路线

    一.工具篇 “公欲善其事,必先利其器”.编程是一门实践性很强的工作,在你以后的学习或工作中,你将常常会与以下工具打交道, 下面列出学习C语言编程常常用到的软件和工具. 1.操作系统    在UNIX或 ...

随机推荐

  1. leetcode_1011. Capacity To Ship Packages Within D Days_binary search二分

    https://leetcode.com/problems/capacity-to-ship-packages-within-d-days/ 传送带每天有最大传送量V,对于n个货物[w1,w2,w3. ...

  2. CAD参数绘制mcdbsolid对象(com接口)

    C#中实现代码说明: private void DrawSolid() { //绘McDbSolid对象 axMxDrawX1.AddLinetype("MLineType1", ...

  3. Maven常用仓库地址以及手动添加jar包到仓库

    http://www.blogjava.net/fancydeepin 共有的仓库 http://repository.sonatype.org/content/groups/public/http: ...

  4. ubuntu 12.04 配置iscsi共享及挂载iscsi共享

    一.配置ubuntu 下iscsi下的target 1.配置iscsi-target: sudo apt-get install iscsi* 2.配置一个简单的iscsi target: iscsi ...

  5. 散列的键值对没初始化时不要用print打印此值,不要用 . 操作符去连接打印 这个值。

    31 delete $vertical_alignment{$anonymous};     32 print $vertical_alignment{$anonymous}."\n&quo ...

  6. Android实战简易教程-第四十九枪(两种方式实现网络图片异步加载)

    加载图片属于比较耗时的工作,我们需要异步进行加载,异步加载有两种方式:1.通过AsyncTask类进行:2.通过Handler来实现,下面我们就来看一下如何通过这两种方式实现网络图片的异步加载. 一. ...

  7. cc.Node—坐标系统

    cc.Vec21: cc.Vec2 二维向量坐标, 表结构{x: 120, y: 120}; cc.v2(x, y) 创建一个二维向量 cc.p() 创建一个二外向量;2: cc.pSub: 向量相减 ...

  8. 题解 洛谷P1903/BZOJ2120【[国家集训队]数颜色 / 维护队列】

    对于不会树套树.主席树的本蒟蒻,还是老老实实的用莫队做吧.... 其实这题跟普通莫队差不了多远,无非就是有了一个时间,当我们按正常流程排完序后,按照基本的莫队来,做莫队时每次循环对于这一次操作,我们在 ...

  9. elementui 后台管理系统遇到的问题(二) 树形控件 el-tree

    elementui中树形控件的使用 一.将后台返回的数据填充到前端控件中,需要注意的几点问题 (1).el-tree中需要绑定node-key='自定义的id名称' (2).在配置data中defau ...

  10. 关于latch: cache buffers chains的sql优化

    前段时间,优化了一些耗buffer比较多的sql,但是CPU使用率还是没下来 . 查看操作系统CPU使用率 查看awr,发现又有一条超级耗性能的sql冒出来了. 该SQL每次执行耗费3e多个buffe ...