Windows2000下用户模式的内存扫描[转帖]

C++游戏逆向实战:从内存扫描到进程读写完整指南 内存读写是理解计算机系统运行机制的基础技术之一,它涉及操作系统对进程内存空间的管理与隔离。其核心原理是通过操作系统提供的API(如ReadProcessMemory/WriteProcessMemory)跨越进程边界,访问或修改其他进程的虚拟内存数据。这项技术的工程价值在于,它是软件动态调试、漏洞分析、自动化测试等领域的底层支撑能力。在应用场景上,常被用于单机游戏机制分析、软件行为研究和安全防护技术学习。本文以C++游戏逆向为切入点,详细演示了使用Cheat Engine进行内存扫描定位变量,并编写C++程 阅读详情

老文1篇了,复习复习,前几天写的快乐生活快乐游戏的那个工具,就是差不太多原理的

Windows2000下用户模式的内存扫描[转帖]
        Sprite

简述:

    本文简要介绍了在Windows2000下实现内存扫描的基本理论和实现的办法。内存扫描是一项重要的技术,有相当广泛的应用范围:如病毒扫描、游戏修改等。Windows2000是一个完全保护的系统,且具有两种工作模式,即用户态和核心态(User Model and Kernel Model)。内存扫描也可分为用户态的内存扫描与核心态的内存扫描。本文主要讲述的是工作于用户态的内存扫描。
一.相关理论

   早期在DOS坏境下进行内存扫描是一件相对简单的事情。因为DOS工作在CPU的实模式下,没有采用虚存技术也没有提供内存的保护机制,只要实实在在的扫描完所有的物理内存,一切工作也就完成了,早期有一些防毒软件就是用了这样的办法。当然为了提高效率,我们并不用扫描所有的内存区域,因为有些空间是没有被用到的,扫描这些地方也是只浪费时间。这可以通过遍历DOS系统的MCB(Memory Control Block)链,来得到实际内存的使用区域,从而使扫描的效率大大提高。相似的思路在Windows2000下的内存扫描也是适用的。

Windows2000则是一个完全保护的系统,工作于CPU的保护模式下,引入了虚存技术。每个进程拥有独立的4GB的地址空间,其中低的2GB为进程的私有空间,高的2GB为系统空间的映射(如果在Boot.ini文件中使用“/3GB”的开关可以使进程的私有空间增大到3GB,系统空间1GB)。对于每个进程来讲其虚拟的地址空间是连续的,实际上它们是以页面为单位离散的存在于物理内存中,一些可能被交换到硬盘上的页面文件中,而且还有大部分的空间是未提交(Uncommitted)的。因此在Windows2000中对进程的用户空间进行扫描必须依次对每个进程的空间进行扫描。一个进程的低2GB有空间的分布如下表:

范围
 大小
 作用
 
0x0~~ 0xFFFF
 64 KB
 不可访问区域,只是用来防止非法的指针访问,访问该范围的地址会导致访问违例。
 
0x10000~~

0x7FFEFFFF
 2 GB 减去至少192 KB
 进程的私有地址空间
 
0x7FFDE000~~

0x7FFDEFFF
 4 KB
 进程中第一个线程的线程环境块,即TEB(Thread environment block)
 
0x7FFDF000~~ 0x7FFDFFFF
 4 KB
 进程的进程环境块,即PEB(Process environment block)


 
0x7FFE0000~~

0x7FFE0FFF
 4 KB
 一个共享的只读用户数据块,该块映射到到系统空间的一个数据块,其中存放的是一些系统信息如系统时间、时钟的滴答数、系统版本号等。这样访问这些信息的时候系统就不用切换到核心模式。
 
0x7FFE1000~~

0x7FFEFFFF
 60 KB
 不可访问
 
0x7FFF0000~~ 0x7FFFFFFF
 64 KB
 不可访问,用于防止线程的缓冲跨越两种模式空间的边界
表1


二.实现
从上表可以看出,我们要扫描范围的起点和终点不是从0~~2GB,而只是其中的一部分。要得到这个起点和终点可以使用API函数GetSystemInfo,函数的原型如下:
VOID GetSystemInfo(
  LPSYSTEM_INFO lpSystemInfo  // system information
);
   而在结构SYSTEM_INFO中有两个域:lpMinimumApplicationAddress和 lpMaximumApplicationAddress(类型都是LPVOID) 中,我们就可以得到一个应用程序可用的最小和最大的地址空间。这样我们就得到了要扫描的地址的起点和终点。那么是不是这起点和终点间所有的地址都要扫描呢?并不是这样的,因为一般情况下一个进程是用不着这么大(接近2GB)的地址空间的。因此一个进程的大部分地址空间都是未用(Free)或是保留(Reserved)的,真正用到的只是那些已提交(Committed)的内存而已。
     内存页面可以有三种状态:未用(Free)、保留(Reserved)和提交(Committed)。一个未用的页面是指该页面未被保留或是提交,对一个进程来讲一个未用的页面是不可访问的,访问这样的页面将导致访问违例。进程可以要求系统保留一些页面以备后用,系统返回一段保留的地址给进程,但是这些地址同样是不可访问的,进程若想使用这段地址空间,使用必须先提交。只有一个提交的页面才是一个真正可以访问的页面。不过你提交了一个页面,系统并不会马上分配物理页面,只有在该页面第一次被访问到时,系统才会分配页面并初始化。另外,这三个状态的两两之间都是可以相互转化的。相关的API函数有VirtualAlloc、VirtualAllocEx、VirtualFree、VirtualFreeEx等.
这样我们的工作已大大减少了,只需要扫描那些提交的页面就好了。接下来要做的就是得到一个进程的已提交的页面范围。这就要用到另外两个API函数VirtualQuery和VirtualQueryEx。两个函数的功能相似,不同就是VirtualQuery只是查询本进程而VirtualQueryEx可以查询指定进程的内存空间信息,后者正是我们所需要的,函数原型如下:
DWORD VirtualQueryEx(
    HANDLE hProcess,                     // handle to process
    LPCVOID lpAddress,                   // address of region
    PMEMORY_BASIC_INFORMATION lpBuffer,  // information buffer
    SIZE_T dwLength                      // size of buffer
);
第一个参数是进程的句柄;第二个参数是内存地址指针;第三个参数是指向MEMORY_BASIC_INFORMATION结构的指针,用于返回内存空间的信息;第四个参数是lpBuffer的长度。再来看一下结构MEMORY_BASIC_INFORMATION的声明:
typedef struct _MEMORY_BASIC_INFORMATION {
     PVOID BaseAddress;
     PVOID AllocationBase;
     DWORD AllocationProtect;
     SIZE_T RegionSize;
     DWORD State;
     DWORD Protect;
     DWORD Type;
} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;
    第一个参数是查询内存块的基地址;第二个参数指的是用VirtualAlloc分配该内存时实际分配的基地址,可以小于BaseAddress,也就是说BaseAddress一定包含在AllocationBase分配的范围内;第三个参数指的是分配该页面时,页面的一些属性,如PAGE_READWRITE、PAGE_EXECUTE等(其它属性可参考Platform SDK);第四个参数指的是从BaseAddress开始,具有相同属性的页面的大小。第五参数指的是页面的状态,有三种可能值:MEM_COMMIT、MEM_FREE和MEM_RESERVE,这个参数对我们来说是最重要的了,从中我们便可知指定内存页面的状态了;第六个参数指的是页面的属性,其可能的取值与AllocationProtect相同;最后一个参数指明了该内存块的类型,有三种可能值:MEM_IMAGE 、MEM_MAPPED和MEM_PRIVATE。
 这样我们就可得到进程中需要扫描的地址范围了。到这里剩下的问题就是要读取指定的进程的指定的地地址空间的内容了。这里要用到的是用于调试程序和错误处理(Debugging and Error Handling)的API函数。在“Platform SDK: Debugging and Error Handling”章节中,介绍了一部分与程序调试和错误处理相关的API函数,有许多是很有用,例如我们下面用到的ReadProcessMemory和WriteProcessMemory,它们原型如下:
BOOL ReadProcessMemory(
     HANDLE hProcess,              // handle to the process
     LPCVOID lpBaseAddress,        // base of memory area
     LPVOID lpBuffer,              // data buffer
     SIZE_T nSize,                 // number of bytes to read
     SIZE_T * lpNumberOfBytesRead  // number of bytes read
);
BOOL WriteProcessMemory(
     HANDLE hProcess,                // handle to process
     LPVOID lpBaseAddress,           // base of memory area
     LPCVOID lpBuffer,               // data buffer
     SIZE_T nSize,                   // count of bytes to write
     SIZE_T * lpNumberOfBytesWritten // count of bytes written
);
参数很简单从它们的名字都可以猜出其意义了,这里就不多做说明了。要说明的是要对一个进程进行ReadProcessMemory操作,当前进程对要读的进程必须有PROCESS_VM_READ访问权。要对一个进程进行WriteProcessMemory操作,当前进程对要写的进程必须有PROCESS_VM_WRITE 和PROCESS_VM_OPERATION访问权。要获得一个进程的句柄和对这个进程的一些控制权可以使用API函数OpenProcess得到,其使用不做详细说明了,只给出其原型:
HANDLE OpenProcess(
     DWORD dwDesiredAccess,  // access flag
     BOOL bInheritHandle,    // handle inheritance option
     DWORD dwProcessId       // process identifier
);
 

 这样对一个进程的用户地址空间内存扫描的流程基本就阐述清楚了。

三  相关的问题:

        在实际操作中会遇到一些问题。如果我们指定了写相关的访问权(如PROCESS_VM_WRITE、PROCESS_SET_INFORMATION、PROCESS_ALL_ACCESS等),用OpenProcess打开一些普通进程是没什么问题,但要是打开的是系统安全进程(如System、Winlogon、smss、csrss、services、lsass等)或是一些注册为服务的进程时,就会遇到“访问拒绝”的错误,这是为了系统的安全而采取的保护手段。说明了当前的进程没有足够的权限来进行此操作。在进程控制结构中有一个“访问令牌”(Access tokens),里面包含有本进程的权限信息。一些常用的权限如表1所示(摘自Inside Windows2000,Third Edition)。

  权限名
       权限含义
 
SeBackup
 在备份的时候绕过安全检查
 
SeDebug
 可对一个进程进行调试
 
SeShutdown
 可关闭本地系统
 
SeTakeOwnerShip
 在没有得到自由访问权的情况下得到一个对象的所有权
 

 

表2  

要对一个任意进程(包括系统安全进程和服务进程)进行指定了写相关的访问权的OpenProcess操作,只要当前进程具有SeDeDebug权限就可以了。要是一个用户是Administrator或是被给予了相应的权限,就可以具有该权限。可是,就算我们用Administrator帐号对一个系统安全进程执行OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwProcessID)还是会遇到“访问拒绝”的错误。什么原因呢?原来在默认的情况下进程的一些访问权限是没有被使能(Enabled)的,所以我们要做的首先是使能这些权限。与此相关的一些API函数有OpenProcessToken、LookupPrivilegevalue、AdjustTokenPrivileges。我们要修改一个进程的访问令牌,首先要获得进程访问令牌的句柄,这可以通过OpenProcessToken得到,函数的原型如下:

BOOL OpenProcessToken(
     HANDLE ProcessHandle,
     DWORD DesiredAccess,
PHANDLE TokenHandle
 );
第一参数是要修改访问权限的进程句柄;第三个参数就是返回的访问令牌指针;第二个参数指定你要进行的操作类型,如要修改令牌我们要指定第二个参数为TOKEN_ADJUST_PRIVILEGES(其它一些参数可参考Platform SDK)。通过这个函数我们就可以得到当前进程的访问令牌的句柄(指定函数的第一个参数为GetCurrentProcess()就可以了)。接着我们可以调用AdjustTokenPrivileges对这个访问令牌进行修改。AdjustTokenPrivileges的原型如下:
BOOL AdjustTokenPrivileges(
     HANDLE TokenHandle,              // handle to token
     BOOL DisableAllPrivileges,       // disabling option
     PTOKEN_PRIVILEGES NewState,      // privilege information
     DWORD BufferLength,              // size of buffer
     PTOKEN_PRIVILEGES PreviousState, // original state buffer
     PDWORD ReturnLength              // required buffer size
);
第一个参数是访问令牌的句柄;第二个参数决定是进行权限修改还是除能(Disable)所有权限;第三个参数指明要修改的权限,是一个指向TOKEN_PRIVILEGES结构的指针,该结构包含一个数组,数据组的每个项指明了权限的类型和要进行的操作; 第四个参数是结构PreviousState的长度,如果PreviousState为空,该参数应为NULL;第五个参数也是一个指向TOKEN_PRIVILEGES结构的指针,存放修改前的访问权限的信息,可空;最后一个参数为实际PreviousState结构返回的大小。在使用这个函数前再看一下TOKEN_PRIVILEGES这个结构,其声明如下:

typedef struct _TOKEN_PRIVILEGES {
     DWORD PrivilegeCount;
     LUID_AND_ATTRIBUTES Privileges[];
} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;
PrivilegeCount指的数组原素的个数,接着是一个LUID_AND_ATTRIBUTES类型的数组,再来看一下LUID_AND_ATTRIBUTES这个结构的内容,声明如下:

typedef struct _LUID_AND_ATTRIBUTES {
     LUID   Luid;
     DWORD  Attributes;
} LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES

第二个参数就指明了我们要进行的操作类型,有三个可选项: SE_PRIVILEGE_ENABLED、SE_PRIVILEGE_ENABLED_BY_DEFAULT、SE_PRIVILEGE_USED_FOR_ACCESS。要使能一个权限就指定Attributes为SE_PRIVILEGE_ENABLED。第一个参数就是指权限的类型,是一个LUID的值,LUID就是指locally unique identifier,我想GUID大家是比较熟悉的,和GUID的要求保证全局唯一不同,LUID只要保证局部唯一,就是指在系统的每一次运行期间保证是唯一的就可以了。另外和GUID相同的一点,LUID也是一个64位的值,相信大家都看过GUID那一大串的值,我们要怎么样才能知道一个权限对应的LUID值是多少呢?这就要用到另外一个API函数LookupPrivilegevalue,其原形如下:

BOOL LookupPrivilegevalue(
     LPCTSTR lpSystemName,  // system name
     LPCTSTR lpName,        // privilege name
     PLUID lpLuid           // locally unique identifier
);
第一个参数是系统的名称,如果是本地系统只要指明为NULL就可以了,第三个参数就是返回LUID的指针,第二个参数就是指明了权限的名称,如“SeDebugPrivilege”。在Winnt.h中还定义了一些权限名称的宏,如:

#define SE_BACKUP_NAME        TEXT("SeBackupPrivilege")

#define SE_RESTORE_NAME       TEXT("SeRestorePrivilege")

#define SE_SHUTDOWN_NAME      TEXT("SeShutdownPrivilege")

#define SE_DEBUG_NAME         TEXT("SeDebugPrivilege")

这样通过这三个函数的调用,我们就可以用OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwProcessID)来打获得任意进程的句柄,并且指定了所有的访问权。
四 总结

    用户模式的内存扫描还是具有想当的局限性,它不能完全扫描Windows2000的全部内存空间。要对系统空间进行扫描,在Windows2000下,用户模式的应用程序是不能实现的。要实现对系统空间的扫描,必须通过工作于核心模式的程序—驱动程序来实现。 

60、Windows 9x、NT 和 2000 系统启动流程解析 本文详细解析了Windows 9x与Windows NT/2000系统的启动流程,涵盖各自的关键启动文件、组件作用及完整启动步骤。通过对比分析,揭示了两种系统在启动机制上的根本差异,包括实模式与保护模式的区别、硬件检测方式、内核加载过程等,并提供了系统安装配置与故障排除的实用建议,适用于系统管理员和技术爱好者深入了解操作系统底层机制。 阅读详情

相关推荐

[STM32H750]HAL库下FMC驱动正点原子MCU屏的移植与优化

本文详细介绍了在STM32H750平台上使用HAL库移植与优化正点原子MCU屏幕驱动的完整过程。重点解析了FMC硬件配置、Cache一致性处理、精确延时实现等关键技术难点,提供了实用的移植方案和性能优化技巧,帮助开发者高效解决屏幕显示问题。

rock5的博客 287

win2000进程虚拟内存数据搜索与修改

Windows2000下用户模式的内存扫描[转帖]        Sprite简述:    本文简要介绍了在Windows2000下实现内存扫描的基本理论和实现的办法。内存扫描是一项重要的技术,有相当广泛的应用范围:如病毒扫描、游戏修改等。Windows2000是一个完全保护的系统,且具有两种工作模式,即用户态和核心态(User Model and Kernel Model)。内存扫描也可

AthlonxpX86的专栏 1927

LIGGGHTS颗粒模拟入门:从DEM原理到工程实践

离散元法(DEM)是一种用于模拟颗粒物质行为的数值方法,其核心原理是通过计算每个颗粒的运动和相互作用来预测颗粒系统的宏观行为。该方法基于牛顿第二定律和接触力学模型,能够精确描述颗粒间的碰撞、摩擦和粘结等微观机制。在工程实践中,DEM技术为优化工业设备设计、预测材料流动和减少实验成本提供了重要价值。它广泛应用于制药造粒、矿石破碎、粉体输送和农业加工等领域,帮助工程师和研究人员深入理解颗粒系统的复杂动力学。LIGGGHTS作为一款基于LAMMPS的开源DEM软件,继承了其高效的并行计算架构,并针对颗粒模拟进行了

weixin_33979203的博客 420

虚拟内存遍历 VMView

虚拟内存遍历:本代码由15PB创始人A1Pass原创,网络资源稀少,转载请注明出处,尊重作者劳动成果!

cyxvc 1103

全网最全vue2技术栈实现AI问答机器人功能(流式与非流式两种接口方法)

markdown-it | markdown-it 中文文档上面的是 markdown-it 中文文档链接 ,供参考使用核心的东西就这些啦,如果有其他想问的,评论区留言即可~博客写作不易,希望大家多多支持,多多捧场~~~最后给大家分享一下 typed.js 网址,网上比较多,我觉得这个比较好理解一些Typed.js - Type your heart out (mattboldt.github.io)[这里是图片011]https://mattboldt.github.io/typed.js/

m0_74825108的博客 3060

Python爬取天天基金网历史数据

前言 最近开始学习基金????,感觉需要收集一些数据统计分析才靠谱????毕竟给A股交学费的感觉可不好受???? 网上有很多公开的数据,我这里选择的是天天基金网进行爬取 页面分析 接口我分析过了,有些验证不太好获取数据,所以直接从html提取 在天天基金网中随便选择一款基金,然后点击进入历史数据页面 容易定位出日增长率的css选择器 还有翻页按钮 程序编写 使用selenium打开chrome浏览器进行爬取,全代码如下 from selenium import webdriver from sel

JiajunBernoulli的博客 2953

命令行运行Systeminfo提示非内部命令

在Win中的Dos命令行中输入SystemInfo查看系统信息,提示非内部或外部命令。 解决办法: 首先在电脑的C:\WINDOWS\System32目录下查看是否有systeminfo.exe这个文件,如果没有从别的电脑拷贝。 其次,将C:\WINDOWS\System32这个路径添加到你的PATH环境变量中。

mazi的博客 6570

计算机考研常见面试题

写在前面 本人参加20考研,由于复试没有具体要求会问哪几门课,所以我就找了网上一些常见的计算机专业的面试题,整理如下 主要结构: 数据库 软件工程 操作系统 计算机组成原理 计算机网络 数据结构 C++ Java 数据库 1、数据:数据库中存储的基本对象。 数据库:长期存储在计算机内的、有组织的、可共享的数据集合。 数据库管理系统:专门用于建立和管理数据库的一套软件。对外部程序提供访问数据库的方法,对内进行数据管理。 数据库系统:与和数据库相关的整个系统,一般由数据库、数据库管理系统、应用程序、数

qq_38841618的博客 2万+

Windows查询内存(内存条)信息

Windows查询内存(内存条)信息 查询步骤 1.WIN+R打开cmd 2.输入wmic回车 3.输入memorychip回车即可查询到内存详细信息

fuchuonie3182的博客 8443

CentOS7安装openGauss5.0.2LTS版本

该文档要根据自己的实际情况调整ip地址。要根据自己的实际网卡调整。

superhanyubo的专栏 2581

YOLOv13改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进

1️⃣ 已更新种不同的改进方案,专栏内的每篇文章皆,均可顺利运行。2️⃣ 订阅专栏即可进群获取以及从的各种答疑内容。3️⃣ 全新的YOLOv13改进专栏,,只为更好的满足论文发表的要求。专栏内容,专栏实时评分,全网最高,质量保证。🎫。。

Limiiiing的博客 9175

遍历某一个进程的模块

#include "stdafx.h" #include <windows.h> #include <TlHelp32.h> #include <locale.h> bool GetModuleList(DWORD dwPId) { HANDLE hModuleSnap = INVALID_HANDLE_VALUE; MODULEENTRY32 me32 = { siz

charge_release的博客 2337

计算机视觉论文复现指南:从理论到可运行代码的保姆级教程

计算机视觉论文复现指南:从理论到可运行代码的保姆级教程​ ,人工智能,计算机视觉,大模型,AI,本文围绕计算机视觉论文复现展开,介绍从理论到可运行代码的全流程。先强调复现的重要性,再讲解复现前的准备,包括明确目标、构建工具链;接着说明代码获取分析、环境配置调优、调试运行技巧及结果验证优化方法,还推荐了高效工具,提及复现中的伦理规范。旨在助读者掌握复现方法论,实现从经典模型到前沿论文的复现,推动学术成果落地。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 12万+

[转帖] Windows2000下用户模式的内存扫描

Windows2000下用户模式的内存扫描[转帖] Sprite简述: 本文简要介绍了在Windows2000下实现内存扫描的基本理论和实现的办法。内存扫描是一项重要的技术,有相当广泛的应用范围:如病毒扫描、游戏修改 等。Windows2000是一个完全保护的系统,且具有两种工作模式,即用户态和核心态(User Model and Kernel Model)。内存扫描也可分为用户态的内存扫描与核心

solomon的专栏 929

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Windows2000下用户模式的内存扫描

Windows2000下用户模式的内存扫描        Sprite简述:    本文简要介绍了在Windows2000下实现内存扫描的基本理论和实现的办法。内存扫描是一项重要的技术,有相当广泛的应用范围:如病毒扫描、游戏修改等。Windows2000是一个完全保护的系统,且具有两种工作模式,即用户态和核心态(User Model and Kernel Model)。内存

Sprite_sy的专栏 1394

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

windows 2000下用户模式的内存扫描

windows 2000下用户模式的内存扫描 http://hi.baidu.com/blueapple%5Fc/blog/item/a7c4300941156d9d0a7b8286.html 简述: 本文简要介绍了在Windows2000下实现内存扫描的基本理论和实现的办法。内存扫描是一项重要的技术,有相当广泛的应用范围:如病毒扫描、游戏修改等。Windows2000是一个完全保

StamHe的专栏 1273

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

Win 2000系统引导过程详解

  引言       但笔者在这两年的工作过程中,却发现很多用户对Windows 2000的特性还并不是很了解,以至于常常在发生系统故障甚至崩溃的不幸之后,就只有草率的重装系统,随之带来了漫长的软件环境的恢复和对丢失文件的痛苦回忆。        本文适用于Win NT4.0,Windows 2000以及Windows XP各个版本的使用者。        本文旨在以Windows 2000为例讨

FreeXploiT 2925

forza-painter如何实现免更新适配Forza新版本?Update Codes与内存模式扫描机制深度解读

forza-painter 是一款开源的 Forza 图片导入工具,能把任意图片一键转换成《极限竞速:地平线4/5》(Forza Horizon)的高精度车贴(Vinyl Group)。更关键的是,它通过 **Update Codes** 与**内存模式扫描**两大机制,实现了游戏频繁更新也能"免更新"持续适配新版本——你不必等待工具重新发版。 ## 一、forza-painter 能做什么?

gitblog_00592的博客 482

Vectras VM教程:Android上通过QEMU安装Windows 95/2000全攻略

虚拟机技术让旧操作系统在现代设备上焕发新生。QEMU作为开源机器模拟器,能够完整模拟CPU、内存、磁盘和显卡等硬件,为操作系统提供虚拟运行环境。在Android平台,Vectras VM将QEMU封装为图形化前端,无需Root即可创建x86虚拟机。理解虚拟硬件配置中的机器类型、磁盘控制器、启动顺序等基础概念,是成功安装老系统的关键。Windows 95和Windows 2000对资源要求低,且兼容IDE硬盘与标准VGA,非常适合在手机虚拟机中运行。本文从环境准备、镜像校验到虚拟机参数选型,详细介绍DOS分区

weixin_34127717的博客 426
上一篇: 察看软件的编写语言
下一篇: 仅通过崩溃地址找出源代码的出错行
code_farmer
博客等级 码龄22年 9粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值