摘要:操作系统是计算机系统中的基本软件。它负责管理系统中的软硬件资源。通常都包括文件管理、内存管理、进程管理、打印管理、网络管理等基本功能。除此之外,支持调试也是操作系统设计的一项根本任务。 0x01 进程和进程空间 进程和程序的关系好比是类和实例的关系,运行一个程序时,操作系统就为这个程序创建一个实例。
阅读全文
摘要:编译器:VS2015 调用约定的直观认识: __stdcall是微软自己搞出来的, c、c++的默认调用方式是_cdecl, 另外还有优化的__fastcall(通过寄存器传递参数) 以及c++的,thiscall(不能直接使用) 还有naked call (可参考http://blog.csdn.
阅读全文
摘要:在X64模式中,存在的问题是JMP指令和整个地址空间相比仅仅覆盖了很窄的范围。因此引入一个中继函数(Relay Function)来实现对64位Detour函数地址的跳转。 在hook的分析之前,先谈一下前一篇帖子评论中的相关话题。 之前发布的一篇Minhook分析,有大牛说没有写出多线程安全,指令
阅读全文
摘要:Windows的应用程序是事件(消息)驱动的。它们不会显式地调用函数(如C运行时库调用)来获取输入,而是等待windows向它们传递输入。 windows系统把应用程序的输入事件传递给各个窗口,每个窗口有一个函数,称为窗口消息处理函数。窗口消息处理函数处理各种用户输入,处理完成后再将控制权交还给系统
阅读全文
摘要:百度百科的解释是:“栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。 实际上,可以简单理解为:栈帧就是存储在用户栈上的(当然内核栈同样适用)每一次函数调用涉及的相关信息的记录单元。栈帧表示程序的函数调用记录,而栈帧又是记录在栈上面,很明显栈上保持了多个栈帧的实体。
阅读全文
摘要:MinHook的原理就在于重写目标函数。在这次分析的X86模式中,32位相对JMP覆盖了整个地址空间。因为在相对地址计算中溢出的位被忽略,所以在X86模式中,函数的地址是容易掌控的。 直接来进入正题。 使用时需要通过#pragma来导出模块定义文件 (.def)中的DLL函数: LIBRARY EX
阅读全文
摘要:1.返回值 其中 函数4 个参数的意义是一样的,返回值类型不同(其实从数据上看他们一样是一个 32 位的数,只是意义不一样),LRESULT 表示的是消息被处理后的返回值,BOOL 表示的是消息是不是 Post 成功。 2、PostMessage 是异步的,SendMessage 是同步的。 Pos
阅读全文
摘要:总结一下之前学习过的在blackbone中的一个x86程序中获取x64位进程函数地址的方法,之前就已经系统地梳理了一遍,今天贴出来分享一下。 这个程序的目的说白了就是要让让运行在Wow64环境中的x86应用程序可以获取到x64下ntdll.dll中的Native API的地址,从而能够直接调用x64
阅读全文
摘要:CreateThread 是一个Win 32API 函数, _beginthread 是一个CRT(C Run-Time)函数, 他们都是实现多线城的创建的函数,而且他们拥有相同的使用方法,相同的参数列表。 CreateThread()和_beginthreadex()在Jeffrey的《Windo
阅读全文
摘要:参考周伟明前辈的《多任务下的数据结构与算法》实现的自定义的消息队列。 0x01 消息队列机制 消息队列是 一 种 可 以 有 多 个 任 务 同 时 问 队 列 里 发 送 和 接收 数 据 的 队 列 。 要 实 现 多个 任 务 同 时 向 队 列 里 收 发 数 据 , 那 么 必 须 在 收
阅读全文
摘要:转载请您注明出处:http://www.cnblogs.com/lsh123/p/7405796.html 0x01 CreateProcessW CreateProcess的使用有ANSI版本的CreateProcessA和UNICODE版本的CreateProcessW: 不过查看源码就可以发现
阅读全文
摘要:可等待定时器这种内核对象,它们会在某个指定的时间触发,或每隔一段时间触发一次。它们通常用来在某个时间执行一些操作。 0x01 创建一个可等待定时器 CreateWaitableTimer (在创建的时候,可等待的计时器对象总是处于未触发状态) HANDLE WINAPI CreateWaitable
阅读全文
摘要:一. IO完成端口概念 IO完成端口的出现是为了解决并发模型中可运行线程上下文切换开销过大而出现的。 在《Windows核心编程》的描述中,IO完成端口是Wnidows系统提供的最复杂的内核对象,是一种解决并发IO请求的最佳模型,是用来实现高容量网路服务器的最佳方法。既然是一个对象,那么就直接分析一
阅读全文
摘要:同步IO是指:线程在发起IO请求后会被挂起,IO完成后继续执行。 异步IO是指:线程发起IO请求后并不会挂起而是继续执行。IO完毕后会得到设备驱动程序的通知。 一.异步准备与OVERLAPPED结构 (1).为了以异步的方式来访问设备,必须先调用CreateFile,并在dwFlagsAndAttr
阅读全文
摘要:读写锁在对资源进行保护的同时,还能区分想要读取资源值的线程(读取者线程)和想要更新资源的线程(写入者线程)。 对于读取者线程,读写锁会允许他们并发的执行。当有写入者线程在占有资源时,读写锁会让其它写入者线程和读取者线程等待。 用读写锁来解决读者写者问题会使代码非常清晰和简洁。
阅读全文
摘要:通过SetThreadPriority可以设置线程优先级别: WINBASEAPIBOOLWINAPISetThreadPriority( _In_ HANDLE hThread, //线程句柄 _In_ int nPriority //设置的权限级别 ); MSDN: Begin backgrou
阅读全文
摘要:HANDLE GetCurrentProcess(); 返回值 0XFFFFFFFF -1 HANDLE GetCurrentThread(); 返回值 0XFFFFFFFE -2 这两个函数都返回到主调线程的进程或线程内核对象的一个伪句柄(pseudohandle )。GetCurrentProc
阅读全文
摘要:1 .使用线程局部存储的理由 当我们希望这个进程的全局变量变为线程私有时,而不是所有线程共享的,也就是每个线程拥有一份副本时,这时候就可以用到线程局部存储(TLS,Thread Local Storage)这个机制了。 2.动态TLS(1)调用TlsAlloc函数 两种方式: 1>全局调用一次: g
阅读全文
摘要:一.作业(job)内核对象概念 1.为什么要有作业job 便于管理进程:进程的父子关系只存在于创建的子进程的那一刻,Windows并不一直维护着这种父子关系,这使得管理进程并不是件容易的事。 2.作业的功能 作业对象是用于将一组进程作为一个管理单元的内核对象,本质上可以理解为其实就是进程池对象,可将
阅读全文