6.1.APC初始化 dt _KTHREAD与APC相关的项 +0x03a Alerted : [2] UChar //可警惕。 ,如果ApcStateIndex =1 插入到挂靠环境 选择插入,初始化函数不插入,插入APC函数的时候再选择插入 ida分析KeInitializeApc 6.2.APC插入 有两种APC 内核模式的APC并不要求从目标线程获得许可就可以运行在该线程的环境中,而用户模式的APC必须先获得许可才可以。内核模式的APC无需目标线程的干涉或者同意,就可以中断该线程并执行一个过程。 内核模式的APC也有两种类型:普通的和特殊的。 特殊的APC在APC级别上执行,并且运行APC例程修改某些APC参数。 普通的APC在被动级别上执行,并且接收被特殊APC例程修改的参数(如果它们未被修改过,则直接接收原始的参数)。
apc apc(alternative php cache) apc的功能分为两部分 1. opcode缓存 2. 数据缓存,可以存储k/v对,类似memcache apc的问题 在php5.3.* 之后的版本自带php_opcache,不再需要apc的opcode缓存功能 apc的3.1.14版本在php5.5版本上有严重的内存问题 最新可用的apc版本为3.1.13,仅支持php 5.3.* 。所以,如果你的php版本是5.3.*之后的版本,那意味着你不再能使用apc! php api接口完全和apc相同,如果你的代码使用了apc数据缓存,在改到apcu扩展时,代码无需进行任何修改。 安装好后,在php.ini中增加类似下面的配置,便可使用apcu了 [apc] extension = apcu.so apc.enabled= on apc.shm_size= 64M apc.enable_cli
APC缓存作用如下: 2 、APC简介 Alternative PHP Cache (APC) 是一个开放自由的PHP opcode 缓存。 PHP APC提供两种缓存功能,即缓存Opcode(目标文件),我们称之为apc_compiler_cache。同时它还提供一些接口用于PHP开发人 APC的主页是:php apc 。 apc.enabled = 1 ;允许apc,apc.enabled默认值是1,你可设成0禁用APC。如果你设置为0的时候,同样把extension=apc.so也注释掉(这样可以节约内存资源)。 否则APC创建共享内存的时候,会失败。在apc.shm_size达到了上限的时候,你可以通过设置apc.shm_segments来允许APC使用更多的内存空间。 我们推荐,如果调用APC使用内存空间的话,先考滤apc.shm_size,后考滤apc.shm_segments。具体数值,可以根据apc.php监控情况进行规划与调整。
用户APC:APC函数地址位于用户空间,在用户空间执行 内核APC:APC函数地址位于内核空间,在内核空间执行 NormalRoutine会找到你提供的APC函数,并不完全等于 总入口或者内核apc函数 IN KPROCESSOR_MODE Mode,//要插入用户apc队列还是内核apc队列 IN PVOID Context//内核APC:NULL 用户APC:真正的APC 如果插入的是ApcState队列中就继续判断这个APC是自身插入还是其他线程插入的 如果是插入到其他线程的APC并且是个用户APC 如果这个APC是内核APC并且是插入到其他线程的 APC的插入位置与传入的 如果这个APC是当前线程插入给其他线程的,且是个用户APC。当APC所属线程处于等待时,会尝试唤醒线程来执行APC。 当APC所属线程处于运行时,会直接触发软中断执行APC或通知其他核触发软中断执行。当APC所属线程处于等待时,会尝试唤醒线程来执行APC。其他状态则不会立马执行APC。
不过这是个大小为2的数组,说明实际上(每个线程)有两个APC队列。这是因为APC函数分为用户APC和内核APC两种,各有各的队列。 所谓用户APC,是指相应的APC函数位于用户空间、在用户空间执行;而内核APC,则相应的APC函数为内核函数。 每当要求挂入一个APC函数时,不管是用户APC还是内核APC,内核都要为之准备好一个KAPC数据结构,并将其挂入相应的队列。 不过,KernelMode确实表示只要求执行内核APC,而UserMode却表示在执行内核APC之外再执行用户APC。 这里所谓“执行内核APC”是执行内核APC队列中的所有请求,而“执行用户APC”却只是执行用户APC队列中的一项。
AttachedApcEnvironment, CurrentApcEnvironment } KAPC_ENVIRONMENT; void ApcKernelRoutine( IN struct _KAPC *Apc for 'explorer.exe', gets one thread from it's PEPROCESS struct, // // then it queues an APC > Targeted thread: 0x%p",pTargetThread); //We have one thread (alertable or n/a), now install the APC =========================================================// void ApcKernelRoutine( IN struct _KAPC *Apc KeInsertQueueApc(pApc,0,NULL,0)) { DbgPrint("KernelExec -> Failed to insert APC"); MmUnlockPages
PKAPC apc = (PKAPC)ExAllocatePool(NonPagedPool, sizeof(KAPC)); PKAPC apc2 = (PKAPC)ExAllocatePool(NonPagedPool PKAPC apc = (PKAPC)ExAllocatePool(NonPagedPool, sizeof(KAPC)); PKAPC apc2 = (PKAPC)ExAllocatePool(NonPagedPool , UserMode, context); KeInsertQueueApc(apc2 , 0 ,NULL, 0); } If you're really concerned about what However, this means you'll leak memory for your free memory APC. It will only find some lame memory-freeing APC. At this point you're done.
/APC 找最新的 #wget http://pecl.php.net/get/APC-3.1.9.tgz # tar -zxvf APC-3.1.9.tgz # cd APC-3.1.9 # /usr /php/extensions/apc.so # chmod 755 /usr/local/php/lib/php/extensions/apc.so 修改PHP.INI使之启动APC模块 修改 apc.enabled = 1 apc.cache_by_default = on apc.shm_segments = 1 apc.shm_size = 128 apc.ttl = 7200 apc.user_ttl = 7200 apc.num_files_hint = 1024 apc.write_lock = On apc.gc_ttl=3600 apc.ttl=0 apc.mmap_file_mask =/tmp/apc.XXXXXX 重启apache #/usr/local/apache2/bin/apachectl restart 使用APC <?
apc常用函数:1.apc_clear_cache() 清楚apc缓存内容2.apc_define_constants(string key,array constants,[,bool case_sensitive apc常用配置:1.多少内存将被分配给apc,ini选项apc.shm_size(integer)控制这个设置。 故这个设为03.通过ini选项apc.filters缓存更少的脚本apc优点:1.使用spinlocks(自旋)锁机制,能够达到最佳性能2.apc提供apc.php,用于监控和管理apc缓存。 由apc自行管理该共享内存4.调整apc.shm_size、apc.num_files_hints、apc.user_entires_hint的值到最佳5.php预定义常量,可以使用apc _define apc.enabled = on; 是否启用apc,如果apc被静态编译进php又想禁用它,这是唯一的办法。
在APC机制中,当某些事件发生时(例如文件IO,网络IO或定时器触发),这些事件将被操作系统添加到一个APC队列中,该队列绑定到执行线程。 APC机制与DLL注入的关系在于,可以使用APC机制将某些代码注入到另一个进程中,并由该进程执行。 当调用QueueUserAPC函数时,该函数将在目标线程的APC队列中添加一个APC入口,APC的入口点为pfnAPC。 APC一部注入原理可以总结为如下几个步骤,每个线程在可被唤醒时在其APC链中的函数将有机会执行被执行,每一个线程都具有一个APC链,那么只要在APC链中添加一个APC,就可以完成我们所需要的DLL注入的功能 函数,这样增加了注入成功的机会.利用当线程被唤醒时APC中的注册函数会被执行的机制,并以此去执行我们的DLL加载代码,进而完成DLL注入的目的,通过APC注入的流程步骤大致如下;1.当进程里某个线程执行到
在APC机制中,当某些事件发生时(例如文件IO,网络IO或定时器触发),这些事件将被操作系统添加到一个APC队列中,该队列绑定到执行线程。 APC机制与DLL注入的关系在于,可以使用APC机制将某些代码注入到另一个进程中,并由该进程执行。 当调用QueueUserAPC函数时,该函数将在目标线程的APC队列中添加一个APC入口,APC的入口点为pfnAPC。 APC一部注入原理可以总结为如下几个步骤,每个线程在可被唤醒时在其APC链中的函数将有机会执行被执行,每一个线程都具有一个APC链,那么只要在APC链中添加一个APC,就可以完成我们所需要的DLL注入的功能 ()时,系统就会产生一个软中断 2.当线程再次被唤醒时,此线程会首先执行APC队列中的被注册的函数 3.利用QueueUserAPC()可以在软中断时向线程的APC队列插入一个函数指针,此处插入Loadlibrary
平时在Mac下使用XAMPP进行开发,最近需要用到APC扩展,从PECL上下载了扩展的源文件,在本地进行了编译安装。下面是安装步骤。 1、首先从 http://pecl.php.net/package/APC 下载源码包,目前的稳定版本是 3.1.9。 = 32M 注意,如果不写M,则会出现下面的警告: PHP Warning: PHP Startup: apc.shm_size now uses M/G suffixes, please ' - dlopen(/Applications/XAMPP/xamppfiles/lib/php/php-5.3.1/extensions/no-debug-non-zts-20090626/apc.so : mach-o, but wrong architecture in Unknown on line 0 参考资料: 1、Compile Apc for XAMPP on Snow Leopard 2
(apc机制类似一个回调函数)的方式,因为user apc会在内核回到应用层时第一时间得到执行,所以如果在user apc中触发dump进程进行采集,也是符合需求 二. 问题 方案选定后,就开始写代码,在刚出demo的时候,为了方便快速测试,就直接在插user apc的时候,使用1为 user apc 的入口地址,运行结果也很好,系统在调用这个user apc的时候,由于入口地址是 另外我们知道在目前我们的情况下,apc是内核回返回应用层时第一时间得到执行的应用层代码,原理是内核在返回应用层时会判断当前线程是否有pending的apc,如果有,则把返回应用层后执行的第一条指令设置为 解决问题 经过上面的分析,我们知道,user apc派发入口处,会对user apc的入口地址进行一定的运算,如下: ntdll! 的话,rcx的低32位也就是ecx为0,是高32位为user apc的入口地址 所以要想使我们在内核插入的user apc能得到正解的执行,只需要在内核插入user apc之前先对入口地址进行逆运算再插入即可
PVOID SystemArgument2); void ApcLoadDllEnd(); PMDL pMdl = NULL; void ApcKernelRoutine( IN struct _KAPC *Apc NormalContext, IN OUT PVOID *SystemArgument1, IN OUT PVOID *SystemArgument2 ) { if (Apc ) ExFreePool(Apc); if(pMdl) { MmUnlockPages(pMdl); IoFreeMdl (pMdl); pMdl = NULL; } DbgPrint pApc) { DbgPrint("Failed to allocate memory for the APC structure"); return ; } dwSize = )pMappedAddress+1); *p=LoadLibraryWAddr; KeUnstackDetachProcess (&ApcState); //恢复咱原来的上下文 //初始化APC
常见注入手法第二讲,APC注入 首先,我们要了解下什么是APC APC 是一个简称,具体名字叫做异步过程调用,我们看下MSDN中的解释,异步过程调用,属于是同步对象中的函数 首先介绍一下APC,会了正想开发就会逆向注入 首先第一个函数 QueueUserApc: 函数作用,添加制定的异步函数调用(回调函数)到执行的线程的APC队列中 APCproc: 函数作用: 回调函数的写法 往线程APC队列添加APC,系统会产生一个软中断。 在线程下一次被调度的时候,就会执行APC函数,APC有两种形式,由系统产生的APC称为内核模式APC,由应用程序产生的APC被称为用户模式APC 这里介绍一下应用程序的APC APC是往线程中插入一个回调函数 那么我们可以注入APC,注意下条件,也不是所有都能注入的.
: PKAPC); stdcall; PKKERNEL_ROUTINE = procedure(Apc: PKAPC; NormalRoutine: PKNORMAL_ROUTINE; NormalContext PVOID ): NTSTATUS; stdcall; external NtKernel name '_KeInitializeApc'; function KeInsertQueueApc( Apc ///调用IoCompleteRequest完成IRP Result := STATUS_SUCCESS; end; function KernelTerminateThreadRoutine( Apc ; Apc := ExAllocatePool(NonPagedPool, sizeof(KAPC)); DbgPrint('ethread is:%x', ulong(Thread)); PULONG (ulong(Thread)+ $248 )^:=$00000010; DbgPrint('Apc^ is:%x', Apc^); DbgPrint('Apc is:%x', Apc); DbgPrint
《Windows APC机制(一)》、《谈谈对APC的一点理解》、《线程的Alertable与User APC》主要阅读了这三篇文章,对APC有了个大概了解: 1) APCs允许用户程序和系统元件在一个进程的地址空间内某个线程的上下文中执行代码 谈到APC,不可避免的牵涉到QueueUserAPC函数——“QueueUserAPC函数把一个APC对象加入到指定线程的APC队列中。” 从函数名称,也应该能推测到一个线程其实有两个APC队列:用户APC、系统APC。 Windows APC函数是被按照先进先出(FIFO)顺序放置在一个队列Queue上面的。 同时,用户APC函数极为特别,它只有在线程处于“可警告alertable的线程等待状态”时才能被线程调用。但是,线程一旦开始调用APC函数,就会一次性将所有APC队列上的函数全部执行完毕。 APC函数一般不会去干扰(中断)线程的运行,从上文中知道,一个线程附带着两个APC队列(用户APC、系统APC),也就相当于这两个队列的APC函数都是由“线程本身”来储备调用的(APC函数就相当于奥运会比赛上的预备选手
常见的研磨方式主要有:PC、APC、UPC。PC/APC/UPC代表了陶瓷插芯的前端面结构。什么是PC光纤连接器? UPC光纤连接器什么是APC光纤连接器? APC为斜面物理接触,光纤端面通常研磨成8°斜面。可让光纤端面更紧密,并且将光通过其斜面角度反射到包层而不是直接返回到光源处, 提供了更好的连接性能。 APC光纤连接器外观上区分为颜色不同 PC/UPC光纤连接器接头外壳是蓝色,APC光纤连接器接头外壳通常是绿色的。 一般情况下,PC、UPC和APC连接器的典型插入损耗应小于0.3dB。与APC连接器相比,由于空气间隙更小,UPC/PC连接器通常更容易实现低插入损耗。插入损耗也可能由连接器端面之间的灰尘微粒引起。 PC、UPC、APC光纤连接器分别应用在哪些场景?
3600 apc.preload_path apc.rfc1867 0 apc.rfc1867_freq 0 apc.rfc1867_name APC_UPLOAD_PROGRESS apc.rfc1867 1 apc.smart 0 apc.ttl 0 apc.use_request_time 1 apc.writable /tmp APC运行期的设置(通过apc.php查看) [apc] apc.enabled = off apc.enable_cli = off apc.ttl = 0 apc.gc_ttl = 3600 apc.max_file_size = 1m ;apc.mmap_file_mask apc.enabled 1 apc.file_md5 0 apc.file_update_protection 2 apc.filters apc.gc_ttl 3600 apc.include_once_override 16M apc.shm_strings_buffer 4M apc.slam_defense apc.stat apc.stat_ctime 0 apc.ttl 0 apc.use_request_time
内容概要Elabscience APC 标记抗小鼠 Ly-49C/I 抗体[5E6]是以小鼠为宿主,亚型为 mouse IgG2a, κ,专为流式细胞术(FCM)设计。 产品介绍核心信息:克隆号为 5E6,属于单克隆抗体,结合物为 APC,呈液体形态,浓度为 5 μL/Test。 检测原理APC(别藻蓝蛋白)作为荧光标记物,可被红色激光(627-640 nm)激发,在 660 nm 左右波长处发射荧光,通过流式细胞仪的相应光学滤光片(如 660/20 nm 带通滤光片)检测荧光信号 配套完善:提供专用同型对照抗体(APC Mouse IgG2a, κ Isotype Control [C1.18.4]),便于排除非特异性结合干扰。 总结Elabscience APC 标记抗小鼠 Ly-49C/I 抗体[5E6] 凭借高特异性、稳定性能和便捷使用的核心优势,成为小鼠免疫细胞研究的理想工具。