;进程创建过程开始 CreateProcessA call kernel32!CreateProcessA ;10个参数 ; BOOL WINAPI CreateProcess( ; __in_opt LPCTSTR lpApplicationName, ; __inout_opt LPTSTR lpCommandLine, ; __in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes, ; __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, ; __in BOOL bInheritHandles, ; __in DWORD dwCreationFlags, NORMAL_PRIORITY_CLASS ; __in_opt LPVOID lpEnvironment, ; __in_opt LPCTSTR lpCurrentDirectory, ; __in LPSTARTUPINFO lpStartupInfo, ; __out LPPROCESS_INFORMATION lpProcessInformation ; ); ; 直接调用kernel32!CreateProcessInternalA call kernel32!CreateProcessInternalA ; 12个参数,第一个与最后一个为零,中间10个延接了上面传入的10个参数 ; 主要任务是将ANSI字符转换成Unicode字符,很多代码用于了转换与检查,所以,直接用Unicode编程将大大增加执行效率 call kernel32!CreateProcessInternalW ; 12个参数 ; 基本延续上面的 ; 第6个参数 and 0F7FFFFFFh
以下为kernel32!CreateProcessInternalW中的流程:
call ntdll!ZwQueryInformationJobObject ; ZwQueryInformationJobObjectretrieves information about a job object. ; NTSYSAPI ; NTSTATUS ; NTAPI ; ZwQueryInformationJobObject( ; IN HANDLE JobHandle, == 0 ; IN JOBOBJECTINFOCLASS JobInformationClass, == 4 ; OUT PVOID JobInformation, == Address ; IN ULONG JobInformationLength, == 4 ; OUT PULONG ReturnLengthOPTIONAL == 0 ; ); ; 判断返回值是否为C0000022h (拒绝访问) call kernel32!SearchPathW ; 进行路径搜索 call kernel32!GetFileAttributesW ; 获取文件属性 call kernel32!BasepIsSetupInvokedByWinLogon ; 判断是否WinLogon进程 call ntdll!RtlDosPathNameToNtPathName_U call ntdll!RtlDetermineDosPathNameType_U ; 路径转换 call ntdll!NtOpenFile ; 打开文件 call ntdll!NtCreateSection ; NtCreateSection( ; OUT PHANDLE SectionHandle, ; IN ACCESS_MASK DesiredAccess, ; IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, ; IN PLARGE_INTEGER MaximumSize OPTIONAL, ; IN ULONG Protect, ; IN ULONG Attributes, ; IN HANDLE FileHandle OPTIONAL ; ); ; 创建Section CreateFileMapping是对NtCreateSection的封装,所以在这一步,程序被映射进了内存 call kernel32!BasepIsProcessAllowed ; 就一个参数为Unicode进程名字 ; 其内部调用了RtlEnterCriticalSection进入临界区 ; 再调用NtOpenKey打开: ; "/Registry/MACHINE/System/CurrentControlSet/Control/Session Manager/AppCertDlls" ; 解释: ; AppCertDlls details. ; Create in the "//Registry//MACHINE//System//CurrentControlSet//Control//Session Manager//AppCertDlls" ; ; The Key with name "AppSecDll" type REG_EXPAND_SZ, and put there, something like that "%SystemRoot%/system32/ .Dll" ... In fact, they may be there a lot, so keep this in mind. ; ; This yours DLL must have mandatory entry point with name CreateProcessNotify, and prototype as specified below. ; 结束 ; 最后调用RtlLeaveCriticalSection call kernel32!BasepCheckBadapp ; 对进程行行兼容性检查 ; 1. IsShimInfrastructureDisabled ; 2. RtlAllocateHeap NTDLL ; 3. __imp__memmove ; 4. BaseCheckAppcompatCache KERNEL32 ; 1. __SEH_prolog ; 2. BasepShimCacheCheckBypass KERNEL32 ; 3. BasepShimCacheLock KERNEL32 ; 4. BasepShimCacheLookup KERNEL32 ; 5. BasepShimCacheUnlock KERNEL32 ; 6. __SEH_epilog ; 5. RtlFreeHeap NTDLL ; 其中会加载: ; call kernel32!LdrLoadDllC:/WINDOWS/system32/Apphelp.dll ; 调用其中的“ApphelpCheckRunApp” call kernel32!BasepCheckWinSaferRestrictions ; 1. RtlEnterCriticalSection NTDLL ; 2. NtOpenThreadToken ; NtOpenThreadToken ( IN HANDLE ThreadHandle, == 0FFFFFFFEh(-2 当前线程) ; IN ACCESS_MASK DesiredAccess, == 2000000h ; IN BOOLEAN OpenAsSelf, == 1 ; OUT PHANDLE TokenHandle ; ) ; 判断返值是否等于0C000007Ch(试图引用不存在的令牌)否跳走(跳走后的没跟,估计是跳向了NtSetInformationThread) ; 是则继续向下Call ; 3. NtOpenProcessToken ; NtOpenProcessTokenEx ( IN HANDLE ProcessHandle, == -1 当前进程 ; IN ACCESS_MASK DesiredAccess, == 0ah ; IN ULONG HandleAttributes, ; OUT PHANDLE TokenHandle ; ) ; 判断返回值是否为0C0000022h(拒绝访问), ; 是跳走,否继续 ; 4. NtQueryInformationToken ; NtQueryInformationToken ( IN HANDLE TokenHandle, == 上面得到的句柄 ; IN TOKEN_INFORMATION_CLASS TokenInformationClass, == 1 ; OUT PVOID TokenInformation, ; IN ULONG TokenInformationLength, ; OUT PULONG ReturnLength ; ) ; 5. RtlInitializeSid ; RtlInitializeSid( IN PSID Sid, ; IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority, ; IN UCHAR SubAuthorityCount ); ; 6. RtlSubAuthoritySid ; 7. RtlEqualSid ; 8. NtOpenKey "/Registry/MACHINE/System/CurrentControlSet/Control/SafeBoot/Option" ; 打开失败,继续打开下面的: ; "/Registry/Machine/Software/Policies/Microsoft/Windows/Safer/CodeIdentifiers" ; 打开成功: ; Call NtQueryValueKey 取"TransparentEnabled"项的值 ; 判断得到的值是否为零,不为零为设某变量为1 ; Call NtQueryValueKey 取"AuthenticodeEnabled"项的值 ; 判断得到的值是否为零,不为零则跳转,我这里是零 ; 9. NtClose ; 10. call kernel32!LdrLoadDll "ADVAPI32.DLL" ; 装入DLL ; 11. call kernel32!LdrGetProcedureAddress ;获取下列API地址 ; "SaferIdentifyLevel" ; "SaferComputeTokenFromLevel" ; "SaferCloseLevel" ; "SaferRecordEventLogEntry" ; 12. NtClose ; 13. call kernel32!__security_check_cookie call ntdll!ZwQuerySection ; ZwQuerySection ( IN HANDLE SectionHandle, == Section句柄 ; IN SECTION_INFORMATION_CLASS SectionInformationClass, == 1 ; OUT PVOID SectionInformation, ; IN SIZE_T Length, ; OUT PSIZE_T ResultLength ; ) call kernel32!LdrQueryImageFileExecutionOptions ; 获取调试信息,映像劫持~ ; LdrQueryImageFileExecutionOptions ( IN PUNICODE_STRING SubKey, == "/??/E:/AAAAA.exe"进程名 ; IN PCWSTR ValueName, == "Debugger" ; IN ULONG Type, == 1 ; OUT PVOID Buffer, ; IN ULONG BufferSize, ; OUT PULONG ReturnedLength OPTIONAL ; ) call kernel32!BasepIsImageVersionOk call kernel32!LoadLibraryA "advapi32.dll" call kernel32!GetProcAddress "CreateProcessAsUserSecure" call ntdll!ZwQuerySystemInformation ; ZwQuerySystemInformation( ; IN SYSTEM_INFORMATION_CLASSSystemInformationClass, == 47H == "SystemCreateSession" ; INOUT PVOIDSystemInformation, ; IN ULONGSystemInformationLength, ; OUT PULONGReturnLength OPTIONAL ; ); call kernel32!FreeLibrary "advapi32.dll" call kernel32!BaseFormatObjectAttributes call ntdll!ZwCreateProcessEx mov eax,30h call ntdll!KiFastSystemCall call ntdll!ZwSetInformationProcess ; NtSetInformationProcess ( IN HANDLE ProcessHandle, == ZwCreateProcessEx时得到的进程句柄 ; IN PROCESSINFOCLASS ProcessInformationClass, == 12h == ProcessDefaultHardErrorMode ; IN PVOID ProcessInformation, == 2 == SEM_NOGPFAULTERRORBOX ; IN ULONG ProcessInformationLength == 2 ; ) call kernel32!BasepSxsCreateProcessCsrMessage ; 1. BasepSxsGetProcessImageBaseAddress KERNEL32 ; 2. RtlMultiAppendUnicodeStringBuffer NTDLL ; 3. BasepSxsCreateStreams KERNEL32 ; 4. BasepSxsIsStatusFileNotFoundEtc ; 5. BasepSxsIsStatusResourceNotFound call ntdll!NtQueryInformationProcess ; ZwQueryInformationProcess( ; IN HANDLE ProcessHandle, == 进程句柄 ; IN PROCESSINFOCLASS ProcessInformationClass, == 0 == ProcessBasicInformation ; OUT PVOID ProcessInformation, ; IN ULONG ProcessInformationLength, ; OUT PULONG ReturnLength OPTIONAL ; ); call kernel32!BasePushProcessParameters ; 1. __SEH_prolog ; 2. GetFullPathNameW KERNEL32 ; 3. BaseComputeProcessDllPath KERNEL32 ; 4. RtlInitUnicodeString ; 5. RtlCreateProcessParameters NTDLL ; 6. NtAllocateVirtualMemory ; 7. NtWriteVirtualMemory ; 8. __security_check_cookie ; 9. __SEH_epilog call kernel32!BaseCreateStack ; 1. RtlImageNtHeader NTDLL ; 2. NtAllocateVirtualMemory ; 3. NtProtectVirtualMemory call kernel32!BaseInitializeContext ; BaseInitializeContext(PCONTEXT Context, // 0x200 bytes ; PPEB Peb, ; PVOID EntryPoint, ; DWORD StackTop, ; int Type // union (Process, Thread, Fiber) ; ); call kernel32!BaseFormatObjectAttributes call ntdll!ZwCreateThread mov eax,35h call ntdll!KiFastSystemCall call kernel32!GetModuleHandleA "NULL" eax == 0400000h ;程序装入地址 call ntdll!RtlImageNtHeader eax ; 验证NTHeader ; 下面是通知Cress.exe的几个函数 call ntdll!CsrCaptureMessageMultiUnicodeStringsInPlace call ntdll!CsrClientCallServer call ntdll!CsrFreeCaptureBuffer ;-------------- call ntdll!ZwResumeThread ;启动线程移交控制权并返回 ret ;;进程创建过程结束 CreateProcessA
相关推荐
浅谈武术擂台格斗机器人大赛
武术擂台机器人赛是工科类专业的一个跨学科的竞赛项目,它涵盖了机械结构、硬件电路和计算机程序等技术领域。笔者在校期间有幸参加过四次这样的比赛,有成功也有失败,对此深有感悟。本文仅为个人观点,有说得不对的地方,望积极指出,希望能帮助到有需要的人。
重载内核(x86)
#include #include #include #include #include #include #include #ifndef MAX_PATH #define MAX_PATH 256 #endif typedef unsigned char *PBYTE; typedef unsigned char BYTE; typedef unsigned int UIN
开箱即用的Platform IO开发平台(包括Arduino,ESP8266,ESP32,STM32)
开箱即用的 Platform IO 离线开发环境,包含(ESP32,ESP32S2,ESP8266,Arduino,STM32)
干掉KV 2008, Rising等大部分杀软
作 者: sudami时 间: 2008-03-23,10:01链 接: http://bbs.pediy.com/showthread.php?t=61762前言:写这篇文章不是为了传播病毒技术,而是让广大的电脑安全爱好者对病毒常用的伎俩有一个比较清楚的认识,才能更好的防范. 写的很菜,老鸟飘过~主题:利用驱动结束掉大部分的安全软件(eg. KV 2008, 瑞星,微点, 360),禁止一些AR
小程序 video 控制器外观调整_Kessil 360X Tuna Sun无线控制器使用分享
之前分享了Kessil 360X Tuna Sun开箱记录,时间关系,没来得及使用WiFi Dongle无线控制器。昨晚抽空实操了一下,做个操作记录,希望对大家有参考Kessil无线模块操作指南官方视频英文教程配中文字幕,非常详尽语速较快,重点位置可以暂停操作点击边框调出视频工具条1、拆包取控制器,保存二维码Kessil WiFi Dongle包装打开包装就能看到Kessil无线控制模...
告别LM2596!用LM5175打造400W自动升降压数控电源(附完整电路图与代码)
本文详细介绍了如何利用LM5175芯片设计400W自动升降压数控电源,替代传统的LM2596方案。通过四开关Buck-Boost拓扑结构,LM5175实现了高达98%的转换效率和400W大功率输出,支持无缝升降压切换。文章涵盖芯片选型、电路设计、PCB布局及STM32数控实现,为工程师提供完整的实践指南。
十个有用的内核 API
RtlPcToFileName() 和 RtlPcToFilePath() 演练定位在 PsLoadedModuleList 的 KLDR_DATA_TABLE_ENTRY 结构列表,并确定给定地址 (Pc) 是否属于 KLDR_DATA_TABLE_ENTRY 中的盘区。根据 Buffer 参数中传递的结构类型,UnitSize 参数可以是 sizeof(RTL_MODULE_BASIC_INFO) 或 sizeof(RTL_MODULE_EXTENDED_INFO)。
LangChain + Milvus Lite:从零搭建本地RAG知识库
本文详细介绍了如何利用LangChain、Milvus Lite和gte-large-zh模型,在本地从零搭建一个完整的RAG知识库系统。文章涵盖了环境配置、文档处理与向量化、本地向量库构建以及检索问答实现的全流程,重点突出了完全本地化部署带来的数据隐私安全和成本优势,为开发者提供了一条实践性极强的技术路径。
《Undocumented Windows 2000 Secrets》翻译 --- 第六章(4)
第六章 在用户模式下调用内核API函数翻译:Kendiv( fcczj@263.net )更新:Friday, May 06, 2005 声明:转载请注明出处,并保证文章的完整性,本人保留译文的所有权利。 通往用户模式的桥梁现在,内核调用接口的演化已经缓慢的到达了终点----至少已经涉及内核模式(kernel-mode)。让我们总结一下到目前为止,我们已经获得了什么:l 名为Sp
工业相机的检测原理课件(建议收藏)
本课件为各位工程师详细介绍了工业相机的视觉检测原理 ,旨在为工程师调试工业相机的视觉检测原理时提供理论性指导。
74.9008深度刷机原理|高通QPST/Firehose底层刷写协议详解
移动设备刷机与底层维修技术指南 本文为移动设备维修人员和高级玩家提供全面的刷机与底层维修技术指南,涵盖高通、联发科和苹果A系列芯片的主要操作。 主要内容 核心操作:Bootloader解锁、Fastboot刷写、EDL深度修复、iTunes DFU模式恢复和分区表重建 适用场景:系统故障修复、底层损坏恢复、安全限制解除、系统降级和深度硬件维修 关键技术:详细解析刷机协议栈层级、关键分区作用和刷机安全机制 操作步骤: 环境搭建与驱动安装 Bootloader解锁(以小米为例) 高通机型系统刷写 苹果设备DFU
Activity启动流程(五)请求并创建目标Activity进程
Android四大组件之Activity启动流程源码实现详解(五) Android四大组件源码实现详解系列博客目录: Android应用进程创建流程大揭秘 Android四大组件之bindService源码实现详解 Android四大组件之Activity启动流程源码实现详解概要 Android四大组件之Activity启动流程源码实现详解(一) Android四大组件之Activity启动流程源码实现详解(二) Activity启动流程(三)- Activity Task调度算法复盘分析 A.
基于YOLOv5/v8/v10的答题卡填涂识别与评分系统(附数据集+UI界面+完整代码)
在教育信息化的大背景下,传统的手工阅卷方式正在被智能化技术所取代。答题卡识别作为标准化考试的核心环节,其准确率和效率至关重要。本文将详细介绍如何利用YOLO系列目标检测算法(YOLOv5、YOLOv8、YOLOv10)构建一个答题卡填涂识别与评分系统。文章从数据集的制作与标注开始,逐步深入到模型的训练、评估与对比,最后基于PyQt5设计了一个用户友好的桌面端UI界面,实现了从图像输入到得分输出的全流程自动化。
理解Android进程创建流程
进程:每个App在启动前必须先创建一个进程,该进程是由Zygote fork出来的,进程具有独立的资源空间,用于承载App上运行的各种Activity/Service等组件。进程对于上层应...
迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)
迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)
android 蓝牙通讯demo
android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。
从linux核心进程学习进程创建基本流程
本文主要0、1、2这三个进程来分析创建进程的大体流程。使用的代码是从官网上下载的linux6.4的版本。
怀旧版电脑GBC模拟器
再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。
进程及线程创建流程
今天在MuseHero的博客看到的资料,先收藏下来,以后慢慢学习,顺便了解一下WINDOWS的进程机制。;进程创建过程开始 CreateProcessAcall kernel32!CreateProcessA ;10个参数; BOOL WINAPI CreateProcess(; __in_opt LPCTSTR lpApplicationName,; __inout_op
Data-Structures-and-Algorithm-Analysis-in-Java.pdf
作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...
Android进程框架:进程的创建、启动与调度流程
其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。下图是我进阶学习所积累的历年腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节祝大家都能得到自己心仪工作。讲义、实战项目、讲解视频,并且后续会持续更新**
Android进程创建流程
进程创建过程的简要图: 图解: App发起进程:当从桌面启动应用,则发起进程便是Launcher所在进程;当从某App内启动远程进程,则发送进程便是该App所在进程。发起进程先通过binder发送消息给system_server进程; system_server进程:调用Process.start()方法,通过socket向zygote进程发送创建新进程的请求; zygote进程:在执行Zyg...
Activity之应用进程创建流程简析
android 应用进程创建流程分析
Android 9(P)应用进程创建流程大揭秘
Android 9 应用进程创建流程大揭秘 前言 我们知道zygote是Android世界的孵化大师,当Android终端在启动过程中创建了zygote进程之后,历史的重任就赋予在zygote身上了。zygote的重任主要就是孵化,而zygote进程对于孵化有两种不同的处理逻辑: 第一种就是zygote感觉自身担子太重了,所以必须得培养一个得力干将,从而zygote主动孵化了system_server进程来处理一些重要的事务,这个就是我们在章节Android 9 系统启动之Sys
linux内核,从进程创建-启动流程
else#endif函数是 Linux 内核中 ELF 二进制格式加载的核心实现,它完成了从解析 ELF 文件头、加载程序段到内存、设置进程地址空间到初始化执行环境的整个过程。通过细致的资源管理和错误处理,确保了 ELF 二进制文件能够正确加载和执行,同时维护了系统的安全性和稳定性。
Linux进程创建,调度,切换流程
│ wake_up_new_task() │ // 设置 TASK_RUNNING。│ fork() / vfork() / clone() │ // glibc 封装系统调用。│ -> alloc_pid() │ // 分配 pid/tgid。│ - dup_task_struct() │ // 分配并复制 PCB。│ - switch_to() │ // 保存/恢复寄存器与栈。
C语言 创建守护进程的一般流程
这段代码的主要功能是创建一个子进程,并终止父进程,使得子进程可以在没有父进程的情况下继续运行,从而为将子进程设置为守护进程打下基础。这种方法确保了子进程能够在后台长期运行,而不受父进程状态的影响。守护进程是指在后台运行、没有控制终端的进程,通常用于提供长期服务。
Windows进程创建的流程分析。
. 创建进程的大体流程: 创建进程的过程就是构建一个环境,这个环境包含了很多的机制 (比如自我保护, 与外界通信等等)。 构建这个环境需要两种“人”来协调完成(用户态和内核态),他们各有分工,其中用户态提供原料(提供创建的那些参数), 内核态负责来构建这个环境,由于环境是由内核态构建的,因此他持有这个环境的控制权, 而用户由于提供了原料, 因此他具有使用权。 内核态开始构建环境中的基
Windows进程创建的流程分析
. 创建进程的大体流程: 创建进程的过程就是构建一个环境,这个环境包含了很多的机制 (比如自我保护, 与外界通信等等)。 构建这个环境需要两种“人”来协调完成(用户态和内核态),他们各有分工,其中用户态提供原料(提供创建的那些参数), 内核态负责来构建这个环境,由于环境是由内核态构建的,因此他持有这个环境的控制权, 而用户由于提供了原料, 因此他具有使用权。 内核态开始构建环境中的基
1万+



被折叠的 条评论
为什么被折叠?



