自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 资源 (1)
  • 收藏
  • 关注

原创 c++ 语言技巧之traits

TraitsTraits技术是STL中比较常见的一种C++语言技巧表达方式之一,通过C++模板的能力,将对象类型萃取出来,让同一个接口实现对应的功能。特别是在算法和容器中,可以解耦出具体的对象类型,使得两者通过迭代器实现链接。Traits技巧之入门C++中通过使用迭代器,将STL中的容器和算法相解耦,在C++中编译器编译器需要考虑相应的型别判断。首先我们通过模板获取形参的数据类型在这里插入代码片...

2020-07-07 23:34:27 997

原创 Linux下I/O复用模型

以下内容引述至《Linux/Unix系统编程手册》整体概览常见的程序使用的I/O模型都是单个进程每次只在一个文件描述符上执行I/O操作,每次I/O系统调用会阻塞直到完成数据传输。对于许多应用来说,传统的阻塞式I/O模型已经足够了,但这不代表所有的应用都能得到满足。如果可能的话,以非阻塞的方式检查文件描述符上是否可进行I/O操作同时检查多个文件描述符,看它们中的任何一个是否可以执行I/O操作满足这些技术需求的方案是:非阻塞式I/O 和 多进程或多线程技术非阻塞式I/O可以让我们周期性地检查

2020-06-27 13:35:15 321

原创 Linux socket 高级主题

以下内容引述自《Linux/Unix系统编程手册》流式套接字上的部分读和部分写如果套接字上可用的数据比在read()调用中请求的数据要少,这种情况下,read()直接返回可用的字节数。如果没有足够的缓冲区空间来传输所有请求的字节,并且满足了如下的几条中的其中一条时,可能会出现部分写的现象。在write() 调用中传输了部分请求的字节后被信号处理例程中断;套接字工作在非阻塞模式下(O_NONBLOCK),可能当前只能传输一部分请求的字节;在部分请求的字节已经完成传输后出现了一个异步错误。对于这里

2020-06-26 14:12:22 187

原创 Socket: 服务器设计

以下内容引述至《Linux/Unix系统编程手册》迭代型和并发型服务器对于使用Socket的网络服务器程序,有两种常见的设计形式:迭代型:服务器每次只处理一个客户端,只有当完全处理完一个客户端的请求后采取处理下一个客户端;并发型:这种类型的服务器被设计为能够同时处理多个客户端的请求迭代性服务器通常只使用与能够快速处理客户端请求的场景,因为每个客户端都必须先等待,知道前面所有的客户端都处理完了服务器才能继续服务下一个客户端。迭代型服务器的典型应用场景是当客户端和服务器之间交换单个请求和响应时。

2020-06-21 09:23:16 413

原创 Linux Socket Internet Domain

一下内容引述直《Linux/Unix系统编程手册》Internet Domain SocketInternet Domain流socket是基于TCP之上的,他们提供了可靠的双向字节流通信信道。

2020-06-19 09:19:52 230

原创 Linux网络socket: TCP/IP网络基础

以下内容引述至《Linux/Unix系统编程手册》互联网协议和层联网协议通常会被组织成一系列的层,其中每一层都构建与下层之上并提供特性以供上层使用。ARP:地址解析协议关注的是如何将因特网地址映射到硬件地址ICMP:用来在网络中传输错误和控制信息(ping和traceroute程序使用),主机和路由器使用因特网组管理协议来支持IP数据报的多播封装封装是分层联网协议中的一个重要的原则。封装中的概念是低层会将从高层向低层传递的信息当成不透明的数据来处理。换言之,低层不会尝试对高层发送过来的信息进行解

2020-06-11 09:15:10 203

原创 Linux Socket Unix Domain介绍

以下内容引述至《Linux/Unix系统编程手册》Unix domain socket允许同一系统上不同进程之间相互通信的一种方式Unix domain socket地址在Unix domain中,socket地址以路径名来表示,domain特定的socket地址结构的定义如下所示:struct socketaddr_un { sa_family_t sum_family; char sun_path[108];}sockaddr_un 结构中字段 sun_前缀是根据socket unix

2020-06-10 21:41:49 847

原创 Linux下socket入门介绍

以下内容引述至《Linux/Unix系统编程手册》概述应用程序使用socket进行通信的方式如下各个应用程序创建一个socket,socket是一个允许通信的“设备”,两个应用程序都需要用到它;服务器将自己的socket绑定到一个总所周知的地址上使得客户端能够定位到它的位置使用socket系统调用能够创建一个socket,它返回一个用来在后续系统调用中引用该socket的文件描述符fd = socket(domain, type, protocol);通信domainsocket存在于

2020-06-10 00:11:25 207

原创 Linux静态库与动态库简介

以下内容引述至《Linux/Unix系统编程手册》静态库静态库被称为归档文件,它是Unix系统提供的第一种库。静态库能带来以下好处:可以将一组经常被用到的目标文件组织进单个库文件,这样就可以使用它来构建多个可执行程序并且在构建各个应用程序的时候无需重新编译原来的源代码文件;链接命令变得更加简单。在链接命令行中只需要指定静态库的名称即可,而无需一个个地列出目标文件了。链接器知道如何搜索静态库并将可执行程序需要的对象抽取出来从结果上看,静态库实际上就是一个保存所有被添加到其中的目标文件的副本的文件

2020-05-31 11:49:35 261

原创 Linux进程间通信初入

以下内容引述至《Linux/Unix系统编程手册》IPC工具分类Unix系统上各种通信和同步工具,根据功能可以分为三类:通信: 这些工具关注进程之间的数据交换同步:这些进程关注进程和线程操作之间的同步信号:在特定场景下仍然可以作为一种同步技术数据传输字节流:通过管道、FIFO以及数据报socket交换的数据是一个无分隔符的字节流;每个读取操作可能会从IPC工具中读取任意数量的字节,不管写者写入的块的大小是什么消息:通过System V消息队列、POSIX消息队列以及数据报socket交

2020-05-28 09:22:14 117

原创 Linux线程更多细节

以下内容引述至《Linux/Unix系统编程手册》线程栈创建线程时,每个线程都有一个属于自己的线程栈,且大小固定,除主线程外的所有线程,其栈的缺省大小均为2MB,也可以调用pthread_attr_setstack()设置线程属性决定线程站的大小。线程和信号Unix信号模型是基于Unix进程模型而设计的,问世比Pthread要早几十年。所以信号与线程模型之间存在一些明显的冲突。主要是因为一方面,针对单线程进程要保持传统的信号语义,于此同时,又需要开发出使用与多线程进程环境的新信号模型。Unix信号

2020-05-27 09:15:15 231

原创 Linux线程安全和线程存储

以下内容引述至《Linux/Unix系统编程手册》可重入性若函数可同时供多个线程安全调用,则称之为线程安全函数;反之,如果函数不是线程安全的,则不能并发调用。实现线程安全有多种方式。其一是将函数与互斥量关联使用,在调用函数时将其锁定,在函数返回时解锁,对函数的访问是串行的;另一种方式是将共享变量与互斥量关联起来。可重入函数无需使用互斥量即可实现线程安全。线程特有数据实现函数线程安全最为有效的方式就是使其可重入。要使用线程特有数据,库函数执行的一般步骤如下:函数创建一个键(key),用以将不

2020-05-27 00:07:07 148

原创 Linux线程同步基础

以下内容引述至《Linux/Unix系统编程手册》线程同步方式互斥量 和 条件变量互斥量一般情况下,对每一共享资源(可能由多个先关变量组成)会使用不同的互斥量,每一个线程在访问同一资源时将采用如下协议针对共享资源锁定互斥量访问共享资源对互斥量解锁#include <pthread.h>int pthread_mutex_lock(pthread_mutex *mutex);int pthread_mutex_unlock(pthread_mutex *mutex);in

2020-05-26 00:00:13 116

原创 Linux线程初步介绍

以下内容引述至《Linux/Unix系统编程手册》线程Pthread API 定义了一干数据类型数据类型描述pthread_t线程IDpthread_mutex_t互斥对象pthread_mutexattr_t互斥属性对象pthread_cond_t条件变量

2020-05-25 23:08:20 122

原创 Linux进程创建&终止&等待&执行

以下内容引述《Linux/Unix系统编程手册》fork、exit、wait、execvefork()系统调用fork允许父进程创建子进程,子进程获取父进程的栈、数据段、堆和执行文本段的拷贝子进程会获得父进程所有的文件描述符的副本。这些副本的创建方式类似于dup(),这也意味着父、子进程中对应的描述符均指向相同的打开文件句柄。内存语义:内核将每一进程的代码段标记为只读,从而使进程无法修改自身代码。系统调用fork为子进程创建代码段时,其所构建的一系列进程级页表项均指向与父进程相同的物理内存页

2020-05-22 08:15:58 376

原创 Linux信号处理函数详解

一下内容引述《Linux/Unix系统编程详解》设计信号处理函数信号处理函数设计得越简单越好,这样降低引发竞争条件的风险。两种常见设计信号处理函数设置全局性标志变量并退出,主程序对此标记进行周期性检查,一旦置位随机采取相应动作;信号处理器函数执行某种类型的清理动作,接着终止进程或者使用非本地跳转将栈解开并将控制返回到主程序中的预定位置;可重入函数与异步信号安全函数可重入函数首先区分单线程程序和多线程程序。典型的UNIX程序都具有一条执行线程,贯穿程序始终,CPU围绕单条执行逻辑来处理指令

2020-05-15 08:55:16 932

原创 Unix/Linux系统信号详解-初入信号概念

以下内容引述《Linux/Unix系统编程手册》信号信号是事件发生时对进程的通知机制。有时也成为软件中断。信号与硬件中断的相似之处在于打断了程序执行的正常流程。发往进程的诸多内核,通常都是源于内核。引发内核为进程产生信号的各类事件如下:硬件发生异常,即硬件检测到一个错误条件并通知内核,随即再由内核发送相应信号给相关进程;用户键入了能够产生信号的终端特殊字符;发生了软件事件,比如调整了中断窗口大小,定时器到期,进程执行CPU事件超限等针对每个信号,都定义了一个唯一的整数,从1开始顺序展开

2020-05-13 09:36:05 277

原创 Linux内存分配

以下内容引述《Linux/Unix系统编程手册》堆上分配内存进程可以增加堆的大小来分配内存,所谓堆是一段长度可变的连续虚拟内存,始于进程的未初始化数据段末尾,随着内存的分配和释放而增减。通常将堆的当前内存边界称为"program break"调整program break改变堆的大小,就像命令内核改变进程的program break位置一样。最初,program break正好位于未初始化数据段末尾之后。在程序加载program break位置之后,内核会在进程试图访问这些虚拟内存地址时自动分配新

2020-05-10 12:51:22 210

原创 Linux进程

以下内容引述《Linux/Unix系统编程手册》进程程序是包含了一系列信息的文件,这些信息描述了如何在运行时创建一个进程二进制格式标志:每个程序文件都包含用于描述可执行文件格式的元信息,内核用此信息来解释文件中的其他信息;机器语言指令:对程序算法进行编码;程序入口地址:标志程序开始执行时的起始指令位置;数据:程序文件包含的变量初始值和程序使用的字面常量值;符号表以及重定位表:描述程...

2020-05-08 08:24:39 132

原创 Unix/Linux系统编程概念

以下内容引述<Unix/Linux系统编程手册>系统调用系统调用是受控的内核入口,进程可以请求内核以自己的名义去执行具体动作。系统调用将处理器从用户态切换为核心态,以便CPU访问受保护的内核内存;系统调用的组成是固定的,每个系统调用都是由一个唯一的数字来标志;每个系统调用可辅以一套参数,对用户空间(进程虚拟地址空间)与内核空间之间(相互)传递的信息加以规范系统调用步骤...

2020-05-03 00:05:21 218

原创 windows线程栈

以下内容引述《windows核心编程》线程栈当系统创建线程时,会为线程栈预定一块地址空间区域(每个线程都有自己的栈),并给区域调拨一些物理存储器。默认情况下,系统会预定1MB的地址空间并调拨2个页面的存储器。也可以通过编译器选项控制 MicroSoft C++编译器的/F选项,或者MSVC链接器的/STACK 选项/Freserve/STACK:reserve[, commit]链接器...

2020-05-02 11:13:59 273

原创 windows未处理异常

以下内容引述《windows核心编程》未处理异常异常过滤函数返回EXCEPTION_CONTINUE_SEARCH,系统会继续在调用树的上层寻找异常过滤函数。如果每个异常过滤程序都返回EXCEPTION_CONTINUE_SEARCH,我们就会遇到所谓的未处理异常。微软提供了函数SetUnhandleExceptionFilter,它给我们处理异常的最后机会,否则widows会正式认为这个异...

2020-04-26 23:45:03 897

原创 windows异常处理程序与软件异常

以下内容引述《windows核心编程》异常异常分为硬件异常和软件异常硬件异常CPU负责捕获类似非法内存访问和以0作为除数这样的问题,一旦侦测到这些错误行为,它会抛出相应的异常。由CPU抛出的异常都是硬件异常软件异常操作系统和应用程序抛出的异常,是软件异常__try{// Guard body...}__except{// Exception handler...}...

2020-04-23 09:23:30 509

原创 windows终止程序

本文内容引述至《windows核心编程》结构化异常处理SEH结构化异常处理(structed exception handling, SEH)Microsoft Visual C++ 支持异常处理,它在内部实现上其实就是利用了编译器和Windows操作系统的结构化异常处理功能。SEH实际上包含两个功能:终止处理和异常处理。终止处理终止处理程序确保不管一个代码块(被保护代码)是如何退出的...

2020-04-21 23:34:24 787

原创 windows注入续讲

本文内容引述至《windows核心编程》DLL注入Dll注入除了使用前文《windows注入》中所推荐的三种方法修改注册表HookRemoteThread还有其他的注入方式木马注入DLL木马注入常见的黑客手法,把预知常见的进程必然载入的DLL库同名替换。Dll库除了名字要相同,还有原来DLL中导出的所有符号,而且随着替换的Dll版本发生变化,更改了导入表甚至是导入地址,那么这...

2020-04-19 16:01:30 243

原创 windows线程局部栈

TLS本文内容引述《windows核心编程》TLS Thread Local Storage需求软件开发中,需要将数据与一个对象的实例关联起来。如使用SetWindowWord和SetWindowLong函数,将数据与某个指定窗口关联起来。同样,我们可以用TLS将数据与指定的线程关联起来。例如,获知线程的运行时长。而C/C++库中也实现了这些内容,比如_tcstok_s,asctime...

2020-04-19 11:29:21 199

原创 windows系统之Hook实例DIPS

windows系统下Hook文章示例来至《Windows核心编程》第22章实例Desktop Item Position Saver工具原理说明windows下使用Hook实现对远程进程注入DLL技术,通过共用操作系统下同一份DLL,实现对目标进程的特定消息传输,甚至达到控制的技术。首先需要了解的实现DLL注入实现Hook进程的方式HHOOK hHook = SetWindowsHook...

2020-04-18 23:52:30 394 1

原创 windows注入

windows注入本文内容引述至《windows核心编程》注入引入需求:从另一个进程创建的窗口派生子类窗口需要一些方式来辅助调试,比如确定另一个进程正在使用哪些DLL对另一个进程Hook窗口派生User32.dll被映射到进程A的地址空间中,负责对发到和发往进程A的任何窗口的消息进行接收和派发。当User32.dll检测到一个消息的时候,会先确定该窗口的WndProc的地址,然后...

2020-04-17 08:49:09 351

原创 windows下DLL基础

动态链接库windows应用程序编程接口(application programming interface,API)所提供的所有函数都包含在DLL中。DLL描述kernal32.dll包含的函数用来管理内存、进程以及线程User32.dll包含的函数用来执行与用户界面相关的任务GDI32.dll包含的函数用来绘制图像和显示文字AdvAPI32.dl...

2020-04-16 01:04:41 281

原创 visual C++下全局对象的构建与析构

问题引入引入问题表格何时运行构造函数析构函数EXE中的全局对象??DLL中的全局对象??回答何时运行构造函数析构函数EXE中的全局对象C运行时Startup代码C运行库DLL清理DLL中的全局对象C运行时优先于DllMain的DLL_PROCESS_ATTACH函数C运行时后于DLL_PROCESS_DETACH返...

2020-04-15 22:46:11 193

原创 windows内核态线程同步

内核态线程同步以下内容引述《windows核心编程》为什么用内核态同步在用户态下进行线程同步的最大好处就是速度非常快,但是也存在一些局限性,而且不适用于许多应用程序。例如,对interlockd系列函数只能对一个值进行操作,他们从来不会把线程切换到等待状态;使用关键段把线程切换到等待状态,但是他们只能用来对同一个进程中的线程进行同步;在使用关键段的时候我们容易陷入死锁,因为无法为进入关...

2020-04-11 14:39:07 396

原创 windows用户模式线程同步

windows用户模式线程同步以下内容引述至《windows核心编程》用户模式,及用户态。原子访问原子访问:一个线程在访问某个资源的同时能够保证没有其他线程会在同一时刻访问同一资源。Interlokced系列函数提供了我们需要的解决方案InterlockedExchangeAdd传一个长整形变量的地址和增量值,函数就会保证递增操作是以原子方式进行。x86上函数维持一个硬件信号,会...

2020-04-10 23:00:51 246

原创 windows下线程C/C++运行库

window下C/C++运行库以下内容引述至《windows核心编程》C/C++运行库库名称描述LibCMt.lib库的静态链接发行版本LibCMtD.lib库的静态链接调试版本MSVCRt.lib导入库,用于动态链接MSVCR80.dll库的发行版本(默认)MSVCRtD.lib导入库,用于动态链接MSVCR80D.dll库的调试版本MS...

2020-04-09 09:59:00 499

原创 windows线程内幕

windows线程内幕以下内容引述至《windows核心编程》创建和初始化CreateThread函数的一个调用导致系统创建一个线程内核对象。该对象的初始化引用计数为2,(除非线程终止,而且从CreateThread返回的句柄关闭,否则线程内核对象不会被销毁)一旦创建了内核对象,系统就分配内存,提供给线程的堆栈使用。内存是从进程的地址空间内分配的,因为线程没有自己的地址空间。然后,系统将...

2020-04-09 09:20:20 198

原创 windows下线程入门

windows线程以下内容引述《windows核心编程》线程与进程进程实际上有两个组成部分:一个进程内核对象和一个地址空间;同样的,线程也有两个组成部分:线程的内核对象,操作系统用它管理线程,系统还用内核对象来存放线程统计信息的地方;线程栈,用于维护线程执行时所需的所有函数参数和局部变量创建线程对于用MSVC编译器生成的应用程序,这个线程首先会执行C/C++运行库的启动代码,后者...

2020-04-08 10:00:03 132

原创 windows进程相关

windows 进程windows进程创建CreateProcess函数系统创建一个进程内核对象,初始引用计数为1。进程内核对象不是进程本身,系统为新进程创建一个虚拟地址空间,将可执行文件(和所有必要dll)的代码及数据加载到进程的地址空间。然后,系统为新进程的主线程创建一个线程内核对象(引用计数为1),操作系统用它来管理这个线程。主线程一开始就会执行c/c++运行时的启动例程,它是由链...

2020-04-07 09:48:57 160

原创 protobuf 编译及使用

protobufProtobuf全称是Google Protocol Buffer, 是谷歌公司提供的用于通信的结构化数据存储方式。编译protobuf库由于在编写完protobuf文件后,文件对应产生的.h文件和.cc文件还会依赖protobuf的头文件和库文件,因此需要编译protobuf库。但是protobuf的官方文档写的不够友好,在windows下按照官方文档并不能实际生产出需要...

2020-03-27 23:41:42 1739

原创 Objective-C Runtime介绍

Objective-C Runtime中的meta-classObjective-C Runtime引子获取实例方法关于IMP和MethodObjective-C Runtimeobjective-c是mac osx下的编程语言,其中Runtime库为oc语言的动态属性提供支持,因此所有通过oc编译的应用程序都可以连接到该库。应用程序连接到runtime库,需要引入runtime头文件。#...

2020-03-18 15:49:28 367

原创 windows下编码简述

编码问题是计算机的第一门课堂。总所周知的是,ASCII码是最

2019-11-28 23:38:00 745

原创 windows下主线程同步

windows线程间同步方式PostMessage、SendMessage、PostThreadMessage方式Event方式,SetEvent、ResetEvent、WaitForMultipleObjects临界区信号量子线程与主线程之间的异步、同步回调方式借助windows窗口,在主线程中注册回调事件,子线程通过postmessage方式发送给该窗口,从而实现消息通知。实...

2019-09-26 23:42:19 304

DispExample.rar

windows核心编程修改适配win7,win8,win10系统下,在屏幕分辨率变化下,恢复桌面图标原始位置

2020-04-23

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除