动态库

教你如何编写游戏外挂

自古美人都是妖i 提交于 2020-01-03 03:17:18
教你如何编写游戏外挂 1、熟练的C语言知识 目前的外挂大部分都是用BC或者是vc写的,拥有熟练的C语言知识是写外挂的基本条件 2、具有很强的汇编基础 一般游戏都不可能有原代码的,必须靠反汇编或者跟踪的办法来探索其中的机理 ,所以有强的汇编基础也是必不可少的条件 3、熟练掌握跟踪和调试的工具 有了上面2个条件后,掌握一些工具也是很有必要的 跟踪的工具,softice当然是不二之选,至于反汇编的工具,我推荐用IDA PRO 这个工具反汇编出来的代码结构清晰,非常好读 如果你不具有上面的条件,还是先把基础打好,再来写外挂吧,一分耕耘,一分收获,天下没有白掉的馅饼的 二、写外挂面临的基本技术问题 1、修改进程的执行代码 要修改进程的执行代码,要先取得进程的ID,如果是由外挂程序启动,返回值里就有进程ID,如果不是的话, 需要用findwindow找到窗口句柄,再用GetWindowProcessID取得进程ID,取得进程ID以后,就可以用 writeprocessmemory来修改进程的执行代码了,使程序按照我们的意愿来执行,石器外挂里的不遇敌、寸步遇敌 就是用这样的方法来实现的 2、截获外挂发送和接收的封包 除了通过修改代码来实现的功能以外,很多的功能都是通过修改封包来实现的,要修改封包,首先要能截获它。 第一步是要跟踪出发和收的位置,至于怎么跟踪,我以后会提到,找到位置以后,有2个办法

obj,lib,dll,exe

给你一囗甜甜゛ 提交于 2019-12-31 04:59:20
obj,lib,dll,exe的关系 lib是和dll对应的。lib是静态链接库的库文件,dll是动态链接库的库文件。 所谓静态就是link的时候把里面需要的东西抽取出来安排到你的exe文件中,以后运行你的exe的时候不再需要lib。 所谓动态就是exe运行的时候依赖于dll里面提供的功能,没有这个dll,你的exe无法运行。 lib,dll,exe都算是最终的目标文件,是最终产物。而c/c++属于源代码。源代码和最终目标文件中过渡的就是中间代码obj,实际上之所以需要中间代码,是你不可能一次得到目标文件。比如说一个exe需要很多的cpp文件生成。而编译器一次只能编译一个cpp文件。这样编译器编译好一个cpp以后会将其编译成obj,当所有必须要的cpp都编译成obj以后,再统一link成所需要的exe,应该说缺少任意一个obj都会导致exe的链接失败。 1.obj里存的是编译后的代码跟数据,并且有名称,所以在连接时有时会出现未解决的外部符号的问题。当连成exe后便不存在名称的概念了,只有地址。lib就是一堆obj的组合。 2.理论上可以连接obj文件来引用其他工程 (可以认为一个obj文件等价于编译生成它的cpp文件,可以引用obj来替换cpp,也可以添加cpp来替换obj ),但实际中通常用lib来实现工程间相互引用。 3.编译器会默认链接一些常用的库,其它的需要你自己指定。

cmake基础指令 cmakelist.txt编写

天涯浪子 提交于 2019-12-30 16:05:22
主体框架: 工程配置部分:工程名,编译调试模式,编译系统语言 依赖部分:工程包,头文件,依赖库等 其他辅助:参数打印,遍历目录等 判断控制部分:条件判断,函数定义,条件执行等 源文件(.h , .cpp等) ——> 预编译——>编译——>汇编——>链接——>可执行文件 静态库:链接阶段,库中目标文件所含的所有将被程序使用的函数的机器码,被copy到最终的可执行文件中。 特点 1.静态库对函数库的链接是放在编译时期完成的; 2.程序在运行时与函数库再无瓜葛, 移植方便; 3.运行效率相对快; 4.占用磁盘和内存空间,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。 静态库的局限性: 1.空间浪费是静态库的一个问题; 2.静态库对程序的更新、部署和发布页会带来麻烦; 3.如果静态库lib更新了,所以使用它的应用程序都需要重新编译、发布给用户; 4.对于玩家来说,可能是一个很小的改动,却导致整个程序重新下载,全量更新。 5.若静态库占用1M内存,有2000个这样的程序,将占用近2G的空间。 动态库:程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。 特点 1.可执行文件只包含它需要的函数的引用表,而不是所有的函数代码; 2.只有在程序执行时, 那些需要的函数代码才被拷贝到内存中。 3.动态库在程序运行是才被载入,也解决了静态库对程序的更新

Linux strace命令

房东的猫 提交于 2019-12-28 01:21:18
简介 strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通 过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。 输出参数含义 root@ubuntu:/usr# strace cat /dev/null execve("/bin/cat", ["cat", "/dev/null"], [/* 22 vars */]) = 0brk(0) = 0xab1000access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f29379a7000access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)...brk(0) = 0xab1000brk(0xad2000) = 0xad2000fstat(1, {st_mode=S_IFCHR|0620, st

升级GCC后找不到动态库“/usr/lib64/libstdc++.so.6: version ‘CXXABI_1.3.9’ not found”的解决办法

牧云@^-^@ 提交于 2019-12-27 01:26:10
升级GCC后运行程序出现错误: /usr/lib64/libstdc++.so.6: version "CXXABI_1.3.9" not found 问题的原因是因为升级GCC后相应的动态库没有更新,导致新编译器编译程序成功,运行不成功。 使用 ls 命令查看该文件可以看到动态库是一个软链接: 1 2 > ls -l /usr/lib64/libstdc++.so.6 lrwxrwxrwx 1 root root 19 Aug 24 12:28 /usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.13 查看动态库: 1 2 3 4 5 6 > strings /usr/lib/libstdc++.so.6.0.13 | grep CXXABI CXXABI_1.3 CXXABI_1.3.1 CXXABI_1.3.2 CXXABI_1.3.3 CXXABI_1.3.4 最高版本 1.3.4 ,小于需要的 1.3.9 ,需要手动更新动态库。 动态库位于gcc编译目录下,一般来说编译都创建了一个新建的目录 build ,可以在这里查找: 1 2 3 4 5 6 7 8 > cd **/gcc-7.2.0/build/ # build是编译时创建的目录 > find . -name "libstdc++.so.*" ./prev-x86_64-pc

Linux基本认识

与世无争的帅哥 提交于 2019-12-26 15:42:54
Linux是一个开源的操作系统。在Linux中一切皆文件。Linux在服务器领域和嵌入式领域有着极大的优势,如:使用及维修总成本、硬件支持、灵活性、安全性、稳定性和可靠性、经济实惠。 Linux中的基本指令有很多,随着时间的进行慢慢进行学习,这里便不再一一赘述,只谈谈一部分内容。 1.rm指令:rm是删除指令,但是在删除文件夹的时候要加-r(递归删除)选项,-f表示的是强制删除,要慎用。 2.cp和mv指令:我个人喜欢把这两个指令放在一起记忆,cp是拷贝,mv是移动,他们的使用规则都是在指令后+【选项】【源文件】【目标文件】,所以当然也支持文件夹的操作啦,只需要加-r选项就可以啦。 3.压缩和解压: ①tar: tar有两种方式,分别是gzip(常用)和bzip2 gzip: 压缩: tar -zcvf /tmp/etc.tar.gz /etc-->将etc文件夹下的内容压缩到/tmp/目录下,并命名为etc.tar.gz 解压缩:tar -zxvf etc.tar.gz ②zip和unzip 4.find指令:使用方法:find【路径】 -name(要查找的名字) 注:这里的名字可以使用通配符(*)。 Linux权限: linux下有两种用户分别是普通用户和超级用户(root) 有两种从普通用户切换到超级用户的方式:su和su -,但是这两个方式是有区别的

gcc编译动态和静态链接库

安稳与你 提交于 2019-12-26 04:38:10
我们通常把一些公用函数制作成函数库,供其它程序使用。函数库分为静态库和动态库两种。静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。本文主要通过举例来说明在Linux中如何创建静态库和动态库,以及使用它们。 第1步:编辑得到举例的程序--hello.c和test.c; 测试程序test.c调用了公用函数my_lib_function。 hello.c: #include <stdio.h> void my_lib_function() { printf("library routine called/n"); } test.c: int main() { my_lib_function(); return 0; } 第2步:将hello.c编译成.o文件; 无论静态库,还是动态库,都是由.o文件创建的(动态库可以直接通过.c)。因此,我们必须将源程序hello.c通过gcc先编译成.o文件。 在系统提示符下键入以下命令得到hello.o文件。 # gcc -c hello.c 第3步:由.o文件创建静态库; 静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。 例如:我们将创建的静态库名为myhello

linux下动态链接库.so文件 静态链接库.a文件创建及使用

こ雲淡風輕ζ 提交于 2019-12-25 02:51:16
转摘网址为:http://www.cnblogs.com/fengyv/archive/2012/08/10/2631313.html Linux下文件的类型是不依赖于其后缀名的,但一般来讲: .o,是目标文件,相当于windows中的.obj文件 .so 为共享库,是shared object,用于动态连接的,和dll差不多 .a为静态库,是好多个.o合在一起,用于静态连接 .la为libtool自动生成的一些共享库,vi编辑查看,主要记录了一些配置信息。可以用如下命令查看 *.la文件的格式 $file *.la *.la: ASCII English text 所以可以用vi来查看其内容。 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 创建.a库文件和.o库文件: [yufei@localhost perl_c2]$ pwd /home/yufei/perl_c2 [yufei@localhost perl_c2]$ cat mylib.c #include <stdio.h> #include <string.h> void hello(){ printf("success call from perl to c library\n"); } [yufei@localhost perl_c2]$ cat mylib.h extern void

GCC编译过程与动态链接库和静态链接库

本小妞迷上赌 提交于 2019-12-24 12:09:04
1. 库的介绍 库是写好的现有的,成熟的,可以复用的代码。 现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常 。 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。 库有两种:静态库( .a、.lib)和动态库(.so、.dll)。 windows上对应的是.lib .dll linux上对应的是.a .so 在这里先介绍下Linux下的gcc编译的几个选项 g++ -c hellospeak.cpp 会将hellospeak.cpp 选项 -c 用来告诉编译器编译源代码但不要执行链接,输出结果为对象文件。文件默认名与源码文件名相同,只是将其后缀变为 .o。例如,上面的命令将编译源码文件hellospeak.cpp 并生成对象文件 hellospeak.o; 下面这条命令将上述两个源码文件编译链接成一个单一的可执行程序: $ g++ hellospeak.cpp speak.cpp -o hellospeak 如果没有-o和后面的参数,编译器采用默认的 a.out 本例中就会生成hellospeak 这样的可执行程序。 所谓静态、动态是指链接。回顾一下,将一个程序编译成可执行程序的步骤: 图:编译过程 静态库 之所以成为【静态库】, 是因为在链接阶段,会将汇编生成的目标文件 .o与引用到的库一起链接打包到可执行文件中

GCC 参数详解

不打扰是莪最后的温柔 提交于 2019-12-24 10:53:30
From http://www.cppblog.com/SEMAN/archive/2005/11/30/1440.html [介绍] gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件[预处理器cpp] 2.将预处理后的文件转换成汇编语言,生成文件.s[编译器egcs] 3.汇编变为目标代码(机器代码),生成.o的文件[汇编器as] 4.连接目标代码,生成可执行程序[链接器ld] [参数详解] -x language filename   设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根据约定C语言的后 缀名称是.c的,而C++的后缀名是.C或者.cpp,如果你很个性,决定你的C代码文件的后缀 名是.pig 哈哈,那你就要用这个参数,这个参数对他后面的文件名都起作用,除非到了 下一个参数的使用。   可以使用的参数吗有下面的这些   `c', `objective-c', `c-header', `c++', `cpp-output', `assembler', and `a ssembler-with-cpp'.   看到英文,应该可以理解的。   例子用法:   gcc -x c hello.pig    -x none filename   关掉上一个选项