替换SharedUserData

Windows内存管理—内存映射、PAE、MmPfnDatabase Windows内存管理 内存有两种,一种是由内存条构成的所谓的物理内存,这种内存读取速度快; 还有一种是虚拟内存,由硬盘构成,也就是把硬盘的一部分容量拿来当作内存用,但是速度没有内存条那么快。 两者的关系: 每个进程都有4GB的虚拟内存,但不是所有的虚拟内存都有对应的物理内存,它其实是在物理内存和磁盘之间进行倒换的。 虚拟内存在用的时候,会从磁盘倒入物理内存,不用的时候就还是存在磁盘上。因此,同一个物理内存在不同的时间可以被用于不同进程的不同虚拟内存。 基于页面映射的虚拟内存机制: 在硬件上:由CPU芯片内 阅读详情
作 者: xIkUg
时 间: 2007-01-18,14:01
链 接: http://bbs.pediy.com/showthread.php?threadid=38180

版本:1.0

作者: xIkUg/RCT/CCG          xikug.xp [at] gmail [dot] com

我常去的网站:
http://debugman.wintoolspro.com
http://www.fcgchina.com
http://bbs.pediy.com
http://www.unpack.cn

说明:为了不至于混淆视线,本文以Win2000专业版,非3G,非PAE系统为蓝本进行讲述。其他系统稍有不同,但不在本文的讲述范围。

SharedUserData 是操作系统为每个进程提供的个共享数据结构,里面存放有很多重要的系统信息,如TickCount、系统时间、SystemRoot等。。。

其在DDK定义为:


代码:
#define KI_USER_SHARED_DATA        0xffdf0000
#define SharedUserData  ((KUSER_SHARED_DATA * const) KI_USER_SHARED_DATA)
他在内核中的地址是0xffdf0000,操作系统通过共享映射把这个结构以只读方式映射到每个进程的0x7ffe0000的地方。

操作系统为每个进程提供4G虚拟空间的访问能力(空间访问能力不代表空间容量),不过实际访问不了这么多,因为4G空间中低2G是用户空间,
高2G是系统空间(非3G模式的情况下),其中低2G空间中某些地址是受系统保护的,普通用户进程也不能访问,而高2G访问需要ring0权限。

操作系统采用分页机制来映射物理内存,并会为每个进程分配一个PT(Pages Table)和PD(Pages Directory),
每个进程的PTE(Page Table Entry)和PDE(Page Directory Entry)通常映射了不同的物理页,所以不同进程的同一虚拟地址的内容是不相干的。
上面说的“通常”也有例外,那就是不同进程的PTE或PDE也可能会映射相同的物理页,如果他们映射了相同的物理页,说明他们共享了一段内存,
SharedUserData就是这个例外,每个进程用户空间的0x7ffe0000都以只读方式映射到相同的物理页面上,而这个物理页面上就是KUSER_SHARED_DATA结构
的数据,因此操作系统上的每个进程都有一个这个结构,而操作系统只需要维护这一个结构就行了。

实际上在Windows NT操作系统的实现中大量的使用了这种内存共享机制,分页机制处理也远比这个我说的复杂,具体可参考《JIURL玩玩Win2k内存篇》。

我们回到我们的主题,我们要替换指定进程的SharedUserData。了解了上面我说的共享机制,可能你已经知道了,使进程的0x7ffe0000不要映射到0xffdf0000
指向的物理页,而是映射到我们自己的物理内存页就行了。没错。。。话是这么说,但实际上Windows的内存管理机制相当复杂,我在具体实现想法的时候碰
到了许多问题,真正彻底解决这些问题花了我足足两周的时间,其中最棘手的问题的是:
1. 死锁问题
2. 内存被置换到Standby链表上去的问题

事出必有因,我坚信操作系统能做到的事情我们也同样能做到。通过不断的调试操作系统代码终于解决了各种问题,现在我的代码能在2000-2003的系统下跑起来了。

我们需要定义一些结构,PTE和PDE的基地址如下:


代码:
#define PTE_BASE    0xC0000000
#define PDE_BASE    0xC0300000
根据虚拟地址得到PTE的地址和PDE的地址:


代码:
#define GetPteAddress(va) ((PMMPTE)(((((ULONG)(va)) >> 12) << 2) + PTE_BASE))
#define GetPdeAddress(va)  ((PMMPTE)(((((ULONG)(va)) >> 22) << 2) + PDE_BASE))
我们需要分配一段非分页内存,必须以小页边界(4K)对齐,0x7ffe0000也以页对齐的:


代码:
ProcessPTE->p = ExAllocatePool(NonPagedPool, PAGE_SIZE)
现在我们就替换SharedUserData,并把日期锁定:


代码:
RtlCopyMemory(ProcessPTE->p, SharedUserData, sizeof(KUSER_SHARED_DATA));
pMySharedData = ProcessPTE->p;
RtlTimeToTimeFields((PLARGE_INTEGER)&pMySharedData->SystemTime, &TimeFields);
TimeFields.Year = 2007;
TimeFields.Month = 1;
TimeFields.Day = 1;
RtlTimeFieldsToTime(&TimeFields, (PLARGE_INTEGER)&pMySharedData->SystemTime);
pMySharedData->SystemTime.High2Time = pMySharedData->SystemTime.High1Time;
这样日期就被我们锁定在2007-1-1了。。。,现在我们要让时间继续走,于是建一个系统线程去更新SystemTime:


代码:
pSharedData = ProcessPTE->p;
RtlTimeToTimeFields((PLARGE_INTEGER)&SharedUserData->SystemTime, &TimeFields);
TimeFields.Year = 2007;
TimeFields.Month = 1;
TimeFields.Day = 1;
RtlTimeFieldsToTime(&TimeFields, (PLARGE_INTEGER)&pSharedData->SystemTime);
pSharedData->SystemTime.High2Time = pSharedData->SystemTime.High1Time;
测试一下,我以现程序有些问题,在被替换进程的窗口最小化的时候会让系统死锁,是于我中断下来,查看调用堆栈:


代码:
80473ae0 8046950e 00000001 82060102 000000d1 nt!RtlpBreakWithStatusInstruction
80473ae0 80069b02 00000001 82060102 000000d1 nt!KeUpdateSystemTime+0x13e
80473b64 80464b59 0000000e 00000000 00000000 hal!HalProcessorIdle+0x2
80473b68 00000000 00000000 00000000 00000000 nt!KiIdleLoop+0x10
系统在这里空转, 查看我们目标进程的调用堆栈:


代码:
be482a50 8042d87a 00cc0020 00000000 0000032c nt!KiSwapThread+0xc5
be482a78 a007dbad 00000001 00000000 be482a8c nt!KeDelayExecutionThread+0x180
be482a94 a007e005 00000001 a03106e0 01010057 win32k!UserSleep+0x2b
be482af4 a007e11a 0000032c 01010057 000000c0 win32k!xxxAnimateCaption+0x229
be482b48 a004d809 a0332cf8 00000003 a0332cf8 win32k!xxxDrawAnimatedRects+0xc8
be482c20 a00151d3 e1f32468 00000006 00010000 win32k!xxxMinMaximize+0x1fc
be482c48 a003e872 00000010 00010006 00000112 win32k!xxxShowWindow+0x147
be482c7c a008977d a0332cf8 0000f020 00000000 win32k!xxxSysCommand+0x2a6
be482cdc a00045fa a0332cf8 00000112 0000f020 win32k!xxxDefWindowProc+0xc43
be482cf0 a00045e1 a0332cf8 00000112 0000f020 win32k!xxxWrapDefWindowProc+0x15
be482d0c a0004588 a0332cf8 00000112 0000f020 win32k!NtUserfnDWORD+0x25
be482d40 80465691 00050100 00000112 0000f020 win32k!NtUserMessageCall+0x89
be482d40 77df37e7 00050100 00000112 0000f020 nt!KiSystemService+0xc4
0012fe0c 00000000 00000000 00000000 00000000 +0x77df37e7
xxxAnimateCaption之上是UserSleep,这看起来是一个循环,于是我们转去对xxxAnimateCaption进行调度,发现之所以在这里卡住,是因为
我们没有更新SharedUserData的TickCountLow,而xxxAnimateCaption会从0x7ffe0000取这个值来画出动画效果,
具体可看xxxAnimateCaption的反汇编代码,比较多,我就不列出来了。。。
当然光是一个死循环还不至于让系统死锁,我们再向上看,xxxDrawAnimatedRects的时候调用GetDCEx导致锁定一个对象,具体见函数
GreLockDisplay的代码。而一个死循环导致了系统一直没有机会ReleaseDC。系统会不断的等待这个对象,所以导致了系统的死锁。

通过调试,我们发现GreLockDisplay锁定的对象是0x81e1bc08,


代码:
kd> dt 0x81e1bc08 _ERESOURCE -b
  +0x000 SystemResourcesList : _LIST_ENTRY [ 0x81e1bbc8 - 0x81e1bd08 ]
      +0x000 Flink            : 0x81e1bbc8
      +0x004 Blink            : 0x81e1bd08
  +0x008 OwnerTable      : (null)
  +0x00c ActiveCount      : 1
  +0x00e Flag            : 0x80
  +0x010 SharedWaiters    : 0x81cf4168
  +0x014 ExclusiveWaiters : 0x81e0c068
  +0x018 OwnerThreads    :
    [00] _OWNER_ENTRY
      +0x000 OwnerThread      : 0x81d0d020
      +0x004 OwnerCount      : 1
      +0x004 TableSize        : 1
    [01]
      +0x000 OwnerThread      : 0
      +0x004 OwnerCount      : 0
      +0x004 TableSize        : 0
  +0x028 ContentionCount  : 0x5e9
  +0x02c NumberOfSharedWaiters : 0
  +0x02e NumberOfExclusiveWaiters : 3
  +0x030 Address          : (null)
  +0x030 CreatorBackTraceIndex : 0
  +0x034 SpinLock        : 0
0x81d0d020就是我们的线程,从这个结构来看,我们的线程占有了一个对象,而还有3个等待者(NumberOfExclusiveWaiters : 3),
这3个等待者在ExclusiveWaiters : 0x81e0c068指向的地方,


代码:
kd> dt 0x81e0c068 _KEVENT -b
  +0x000 Header          : _DISPATCHER_HEADER
      +0x000 Type            : 0x1 ''
      +0x001 Absolute        : 0 ''
      +0x002 Size            : 0x4 ''
      +0x003 Inserted        : 0 ''
      +0x004 SignalState      : 0
      +0x008 WaitListHead    : _LIST_ENTRY [ 0x81cf962c - 0x81da15cc ]
        +0x000 Flink            : 0x81cf962c
        +0x004 Blink            : 0x81da15cc

kd> dt 0x81cf962c _KWAIT_BLOCK -b
  +0x000 WaitListEntry    : _LIST_ENTRY [ 0x81e0ca6c - 0x81e0c070 ]
      +0x000 Flink            : 0x81e0ca6c
      +0x004 Blink            : 0x81e0c070
  +0x008 Thread          : 0x81cf95c0
  +0x00c Object          : 0x81e0c068
  +0x010 NextWaitBlock    : 0x81cf9674
  +0x014 WaitKey          : 0
  +0x016 WaitType        : 1

kd> dt 0x81e0ca6c _KWAIT_BLOCK -b
  +0x000 WaitListEntry    : _LIST_ENTRY [ 0x81da15cc - 0x81cf962c ]
      +0x000 Flink            : 0x81da15cc
      +0x004 Blink            : 0x81cf962c
  +0x008 Thread          : 0x81e0ca00
  +0x00c Object          : 0x81e0c068
  +0x010 NextWaitBlock    : 0x81e0cab4
  +0x014 WaitKey          : 0
  +0x016 WaitType        : 1

kd> dt 0x81da15cc _KWAIT_BLOCK -b
  +0x000 WaitListEntry    : _LIST_ENTRY [ 0x81e0c070 - 0x81e0ca6c ]
      +0x000 Flink            : 0x81e0c070
      +0x004 Blink            : 0x81e0ca6c
  +0x008 Thread          : 0x81da1560
  +0x00c Object          : 0x81e0c068
  +0x010 NextWaitBlock    : 0x81da1614
  +0x014 WaitKey          : 0
  +0x016 WaitType        : 1
其中两个线程0x81da1560和0x81cf95c0是VMWare的关键线程(看来VMWare需要跟系统配合运行的,并不是完全模拟硬件),
另一个线程0x81e0ca00是csrss.exe(csrss负责win32子系统)的关键线程。以上就是导致系统死锁的根本原因。
(windbg中可以用!locks来搜索系统中所有的锁,当然有时候搜索出来的结果比较多,还没有手工来得直接)

要解决这个问题,我们可采用以下方法:
1. 关闭系统的动画效果
2. 我们来更新这个值

如果采用1的方法,我难保系统的其他地方没有用SharedUserData的TickCountLow这个值来做循环因子,因此最彻底的方法是我们自己更新这个值,于是
我们在我们的系统线程中加入:


代码:
pSharedData->TickCountLow = SharedUserData->TickCountLow;
现在死锁问题解决了,我们又迎来了一个新的问题:我们申请的用于替换的内存会被置换到Standby链表上去。当有程序要访问0x7ffe0000的时候就会非法访问。

用Arm加壳的程序在调用SetProcessWorkingSetSize或程序最小化时会出现这个问题。这是因为Windows分页机制造成的,Windows会根据需要调整进程的工作集空间。
什么情况下内存会置换出去呢?我们申请的明明是非分页内存是不允许被置换出去的,为什么会出现这种情况呢?事出必有因,什么时候Windows会调整进程工作集,
调整工作集的条件是什么?为什么有些页不会被置换出去?要解答这些问题,我们需要分析Windows的相关代码。

通过不断的调试分析,最终我把相当代码锁定到了MiFreeWsle函数,拿出我们手里都有的那份代码,经过简化后,关键的地方就是如下:


代码:
if ((Pfn1->u2.ShareCount > 1) &&
    (Pfn1->u3.e1.PrototypePte == 0)) {

    UNLOCK_PFN (OldIrql);
    return FALSE;
}

//
// Found a candidate, remove the page from the working set.
//
MiEliminateWorkingSetEntry (WorkingSetIndex,
      PointerPte,
      Pfn1,
      Wsle);
如果一个页的ShareCount(共享数)为1,就会调用MiEliminateWorkingSetEntry把页从工作集中移走。

了解了吧?跃然我们在系统空间中申请了一页非分页内存,但映射到0x7ffe000后相关PfnDatabase并不知道,而我们这页的共享数为1,所以0x7ffe000会被置换走.
当有程序试图访问0x7ffe0000的时候会产生页访问异常。此时系统不知道如何处理这个突如其来的异常而导致系统崩溃。

所以要解决这个问题,我们需要手工改PfnDatabase的SharedCount为大于1的数,这里蛮干,我机器上PfnDatabase的地址是0x820bf000。


代码:
PMMPFN      MmPfnDatabase = (PMMPFN)0x820bf000;

PointerPte = GetPteAddress (0x7ffe0000);
PageFrameNumber = PointerPte->u.Hard.PageFrameNumber;
Pfn1 = &MmPfnDatabase[PageFrameIndex];
Pfn1->u3.e2.ReferenceCount = 2;
Pfn1->u2.ShareCount = 2;
Pfn1->u3.e1.PrototypePte = 0;
到这里我们已经把重要的问题都解决了,但还有一个比较重要的问题。。。有借有还,在进程退出的时候我们需要还原原始的PTE,这样就不至于让系统产生PFN_LIST_CORRUPT异常了。

结束语:我们在进程创建的时候就替换SharedUserData,可根据普通应用程序的特性做出一些与时间有关的应用,如加速,减速,Anti GetTickCount等。。。 
nt!KiEnableFastSyscallReturn函数和nt!KiRestoreFastSyscallReturnState函数分析和SharedUserData->SystemCall的由来 nt!KiEnableFastSyscallReturn函数和nt!KiRestoreFastSyscallReturnState函数分析和SharedUserData->SystemCall中汇编代码指令的由来 阅读详情

相关推荐

2.API的调用过程(3环进0环)

_KUSER_SHARED_DATA /*这是一个结构体,翻译过来就是: Kernel与User分享的一块数据。 0环与3环共享的一块内存 */ 在User层和Kernel层分别定义了一个KUSER SHARED DATA结构区域,用于User层和Kernel层共享某些数据 它们使用固定的地址值映射,_KUSER_SHARED_DATA结构区域在User和 Kernel层地址分别为: User...

My classmates 1697

内核和用户层共享内存

x86中的SharedUserData #define KI_USER_SHARED_DATA 0xffdf0000 #define SharedUserData ((KUSER_SHARED_DATA * const) KI_USER_SHARED_DATA) x64中的SharedUserData #define KI_USER_SHARED_DATA 0xFFFFF78000000000UI64 #define SharedUserData ((KUSER_SHARED_DATA *

qq_41490873的博客 720

CCC-BASE驱动逆向:从反调试到内核线程检测的深度剖析

本文深度剖析了CCC-BASE驱动逆向中的复合型保护机制,包括用户层反调试、内核层监控和硬件级防护。通过实战案例解析了动态检测策略、内核调试器分离及Intel PT技术应用等关键技术,为逆向工程师提供了绕过复杂保护的有效方法。

weixin_29274337的博客 487

html5游戏变速,深入游戏变速底层原理以及内核变速的实现

深入 0x7FFE0000 SharedUserData我们百度0x7FFE0000这个地址,得到了一个叫做 SharedUserData 的东东,是个内核的映射,Ring3下是只读的,所以如上,我们并改不了他的数据(确切的说改了,数据就不会同步,会导致大量的API无法工作)。这个结构在应用层和内核的地址如下表内核起始地址内核结束地址用户起始地址用户结束地址32 系统0xFFDF00000xFFD...

weixin_30955739的博客 1605

精选_内核KUSER_SHARED_DATA共享区域的验证_源码打包

内核KUSER_SHARED_DATA共享区域的验证

无人机WIFI集群组网技术详解及成本分析

无人机WIFI集群组网技术是指利用无人机作为移动平台,通过集成高性能的WIFI模块,实现多架无人机之间以及无人机与地面控制站之间的无线通信组网。在协议层面,无人机WIFI集群组网需要遵循标准的无线通信协议,如IEEE 802.11系列(即WIFI标准),同时可能还需定制或优化路由协议、媒体访问控制(MAC)协议等,以确保高效、可靠的数据传输。数据安全与隐私保护:无人机集群组网中传输的数据可能涉及敏感信息,需采取加密、认证等安全措施,确保数据传输的安全性和用户隐私的保护。根据性能不同,价格差异较大。

专注多旋翼、复合翼无人机技术研究,从事低空经济行业。 1582

SharedUserData

SharedUserData 是操作系统为每个进程提供的个共享数据结构,里面存放有很多重要的系统信息,如TickCount、系统时间、SystemRoot等。。。 其在DDK定义为: 代码: #define KI_USER_SHARED_DATA        0xffdf0000 #define SharedUserData  ((KUSER_SHARED_DATA * cons

FlowShell的专栏 4211

一文带你了解SOA接口测试

了解汽车电子行业的人,近几年可能经常见到一个词“SOA”,那SOA具体是什么?作为测试人员应该要测试哪些内容呢?这篇文章就简单给大家介绍一下。SOA(Service Oriented Architecture)是一种面向服务的架构,最早应用于IT行业,虽然行业内对于SOA的定义没有一个统一的描述,但是总体而言,SOA把功能定义成为服务,服务带有明确的可调用接口,并可以通过网络调用。在汽车领域,对于高性能计算平台而言,为了实现域控制器以及区域控制器之间的互联互通和软硬分离、缩短开发周期等优势,也引入了SOA的

怿星科技的博客 7155

windbg : find kernel address's means

在工程中看到一个魔法数, (WCHAR*)0x7FFE0030 想替换这个魔法数为其他可理解的值. 试验环境:  Vmware中的WinSpSp3. 因为是一个可以跑的开源工程, 在WinDbg中看 0x7FFE0030 是啥串? kd> dW 0x7FFE0030 7ffe0030 0043 003a 005c 0057 0049 004e 0044 004f C.:

博客标题不能为空 1777

【经验分享】使用Keil5烧录代码遇到的问题及解决方法

本文介绍了在使用Keil5烧录代码过程中可能遇到的常见问题,主要为编译错误和下载失败,并提供了解决方案和注意事项。通过本文中提供的具体解决方案和注意事项,希望能够帮助读者更加顺利地进行Keil5烧录代码操作,提高开发效率和成果实现。

qq_63195670的博客 1万+

Windows环境下IBSIMU的安装

本文主要介绍离子束仿真程序IBSIMU在Windows环境下的安装。

C_Tso的博客 2992

有没有什么方法快速能找到导致软件崩溃的进程_FireWalker:一种绕过用户空间EDR Hooking的新方法...

0X00概述在红队攻击过程中,经常会遇到终端防御与响应(EDR)或终端防御与阻止(EDP)产品,这些产品实现了用户层的挂钩,以判断进程的行为特征并监控潜在的恶意代码。此前,攻击者不断尝试如何绕过EDR/EDP产品,其中包括一位在Outflank的朋友,他们使用直接系统调用的方式来尝试绕过。在本文中,我们将详细描述一种新的通用方法,可以绕过用户层的EDR挂钩。我们所使用的技术包括跟踪可能...

weixin_39641697的博客 537

第一篇:常见CAN错误帧及其排查方向

在本文中主要阐述各类错误帧的形成原因以及在使用同星硬件设备出现错误帧时,应当 如何进行排查并消除错误帧。在 CAN 总线通信中,通常遇见的错误帧主要为以下五种,其 分别是:bit error、ACK error、stuff error、CRC error 以及 form error。

u013089100的博客 1737

深入游戏变速底层原理以及内核变速的实现

前言 当你接触了一款叫做“变速齿轮”的软件,你可以玩上一整个星期。因为它实在是太酷炫了,无论网页(Flash、HTML5)、还是小软件,又或者是单机游戏,他总能给你惊喜,唯独网游不能!那么我们今天就来探究一下变速原理,并且我们试试看,能不能写出一个更牛逼的变速软件。 我们本章节内容大致如下图: 变速原理探究 变速齿轮(GearNT 0.46) 原理 我们拿个经典的变速软件开刀,...

yaoyutian的博客 1万+

RK3588芯片:ALSA音频通路下HDMI与耳机自动切换的技术探索

摘要:本文详细探讨了基于RK3588芯片的HDMI与耳机自动切换方案。文章首先剖析了ALSA音频架构的核心组件与工作原理,接着介绍了RK3588芯片的硬件特性及音频处理优势。重点阐述了自动切换的实现原理,包括硬件检测机制、ALSA驱动处理逻辑和软件控制流程,并提供了详细的配置步骤。同时针对常见问题如切换异常、音频质量下降等给出了解决方案。该方案通过合理配置设备树和ALSA文件,实现了音频输出的智能切换,提升了用户体验,展现了RK3588在音频处理领域的强大性能。未来随着AI音频技术的发展,该方案在智能家居、

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 266

帝企鹅优化器(EPO)详解:从基础原理到代码实战

帝企鹅优化器(EPO)是受帝企鹅群体在极寒环境中抱团取暖行为启发,于2018年提出的一种群体智能优化算法。其核心机制是模拟帝企鹅种群通过动态调整位置来维持体温的过程,主要包括确定集群边界、计算温度分布、衡量个体间距离以及更新位置四个步骤,从而在求解复杂优化问题时有效平衡全局探索与局部开发。该算法具有参数少、结构清晰、易于实现等优点,在工程优化、图像处理、机器学习特征选择以及冷链物流车辆路径规划等领域展现出良好的应用潜力。

qq_42212808的博客 139

base\ntos\inc\i386.h头文件中有SharedUserData符号对应的nt!KUSER_SHARED_DATA结构

base\ntos\inc\i386.h头文件中有SharedUserData符号对应的nt!KUSER_SHARED_DATA结构

linux-0.11调试教程 320

Android 15.0 app进程保活白名单功能实现

在15.0的系统rom产品开发中,在某些重要的app即使进入后台,产品需求要求也不想被系统杀掉进程,需要app长时间保活,就是app进程保活白名单功能的实现, 所以需要在系统杀进程的时候不杀掉白名单的进程,接下来就看怎么样来实现这些功能

安卓兼职framework和app工程师的博客 638

系统调用之_KUSER_SHARED_DATA

当操作系统在启动的时候,需要初始化_KUSER_SHARED_DATA这个结构体,其中最重要的就是初始化0x300这个位置。操作系统要往这里面写一个函数,这个函数决定了所有的三环的API进入零环的方式。该函数KiFastSystemCall,实际上就只有三行代码,首先把esp保存到edx,目的是为了在零环能够方便的找到三环的堆栈。虽然它们指向的是同一个物理页,但在User层是只读的,在Kernel层是可写的。_KUSER_SHARED_DATA(用户层与内核层分别定义了该结构,用户用户层与内核层共享数据。

wxy_xx1的博客 1044

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

R3-R0 系统调用(快速调用与中断门)

简介 我们知道,通过驱动程序可以实现从用户态进入内核态。而操作系统的 API 函数可以实现进入内核态,那么这是如何实现的呢? 操作系统定义了一个用户程序和内核程序都可以访问的一个结构 _KUSER_SHARED_DATA ,而用户态下的该结构和内核态下的该结构都指向同一个物理内存。操作系统通过初始化该结构体,以实现 API 函数直接 call 该结构体下的 SystemCall 中的函数地址( KiFastSystemCall 或 KiIntSystemCall 函数),以实现从用户态进入内核态。 _KU

walker的博客 1264

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

漫谈兼容内核之二十一:Windows进程的用户空间

  进程的用户空间是应用软件活动的舞台,所以搞清楚Windows进程用户空间的格局和轮廓对于深入理解Windows进程的运行有着重要的意义。而对于兼容内核的开发者,则这个问题更是非搞清楚不可,因为开发兼容内核的意图就是要让Windows应用软件得以在Linux系统上运行。其实,在前面的一些漫谈中,随着当时话题的开展也曾讲到过有关这个问题的一些大概,但是一方面只是散见于各处,不够集中;另一方面也不够

周寅的专栏 2172

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

windows 内核情景分析

原文很长;先转部分过来,有时间看一下; 一 windows 内核情景分析---说明 说明 本文结合《Windows内核情景分析》(毛德操著)、《软件调试》(张银奎著)、《Windows核心编程》 、《寒江独钓-Windows内核安全编程》、《Windows PE权威指南》、《C++反汇编与逆向分析揭秘》以及 ReactOS操作系统 (V0.3.12)源码,以《Windows内核情景分析》为蓝本,对Windows内核重要框架、函数 、结构体进行解析 由于工程庞大,我能理解到的只是冰山一角,但本文.

bcbobo21cn的专栏 1931

_KUSER_SHARED_DATA

kd> dt _KUSER_SHARED_DATA +0x000 TickCountLow : Uint4B +0x004 TickCountMultiplier : Uint4B +0x008 InterruptTime : _KSYSTEM_TIME +0x014 SystemTime : _KSYSTEM_TIME +0x020 TimeZoneBias : _KSYSTEM_TIME +0x02c ImageNumberLow : Uint2B +0x02

qq_41490873的博客 645

windows内核木马

<br />1、Image Patches(映像补丁)<br />修改内核模块比如ntoskrnl.exe,ndis.sys,ntfs.sys等的代码段<br />1.1、函数前导Hook<br />Intel架构下,控制转移指令有三种,分别是2字节的寄存器操作,5字节的相对偏移操作和6字节的内存操作。当然,我们有两种方式来实现这种inline hook:<br />1)用Microsoft的detour库<br />2)用一个长度反汇编引擎,字节构建<br />我自己实现过一个动态HOOK引擎,在我的即将

深度技术安全 2184

内核模式下获取一段包含系统信息的内存

内核空间内有一段特殊的空间,其保存了一些系统重要信息,在x64下位于: x86下位于: 这段内存保存有一个结构体, 这里仅列出x64的对应结构体: typedef struct _KUSER_SHARED_DATA { // // Current low 32-bit of tick count and tick count multiplier. // // N.B. The tick count is updated each time the clo.

輚至消亡 640

windows内核研究(系统调用 二)

Windows系统调用机制分析 本文分析了Windows系统的API调用过程,重点关注32位函数在64位系统中的转换机制。系统通过_KUSER_SHARED_DATA结构体实现用户层与内核层的数据共享,该结构体在用户层地址为0x7FFE0000(只读),内核层地址为0x7FFDF0000(可写)。文章详细解析了_KUSER_SHARED_DATA结构体内容,其中0x308偏移处存放系统调用入口。同时介绍了CPU快速调用检测机制,通过CPUID指令检查处理器是否支持sysenter/sysexit指令,支持则

weixin_43754657的博客 1163
上一篇: 计算PE文件校验和的C语言实现
下一篇: XP SP2对raw socket所做的改动
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值