首页
社区
课程
招聘
[原创][新手]win32程序的半生(CreateProcess)
发表于: 2018-5-18 00:10 9070

[原创][新手]win32程序的半生(CreateProcess)

2018-5-18 00:10
9070


========================================================================================================================

1.静态分析:IDA PRO
2.动态分析:Ollydbg/X32dbg/windbg
3.ARK工具:PCHunter
1.虚拟机:VMware WORKSTATION 14 PRO
2.系统版本:win7专业版
1.Windows的应用层基础知识:《Windows核心编程》
2.Windows的内核的基础知识:《Windows内核情景分析》
研究win7系统下通过CreateProcess所创建的进程的所有函数执行流程(R3到R0的函数调用的大致整体流程)
答:
本质:
一个程序实际还是一段数据,管理的方式还是目录+内容,即内核对象+程序空间,以内核中的EPROCESS为目录,到CR3衍生的用户的虚拟地址空间的PE文件映像。
内容:
1.一个进程会有一个系统分配的主线程主要运行代码。
2.有一段虚拟内存空间,里面映射着PE文件内容。
3.对应的一个内核对象,EPROCESS结构体。
答:
R3环:
CreateProcess
OpenProcess
CreateFile
.......
R3环下有程序主动调用API,dll可以看做是R3下底层,API的简单实现在其中体现,dll中还会为进入R0环做一些准备工作。
R0环:
NTCreateProcess
NTCreateUserProcess
........
R0环下通过ETHREAD结构的ServiceTable找到SSDT或ShadowSSDT,通过R3环准备的参数和索引来进行函数调用。

ps:Wows系统设计思路也是面向对象,所以如果把函数当成对象来看其实每个函数都是由其它得函数组成的。
CreateProcessW ==>  CreateProcessInternalW  ==>  ZwCreateUserProcess  ==>  KiFastSystemCall  ==>  KiFastCallEntry  ==>  NtCreateUserProcess
答:
1.int 0X2E:
老版的进入方式,通过中断门主动调用KiSystemService来完成系统服务调用,和int 3对应KiTrap03类似。
KiSystemCallExit:iret返回
2.SYSENTER:
较新的进入方式,通过该特权指令切换寄存器(EIP/SS/CS/ESP)来进入R0环,
KiSystemCallExit2:SYSEXIT返回
答:
系统在进入R0环之前就做了很多检查和准备,例如:后期用到的索引就是在进入R0环之前就存储在EAX寄存器中,进入R0环只会切换关键寄存器来达到切换地址的目的,而EAX的值不会变化,索引就可以在R0下被访问到。
1.进程的创建流程。
2.动态链接库的调用。
3.系统服务描述符表的调用。
4.进程的虚拟地址空间(CR3寄存器)。
5.内核对象,例如:EPROCESS(据说搞定这个结构体就相当于搞定了大半个windows系统)、ETHREAD、KPCR、KPCRB。
6.R3环和R0环的交互。
通过CreateProcess创建一个目标进程
#include "stdafx.h"
#include <windows.h>
#define Path  L".\\FileCleaner2.0.exe"
int _tmain(int argc, _TCHAR* argv[])
{
	STARTUPINFO si = { sizeof(si) };
	PROCESS_INFORMATION pi;
	BOOL bRet = CreateProcess(Path,NULL,NULL,NULL,FALSE,NULL,NULL,NULL,&si,&pi);
	return 0;
}

#include "stdafx.h"
#include <windows.h>
#define Path  L".\\FileCleaner2.0.exe"
int _tmain(int argc, _TCHAR* argv[])
{
	STARTUPINFO si = { sizeof(si) };
	PROCESS_INFORMATION pi;
	BOOL bRet = CreateProcess(Path,NULL,NULL,NULL,FALSE,NULL,NULL,NULL,&si,&pi);
	return 0;
}


========================================================================================================================

OD调试R3下调试程序得到如下流程:
R3-1:CreateProcessW(main函数)

R3-2: CreateProcessInternalW(Kernel.dll模块)

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2018-12-25 23:19 被Weaving编辑 ,原因:
收藏
免费 3
支持
分享
最新回复 (6)
雪    币: 1795
活跃值: (63)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
你好,能请教以下流程图用的时什么软件吗
2018-5-18 01:13
0
雪    币: 10
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
很好、学习啦
2018-5-18 12:21
0
雪    币: 3288
活跃值: (321)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
4
myangel 你好,能请教以下流程图用的时什么软件吗
XMind
2018-5-18 14:47
0
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
2018-5-21 23:42
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
很详细
2018-6-5 21:56
0
雪    币: 233
活跃值: (112)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
看不懂,虽然有win32基础,还需要什么windows知识吗?
2018-7-10 11:54
0
游客
登录 | 注册 方可回帖
返回
//