10 2017 档案

摘要:COM是基于二进制的组件模块,从设计之初就以支持所有语言作为它的一个目标,这篇文章主要探讨COM的跨语言部分。 idl文件 一般COM接口的实现肯定是以某一具体语言来实现的,比如说使用VC++语言,这就造成了一个问题,不同的语言对于接口的定义,各个变量的定义各不相同,如何让使用vc++或者说Java 阅读全文
posted @ 2017-10-30 23:22 masimaro 阅读(2333) 评论(0) 推荐(0) 编辑
摘要:C语言中的变量大致可以分为全局变量,局部变量,堆变量和静态局部变量,这些不同的变量存储在不同的位置,有不同的生命周期。一般程序将内存分为数据段、代码段、栈段、堆段,这几类变量存储在不同的段中,造成了它们有不同的生命周期。全局变量全局变量的生命周期是整个程序的生命周期,随着程序的运行而... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(1268) 评论(0) 推荐(0) 编辑
摘要:C语言作为面向过程的语言,函数是其中最重要的部分,同时函数也是C种的一个难点,这篇文章希望通过汇编的方式说明函数的实现原理。栈结构与相关的寄存器在计算中,栈是十分重要的一种数据结构,同时也是CPU直接支持的一种数据结构,栈采用先进后出的方式。CPU中分别用两个寄存器ebp和esp来保... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(178) 评论(0) 推荐(0) 编辑
摘要:在C语言中采用3中语法来实现循环,它们分别是while、for、do while,本文将分别说明这三种循环的实现,并对它们的运行效率进行比较。do while首先来看do while的实现:下面是简单的代码:int nCount = 0;int nMax = 10;do { n... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(598) 评论(0) 推荐(0) 编辑
摘要:在C语言中,if和switch是条件分支的重要组成部分。if的功能是计算判断条件的值,根据返回的值的不同来决定跳转到哪个部分。值为真则跳转到if语句块中,否则跳过if语句块。下面来分析一个简单的if实例:if(argc > 0){ printf("argc > 0\n");}if (argc ... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(619) 评论(0) 推荐(0) 编辑
摘要:常量是在程序中不能更改的量,在C/C++中有两种方式定义常量,一种是利用define宏定义的方式,一种是C++中新提出来的const型常变量,下面主要讨论它们之间的相关问题;define定义的常量: define是预处理指令的一种,它用来定义宏,宏只是一个简单的替换,将宏变量所对应的值替换,如下面... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(1857) 评论(0) 推荐(0) 编辑
摘要:计算机本身是不认识程序中给的变量名,不管我们以何种方式给变量命名,最终都会转化为相应的地址,编译器会生成一些符号常量并且与对应的地址相关联,以达到访问变量的目的。 变量是在内存中用来存储数据以供程序使用,变量主要有两个部分构成:变量名、变量类型,其中变量名对应了一块具体的内存地址,而变量类型则表明... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(847) 评论(0) 推荐(0) 编辑
摘要:在C/C++中数字类型主要有整数与浮点数两种类型,在32位机器中整型占4字节,浮点数分为float,double两种类型,其中float占4字节,而double占8字节。下面来说明它们在内存中的具体表现形式: 整型: 整型变量占4字节,在计算机中都是用二进制表示,整型有无符号和有符号两种形式。 ... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(4768) 评论(0) 推荐(0) 编辑
摘要:在编写应用程序时,有时需要用户选择某个文件,以供应用程序使用,比如在某些管理程序中需要打开某一个进程,这个时候需要弹出一个对话框来将文件路径以树形图的形式表示出来,以图形化的方式供用户选择文件路径,而不是需要用户自己输入文件路径。 在MFC中能够弹出对话框供用户选择文件路径的类是CFileDial... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(1605) 评论(0) 推荐(0) 编辑
摘要:Windows平台提供了丰富的控件,但是在使用中我们不会使用它提供的默认风格,有时候需要对控件进行改写,让它展现出更友好的一面,这次主要是说明三态按钮的实现。 三态按钮指的是按钮在鼠标移到按钮上时显示一种状态,鼠标在按下时展现一种状态,在鼠标移开时又展现出另外一种状态,总共三种。当然鼠标按下和移出... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(460) 评论(0) 推荐(0) 编辑
摘要:我们在使用软件的时候,有的软件允许最小化到任务栏,然后双击任务栏的图标时又会显示出来,这篇文章主要说明如何实现这种功能; 实现这种功能主要分为两步,一是将程序窗口隐藏,二是将程序图标添加到任务栏,再次显示也是分为两步:第一步是将任务栏上的图标删除,第二步是将窗口显示出来。窗口的隐藏与... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(1635) 评论(0) 推荐(0) 编辑
摘要:每次在使用MFC创建一个框架时,需要一步步选择自己的程序的外观,基本功能等选项,最后MFC会生成一个基本的程序框架,这个就是向导对话框;而属性表单则是另外一种对话框,表单上有多个属性页,每点击某一页,会显示该页的内容,最好的例子是Visual C++6.0中的Option对话框;如图... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(1087) 评论(0) 推荐(0) 编辑
摘要:对话框的伸缩功能是指当触发某一操作时只显示部分对话框的内容,再次触发时显示全部的对话框范围,就比如画图软件上的选择颜色对话框,我们可以使用系统预定义的颜色,也可以选择自定义颜色,当点击自定义的按钮时,对话框出现原先隐藏的另一边,让用户填写颜色的RGB值。 为了实现这个功能,我们需要记... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(459) 评论(0) 推荐(0) 编辑
摘要:在Windows中所有的socket函数都是阻塞类型的,也就是说只有网络中有特定的事件发生时才会返回,在没有发生事件时会一直等待,虽说我们将它们设置为非阻塞状态,但是在对于服务器段而言,肯定会一直等待客户端的消息,也就是说即使设置为非阻塞状态,时间到了函数返回,但是程序不能结束,需要... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(273) 评论(0) 推荐(0) 编辑
摘要:最近学完了简单的socket编程,发现其实socket的网络编程其实并没有什么难度,只是简单的函数调用,记住客户端与服务端的步骤,写起来基本没有什么问题。 在服务器程序的设计中,一个服务器不可能只相应一个客户端的链接,为了响应多个客户端的链接,需要使用多线程的方式,每当有一个客户端连... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(1866) 评论(0) 推荐(0) 编辑
摘要:我们知道当内存的边界正好对齐在相应机器字长边界上时,CPU的执行效率最高,为了保证效率,在VC++平台上内存对齐都是默认打开的,在32位机器上内存对齐的边界为4字节;比如看如下的代码:struct MyStruct{ int i; char c;};int _tmain(... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(386) 评论(0) 推荐(0) 编辑
摘要:最近在学习ADO与数据库的相关知识,现在我将自己学到的东西整理写出来,也算是对学习的一种复习。这篇文章主要说明如何遍历某台机器上所有的数据库服务,遍历某个服务中所有的数据库,遍历数据库中的所有表以及表中所有字段字段,最后再说明如何通过ADO操作数据库中的表。一、遍历所有数据库服务:遍历数据库服务我们... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(715) 评论(0) 推荐(0) 编辑
摘要:在封装的过程中,我们发现有很多地方有问题,比如我们在封装Windows API 的过程中,每个窗口都有各自的消息处理,而我们封装时不同的窗口要针对不同的消息而编写不同的消息处理函数,不可能所有窗口对于某些消息都进行相同的处理,所以在面向对象的程序设计中,提供了一种新的方式——继承与派生;在c++中将... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(94) 评论(0) 推荐(0) 编辑
摘要:一、Windows菜单的基本知识:1)顶级菜单:紧贴在标题栏下面的菜单称为顶级菜单,也可以叫做程序的主菜单;2)弹出式菜单:一般在顶级菜单上都有很多菜单项,单击这些菜单项时会弹出一个下拉式的菜单项,我们点击的这个菜单称为弹出式菜单3)菜单项:每一个可选菜单项被赋予一个唯一的ID,当用户单击某个菜单项... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(493) 评论(0) 推荐(0) 编辑
摘要:在实际的项目中我们可能需要这样一种类,它的对象在整个项目中只能有一个,在整个程序中只能创建一个类的对象,比如说,最常用的mp3播放软件Winamp,由于它需要独占计算机中的音频设备,因此该程序只允许自身运行唯一的一个例程。c++并没有提供这一特性,我们可以自己封装一个唯一实例的类,为了完成这个工作,... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(248) 评论(0) 推荐(0) 编辑
摘要:菜单可能是Windows提供的统一用户界面中最重要的一种方式,菜单通常在标题栏的下一行显示,这一栏叫做菜单栏,菜单栏中的每一项称之为菜单项,菜单栏中的每一个菜单项在激活时会显现一个下拉菜单(也可以说是它的子菜单),下拉菜单中也可以有多个菜单项,每个菜单项又可以有子菜单,每个菜单项都有一个唯一的数字标... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(1323) 评论(0) 推荐(0) 编辑
摘要:在8086CPU中有一个特殊的寄存器——标志寄存器,该寄存器不同于其他寄存器,普通寄存器是用来存放数据的读取整个寄存器具有一定的含义,但是标志寄存器是每一位都有固定的含义,记录在运算中产生的信息,标志寄存器的机构如下图:寄存器中的第1、3、5、 12、 13、 14 、15位在8086CPU中没有使... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(3315) 评论(0) 推荐(0) 编辑
摘要:Windows系统提供大量的控件供我们使用,但是系统提供的控件样式都是统一的,不管什么东西看久了自然会厌烦,为了使界面更加美观,添加一些新的东西我们需要自己绘制控件。控件在默认情况下并不进行自绘,如果是在窗口中利用CreateWindow创建的话要在风格中加入一个对应的自绘风格,这个一般在MSDN中... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(816) 评论(0) 推荐(0) 编辑
摘要:ListBox是Windows中的一种控件,一般被当做子窗口使用,Windows中所有子窗口都是通过发送一个通知码到父窗口父窗口通过WM_COMMAND消息接收,并在此消息中处理,并控制子窗口,ListBox自然也不例外,ListBox中有它独有的消息,通知消息,风格,查看MSDN可以看到风格主要有... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(3057) 评论(0) 推荐(0) 编辑
摘要:在编写窗口程序时主要是5个步骤,创建窗口类、注册窗口类、创建窗口、显示窗口、消息环的编写。对于这5个步骤为何要这样写,当初我不是太理解,学习到现在有些问题我基本上已经找到了答案,同时对于Windows对于窗口的管理机制有了更深的认识,下面我通过问答的方式,一一写出自己之前的疑惑。问题一、窗口类与窗口... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(229) 评论(0) 推荐(0) 编辑
摘要:学习Windows程序设计也有一些时间了,为了记录自己的学习成果,以便以后查看,我希望自己能够坚持写下一系列的学习心得,对自己学习的内容进行总结,同时与大家交流。因为刚学习所以可能有的地方写不不正确,希望大家能够指出。在学习了一定的Windows API后我决定进入到一些基础的学习,希望能够学习一些... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(272) 评论(0) 推荐(0) 编辑
摘要:COM组件是跨语言的,组件被注册到注册表中,在加载时由加载函数在注册表中查找到对应模块的路径并进行相关加载。它的存储规则如下: 1. 在注册表的HKEY_CLASSES_ROOT中以模块名的方式保存着COM模块的GUID,比如HKEY_CLASSES_ROOT\ADODB.Error... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(970) 评论(0) 推荐(0) 编辑
摘要:概述学习微软技术COM是绕不开的一道坎,最近做项目的时候发现有许多功能需要用到COM中的内容,虽然只是简单的使用COM中封装好的内容,但是许多代码仍然只知其然,不知其所以然,所以我决定从头开始好好学习一下COM基础的内容,因此在这记录下自己学习的内容,以便日后参考,也给其他朋友提供一... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(473) 评论(0) 推荐(0) 编辑
摘要:在编写驱动程序的时候,常用的一个结构是NTSTATUS,它来表示操作是否成功,但是对于失败的情况它的返回码过多,不可能记住所有的情况,应用层有一个GetLastError函数,根据这个函数的返回值可以通过错误查看器来查看具体的错误原因,但是内核中就没有这么方便了,我之前在网上找资料的... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(204) 评论(0) 推荐(0) 编辑
摘要:从NT内核开始,服务程序已经变为一种非常重要的系统进程,一般的驻守进程和普通的程序必须在桌面登录的情况下才能运行,而许多系统的基础程序必须在用户登录桌面之前就要运行起来,而利用服务,可以很方便的实现这种功能,而且服务程序一般不予用户进行交互,可以安静的在后台执行,合理的利用服务程序可... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(994) 评论(0) 推荐(0) 编辑
摘要:在上一篇的博文中,说了下老版本的线程池,在Vista之后,微软重新设计了一套线程池机制,并引入一组新的线程池API,新版线程池相对于老版本的来说,它的可控性更高,它允许程序员自己定义线程池,并规定线程池中的线程数量和其他一些属性。线程池使用线程池的使用主要需要下面的四步: 1. 创建... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(194) 评论(0) 推荐(0) 编辑
摘要:在一般的设计中,当需要一个线程时,就创建一个,但是当线程过多时可能会影响系统的整体效率,这个性能的下降主要体现在:当线程过多时在线程间来回切换需要花费时间,而频繁的创建和销毁线程也需要花费额外的机器指令,同时在某些时候极少数线程可能就可以处理大量,比如http服务器可能只需要几个线程... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(2096) 评论(0) 推荐(0) 编辑
摘要:纤程本质上也是线程,是多任务系统的一部分,纤程为一个线程准并行方式调用多个不同函数提供了一种可能,它本身可以作为一种轻量级的线程使用。它与线程在本质上没有区别,它也有上下文环境,纤程的上下文环境也是一组寄存器和调用堆栈。它是比线程更小的调度单位。注意一般我们认为线程是操作系统调用的最... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(2664) 评论(0) 推荐(1) 编辑
摘要:在Windows上创建进程是一件很容易的事,但是在管理上就不那么方便了,主要体现在下面几个方面: 1. 各个进程的地址空间是独立的,想要在进程间共享资源比较麻烦 2. 进程间可能相互依赖,在进程间需要进行同步时比较麻烦 3. 在服务器上可能会出现一个进程创建一大堆进程来共同为客户服务... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(1028) 评论(0) 推荐(0) 编辑
摘要:在写爬虫的时候,关于JavaScript的解析问题,我在网上找到的一个解决方案是使用ghost.py这个模块,他是一个基于webkit封装的一个客户端,可以用来解析动态页面。它的使用非常简单,它从2.x版本开始,变化就有点大了,在这我主要是针对他的1.0版本。 首先在GitHub上克... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(305) 评论(0) 推荐(0) 编辑
摘要:python中lxml库是一个十分强大的xml解析库,最近在看《白帽子将web扫描》这本书的时候,里面提供了一种不同于以往的用法,因此在这将这个方法记录下来 传统的lxml库的使用方法类似于下面这样:from lxml import etreetree = etree.HTML(ht... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(274) 评论(0) 推荐(0) 编辑
摘要:本文主要说明在Windows下操作文件的高级方法,比如直接读写磁盘,文件的异步操作,而文件普通的读写方式在网上可以找到一大堆资料,在这也就不再进行专门的说明。判断文件是否存在在Windows中并没有专门提供判断文件是否存在的API,替代的解决方案是使用函数GetFileAttribu... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(437) 评论(0) 推荐(0) 编辑
摘要:之前完成了一个两个平台对接的项目。由于这两个平台一个是使用json格式的数据,一个是使用xml格式的数据,要实现它们二者的对接就涉及到这两个数据格式的转化,在查阅相关资料的时候发现了这个CJSON库,cjson是使用c编写的,它轻巧易用,在网上查了相关的资料后决定在json格式的存储... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(2838) 评论(0) 推荐(0) 编辑
摘要:最近在写一个爬虫项目,本来打算用C/C++来实现,在网上查找有关资料的时候发现了微软的这个MSHTML库,最后发现在解析动态页面的时候它的表现实在是太差:在项目中需要像浏览器那样,执行JavaScript等脚本然后形成静态的HTML页面,最后才分析这个静态页面。但是MSHTML在执行... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(757) 评论(0) 推荐(0) 编辑
摘要:Windows资源是一种二进制数据,由链接器链接进程序成为程序的一部分,通过资源的方式可以很方便的对应用程序进行扩展。在Windows中资源可以是系统自定义的,也可以是用户自定义的。在VC++中资源是以被称为资源脚本的文本文件描述的(扩展名为rc),另外为了方便代码中调用资源,VC+... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(569) 评论(0) 推荐(0) 编辑
摘要:在Windows中枚举进程中的模块主要是其中加载的dll,在VC上主要有2种方式,一种是解析PE文件中导入表,从导入表中获取它将要静态加载的dll,一种是利用查询进程地址空间中的模块,根据模块的句柄来得到对应的dll,最后再补充一种利用Windows中的NATIVE API获取进程内... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(3642) 评论(1) 推荐(0) 编辑
摘要:在PE结构中最重要的就是区块表和数据目录表,上节已经说明了如何解析区块表,下面就是数据目录表,在数据目录表中一般只关心导入表,导出表和资源这几个部分,但是资源实在是太复杂了,而且在一般的病毒木马中也不会存在资源,所以在这个工具中只是简单的解析了一下导出表和导出表。这节主要说明导入表,... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(338) 评论(0) 推荐(0) 编辑
摘要:PE文件中所有节的属性都被定义在节表中,节表由一系列的IMAGE_SECTION_HEADER结构排列而成,每个结构用来描述一个节,结构的排列顺序和它们描述的节在文件中的排列顺序是一致的。 具有相同属性的数据被安排到同一个区块中。 区块表的结构为IMAGE_SECTION_HEAD... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(277) 评论(0) 推荐(0) 编辑
摘要:之前在学习PE文件格式的时候,是通过自己查看各个结构,自己一步步计算各个成员在结构中的偏移,然后在计算出其在文件中的偏移,从而找到各个结构的值,但是在使用C语言编写这个工具的时候,就比这个方便的多,只要将对应的指针类型转化为各个结构类型,就可以使用指针中的箭头来直接寻址到结构中的各个... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(1566) 评论(0) 推荐(0) 编辑
摘要:之前自己学习了PE文件的格式,后来自己写了个PE文件的解析器,这段时间工作上刚好要用到它,老板需要能查看某个exe中加载的dll的一个工具,我在使用之前自己写的这个东西的时候,发现很多东西都忘记了,所以,我在这回顾下当时的思路,并记录下来,方便以后直接使用。也算是回顾下之前学习的内容... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(664) 评论(0) 推荐(0) 编辑
摘要:本篇文章转载自小甲鱼的一篇日志,原文地址 我们知道,Windows 将程序的各种界面定义为资源,包括加速键(Accelerator)、位图(Bitmap)、光标(Cursor)、对话框(Dialog Box)、图标(Icon)、菜单(Menu)、串表(String Table)、工具... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(240) 评论(0) 推荐(0) 编辑
摘要:本文转载自小甲鱼PE文件详解系列教程原文传送门 当应用程序需要调用DLL中的函数时,会由系统将DLL中的函数映射到程序的虚拟内存中,dll中本身没有自己的栈,它是借用的应用程序的栈,这样当dll中出现类似于mov eax, [1000000]这样直接寻址的代码时,由于事先并不知道它会... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(164) 评论(0) 推荐(0) 编辑
摘要:本文转载自小甲鱼PE文件讲解系列原文传送门 这次主要说明导出表,导出表一般记录着文件中函数的地址等相关信息,供其他程序调用,常见的.exe文件中一般不存在导出表,导出表更多的是存在于dll文件中。一般在dll中保存函数名称以及它的地址,当某个程序需要调用dll中的函数时,如果这个dl... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(277) 评论(0) 推荐(0) 编辑
摘要:这篇文章转载自小甲鱼的PE文件详解系列原文传送门 之前简单提了一下节表和数据目录表,那么他们有什么区别? 其实这些东西都是人为规定的,一个数据在文件中或者在内存中的位置基本是固定的,通过数据目录表进行索引和通过节表进行索引都是可以找到的,也可以这么说,同一个数据在节表和数据目录表中都... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(1439) 评论(0) 推荐(0) 编辑
摘要:在前面几节中经常提到相对虚拟地址RVA,在这篇博客中主要说明这个概念。本来是想接着转载小甲鱼的,但是我自己根据这篇文章和他的视频来学习的时候,发现在RVA与文件的相对偏移地址进行转化的时候,那块我看不懂,不知道为什么要这样转化,而且前面很多东西都反复讲了好多遍,比如对齐的问题,所以,... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(441) 评论(0) 推荐(0) 编辑
摘要:本文转自小甲鱼的PE文件详解系列原文传送门 到此为止,小甲鱼和大家已经学了许多关于 DOS header 和 PE header 的知识。接下来就该轮到SectionTable (区块表,也成节表)。 越学越多的结构,大家可能觉得PE挺乱挺杂的哈,所以这里插播下一下必要知识的详细注释... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(390) 评论(0) 推荐(0) 编辑
摘要:本文转自小甲鱼的PE文件详解系列传送门PE文件到内存的映射在执行一个PE文件的时候,windows 并不在一开始就将整个文件读入内存的,二十采用与内存映射文件类似的机制。 也就是说,windows 装载器在装载的时候仅仅建立好虚拟地址和PE文件之间的映射关系。 当且仅当真正执行到某个... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(237) 评论(0) 推荐(0) 编辑
摘要:本文转自小甲鱼的PE文件相关教程,原文传送门 咱接着往下讲解IMAGE_OPTIONAL_HEADER32 结构定义即各个属性的作用! 接着我们来谈谈 IMAGE_OPTIONAL_HEADER 结构,正如名字的意思,这是一个可选映像头,是一个可选的结构。 但是呢,实际上上节课我们讲... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(184) 评论(0) 推荐(0) 编辑
摘要:这篇文章主要转载自小甲鱼的加密解密部分,然后补充加上我自己的少许内容,原文地址–>传送门 下面的内容主要是围绕这个图来进行 MS-DOS头部这个头部是为了兼容早期的DOS系统,PE文件的第一个字节起始于一个传统的MS-DOS头,被称为IMAGE_DOS_HEADER,这个结构体完整的... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(399) 评论(0) 推荐(0) 编辑
摘要:PE文件的全称是Portable Executable,意为可移植的可执行的文件,常见的EXE、DLL、OCX、SYS、COM都是PE文件,PE文件是微软Windows操作系统上的程序文件(可能是间接被执行,如DLL)。它是跨win32平台的,只要运行在Windows上,不管是在什么... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(968) 评论(0) 推荐(0) 编辑
摘要:我自己在看《寒江独钓》这本书的时候,书中除了给出了利用过滤的方式来拦截键盘数据之外,也提到了另外一种方法,就是hook键盘分发函数,将它替换成我们自己的,然后再自己的分发函数中获取这个数据的方式,但是书中并没有明确给出代码,我结合书中所说的一些知识加上网上找到的相关资料,自己编写了相... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(496) 评论(0) 推荐(0) 编辑
摘要:遍历系统中加载的驱动可以在R3层完成,通过几个未导出的函数:ZwOpenDirectoryObject、ZwQueryDirectoryObject,下面是具体的代码。//在这定义些基本的数据结构,这些本身是在R0层用的比较多的typedef struct _UNICODE_STRI... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(1846) 评论(0) 推荐(0) 编辑
摘要:在很早之前我根据找到的一些资料以及自己的实践总结了一篇如何将VS2015上的代码上传到GitHub上,后来我发现有小伙伴私信我,说跟我上面写的不一样,但是那段时间也比较忙,当我发现有人私信的时候差不过过了一个多月了,也就没有回复,最近重新装了系统,在重新下载相关插件时速度太慢了,实在... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(1122) 评论(0) 推荐(0) 编辑
摘要:这篇文章会持续更新,由于在驱动中,有许多常用的操作代码几乎不变,而我自己有时候长时间不用经常忘记,所以希望在这把一些常用的操作记录下来,当自己遗忘的时候,有个参考创建设备对象创建设备对象使用函数IoCreateDevice,它的参数如下:NTSTATUS IoCreateDevi... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(402) 评论(0) 推荐(0) 编辑
摘要:使用IO定时器IO定时器每隔1s就会触发一次,从而进入到定时器例程中,如果某个操作是每n秒执行一次(n为正整数)可以考虑在定时器例程中记录一个计数器大小就为n,每次进入定时器例程中时将计数器减一,当计数器为0时,表示到达n秒,这个时候可以执行操作。IO定时器只适合处理整数秒的情况 在... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(427) 评论(0) 推荐(0) 编辑
摘要:驱动程序的主要功能是用来处理IO请求,而大部分的IO请求是在派遣函数中完成的,用户模式下所有的IO请求都会被IO管理器封装为一个IRP结构,类似于Windows窗口程序中的消息,不同的IRP被发送到不同的派遣函数中处理IRP与派遣函数IRPIRP(I/O Request Packag... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(791) 评论(0) 推荐(0) 编辑
摘要:应用层对设备的同步与异步操作以WriteFile为例,一般的同步操作是调用WriteFile完成后,并不会返回,应用程序会在此处暂停,一直等到函数将数据写入文件中并正常返回,而异步操作则是调用WriteFile后会马上返回,但是操作系统有另一线程在继续执行写的操作,这段时间并不影响应... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(583) 评论(0) 推荐(0) 编辑
摘要:duilib的基本流程如上图,通过解析一个xml文件,将文件中的内容渲染为窗口界面,这个解析过程由WindowImplBase类来完成。 基本框架如下: 1. 首先在公共头文件中加入如下内容:#include #include using namespace DuiLib;#ifd... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(860) 评论(0) 推荐(0) 编辑
摘要:驱动程序运行在系统的内核地址空间,而所有进程共享这2GB的虚拟地址空间,所以绝大多数驱动程序是运行在多线程环境中,有的时候需要对程序进行同步处理,使某些操作是严格串行化的,这就要用到同步的相关内容。 异步是指两个线程各自运行互不干扰,而当某个线程运行取决与另一个线程,也就是要在线程之... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(284) 评论(0) 推荐(0) 编辑
摘要:最近在学WFP驱动框架,在使用VS2013写代码调用WFP的函数时会包含fwpmu.h这个头,但是在包含这个头的时候会报错,就像下面这个图这样: 我百度了一下,然后在这个网站上面找到了解决方案: https://social.msdn.microsoft.com/Forums/wi... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(259) 评论(0) 推荐(0) 编辑
摘要:就像题目上说的,今天在写一个例子代码时遇到了这个问题,下面是当时驱动层和应用层的代码:#include #define BASE_CODE 0x800#define CREATE_THREAD_COMMAND CTL_CODE(FILE_DEVICE_UNKNOWN, BASE_CO... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(2042) 评论(0) 推荐(0) 编辑
摘要:字符串处理在驱动中一般使用的是ANSI字符串和宽字节字符串,在驱动中我们仍然可以使用C中提供的字符串操作函数,但是在DDK中不提倡这样做,由于C函数容易导致缓冲区溢出漏洞,针对字符串的操作它提供了一组函数分别用来处理ANSI字符串和UNICODE字符串。 针对两种字符串,首先定义了它... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(1740) 评论(0) 推荐(0) 编辑
摘要:内存管理的要点内核内存是在虚拟地址空间的高2GB位置,且由所有进程所共享,进程进行切换时改变的只是进程的用户分区的内存驱动程序就像一个特殊的DLL,这个DLL被加载到内核的地址空间中,DriverEntry和AddDevice例程在系统的system进程中运行,派遣函数会运行在应用程... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(310) 评论(0) 推荐(0) 编辑
摘要:一般在写Windows内核程序的时候,经常会出现蓝屏的问题,这个时候一般是采用记录下dump文件然后用windbg查看得方式,具体的过程就不说了,网上一大堆的内容。现在我主要记录自己当初按照网上的方案出现windbg的open crashdump项呈现灰色的情况。就像下面这样 这个... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(677) 评论(0) 推荐(0) 编辑
摘要:我在编写有关JNI的代码的时候回报这个错误,我在网上搜了相关的资料后,找到了一篇文章解决了这个问题,点击这里查看这篇文章,我在照着这篇文章尝试的时候,总有一些错误,现在我把自己详细的解决流程贴出来,供大家参考。 首先在工程目录下的gradle.properties文件的末尾加上一句:... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(84) 评论(0) 推荐(0) 编辑
摘要:缓冲区溢出的根本原因是冯洛伊曼体系的计算机并不严格的区分代码段和数据段,只是简单的根据eip的指向来决定哪些是代码,所以缓冲区溢出攻击都会通过某种方式修改eip的值,让其指向恶意代码。缓冲区溢出攻击一般分为堆缓冲区溢出攻击和栈缓冲区溢出攻击栈缓冲区溢出攻击栈缓冲区溢出攻击的一般是传入... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(731) 评论(0) 推荐(0) 编辑
摘要:ret和call是另外两种转移指令,它们与jmp的主要区别是,它们还包含入栈和出栈的操作。具体的原理如下: ret操作相当于:pop ip(直接将栈顶元素赋值给ip寄存器)call s的操作相当于:push ip jmp s(先将ip的值压栈,再... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(307) 评论(0) 推荐(0) 编辑
摘要:在计算机中存储的都是二进制数,计算机将内存中的某些数当做代码,某些数当做数据。在根本上,将cs,ip寄存器所指向的内存当做代码,指令转移就是修改cs,ip寄存器的指向,汇编中提供了一种修改它们的指令——jmp。 jmp指令可以修改IP或cs和IP的值来实现指令转移,指... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(2291) 评论(0) 推荐(0) 编辑
摘要:汇编中有几种寻址方式,分别是直接寻址:(ds:[idata])、寄存器间接寻址(ds:[bx])、寄存器相对寻址(ds:[bx + idata]、ds:[bx + si])基址变址寻址(ds:[bx + si])、相对基址变址寻址([bx + si + idata])。 结构体的存储... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(707) 评论(0) 推荐(0) 编辑
摘要:汇编语言这块是我之前写在网易博客上的,不过那个账号基本已经作废了,所以现在抽个时间把当时的博客搬到CSDN上。 汇编命令(编译器masm命令):找到masm所在的文件夹,我的在d:\MASM中,用cmd打开dos界面,输入“d:”切换到D盘,再输入“d:\MASM\masm”打开编译... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(1832) 评论(0) 推荐(0) 编辑
摘要:Minfilter过滤框架优势与传统的Sfilter过滤驱动相比,有这样几个优势 1. Minfilter加载顺序更易控制,Sfilter加载是随意的,也就是说它在IO设备栈上的顺序是根据其创建的顺序决定的,越晚创建的,越排在设备栈的顶部,而Minfilter根据它的一个全局变量——... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(802) 评论(0) 推荐(0) 编辑
摘要:我是今年刚从学校毕业的一名软件工程专业的学生,过去的美好时光一直在眼前浮现,我感觉自己的大学生活很美好,生活上有好室友好同学,在以后的规划上又有一位好的人生导师,虽然现在他们在全国各地,有可能这辈子再也见不到他们,但是过去跟他们相处的很愉快,就像一句话说的:不在乎天长地久,只在乎曾今... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(366) 评论(0) 推荐(1) 编辑
摘要:上一篇博文中主要说明了驱动开发中基本的数据类型,认识这些数据类型算是驱动开发中的入门吧,这次主要说明驱动开发中最基本的模型——NTModel。介绍这个模型首先要了解R3层是如何通过应用层API进入到内核,内核又是如何将信息返回给R3,另外会介绍R3是如何直接向R0层下命令。API调用... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(350) 评论(0) 推荐(0) 编辑
摘要:最近在学习驱动编程方面的内容,在这将自己的一些心得分享出来,供大家参考,与大家共同进步,本人学习驱动主要是通过两本书——《独钓寒江 windows安全编程》 和 《windows驱动开发技术详解》。 驱动开发过程中,主要使用的C语言,虽说C中定义了许多数据类型,但是一般来说在编码上还... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(1465) 评论(0) 推荐(0) 编辑
摘要:在windows中进程只是一个容器,用于装载系统资源,它并不执行代码,它是系统资源分配的最小单元,而在进程中执行代码的是线程,线程是轻量级的进程,是代码执行的最小单位。 从系统的内核角度看,进程是一个内核对象,内核用这个对象来存储一些关于线程的信息,比如当前线程环境等等,从编程的角度... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(769) 评论(0) 推荐(0) 编辑
摘要:多任务,进程与线程的简单说明多任务的本质就是并行计算,它能够利用至少2处理器相互协调,同时计算同一个任务的不同部分,从而提高求解速度,或者求解单机无法求解的大规模问题。以前的分布式计算正是利用这点,将大规模问题分解为几个互不不相关的问题,将这些计算问题交给局域网中的其他机器计算完成,... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(368) 评论(0) 推荐(0) 编辑
摘要:操作系统中有些资源是不能由用户代码直接访问的,比如线程进程,文件等等,这些资源必须由系统级代码由RING3层进入到RING0层操作,并且返回一些标识供用户程序使用,一般调用某个函数陷入到内核,这样的函数叫做系统调用,而有些不直接陷入到内核,一般叫做系统API,linux中使用系统调用... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(460) 评论(0) 推荐(0) 编辑
摘要:为了程序的健壮性,windows 中提供了异常处理机制,称为结构化异常,异常一般分为硬件异常和软件异常,硬件异常一般是指在执行机器指令时发生的异常,比如试图向一个拥有只读保护的页面写入内容,或者是硬件的除0错误等等,而软件异常则是由程序员,调用RaiseException显示的抛出的... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(946) 评论(0) 推荐(0) 编辑
摘要:在windows平台,有一个简单的方法来追踪调用函数的堆栈,就是利用函数CaptureStackBackTrace,但是这个函数不能得到具体调用函数的名称,只能得到地址,当然我们可以通过反汇编的方式通过地址得到函数的名称,以及具体调用的反汇编代码,但是对于有的时候我们需要直接得到函数... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(900) 评论(0) 推荐(0) 编辑
摘要:最近开始慢慢接触github,现在希望将自己平时写的小程序,上传到github上,以便以后有个参考,在遇到同样问题的时候不至于想不起来怎么做而到处找别人的例子。VS 2015设置首先下载跟github相关的插件 在弹出的对话框中选择联机,在右侧的搜索栏中输入关键字,搜索,下载对应的扩... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(1517) 评论(0) 推荐(0) 编辑
摘要:在调用windows API时函数会首先对我们传入的参数进行校验,然后执行,如果出现什么情况导致函数执行出错,有的函数可以通过返回值来判断函数是否出错,比如对于返回句柄的函数如果返回NULL 或者INVALID_HANDLE_VALUE,则函数出错,对于返回指针的函数来说如果返回NU... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(568) 评论(0) 推荐(0) 编辑
摘要:最近我一个同学在项目中使用到了duilib框架,但是之前并没有接触过,他与我讨论这方面的内容,看着官方给出的精美的例子,我对这个库有了很大的兴趣,我自己也是初学这个东东,我在网上花了不少时间来找相关的资料,但是找到的不多,官方给的文档又不全面,但是我还是找到了一些博主贡献的优秀的博文... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(331) 评论(0) 推荐(0) 编辑
摘要:在C/C++中内存泄漏是一个不可避免的问题,很多新手甚至有许多老手也会犯这样的错误,下面说明一下在windows平台下如何检测内存泄漏。 在windows平台下内存泄漏检测的原理大致如下。 1. 在分配内存的同时将内存块的信息保存到相应的结构中,标识为已分配 2. 当内存释放时在结构... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(2088) 评论(0) 推荐(0) 编辑
摘要:在32位windows上只能看到最大3GB的内存空间,而且每个应用程序只能访问4GB的的内存,这个限制是windows独有的,为了使程序能够访问大于4GB的内存空间,需要使用AWE编程接口,同时需要开启PAE,让系统支持大于3GB的内存,开启PAE最大能支持128GB的内存。PAE开... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(794) 评论(0) 推荐(0) 编辑
摘要:windows堆管理是建立在虚拟内存管理的基础之上的,每个进程都有独立的4GB的虚拟地址空间,其中有2GB的属于用户区,保存的是用户程序的数据和代码,而系统在装载程序时会将这部分内存划分为4个段从低地址到高地址依次为静态存储区,代码段,堆段和栈段,其中堆的生长方向是从低地址到高地址,... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(676) 评论(0) 推荐(0) 编辑
摘要:内存管理是操作系统非常重要的部分,处理器每一次的升级都会给内存管理方式带来巨大的变化,向早期的8086cpu的分段式管理,到后来的80x86 系列的32位cpu推出的保护模式和段页式管理。在应用程序中我们无时不刻不在和内存打交道,我们总在不经意间的进行堆内存和栈内存的分配释放,所以内... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(2029) 评论(0) 推荐(0) 编辑
摘要:服务程序是windows上重要的一类程序,它们虽然不与用户进行界面交互,但是它们对于系统有着重要的意义。windows上为了管理服务程序提供了一个特别的程序:服务控制管理程序,系统上关于服务控制管理的API基本上都与这个程序打交道。下面通过对服务程序的操作来说明这些API函数获取系统... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(1534) 评论(0) 推荐(0) 编辑
摘要:面向对象的三大特性之一就是继承,继承运行我么重用基类中已经存在的内容,这样就简化了代码的编写工作。继承中有三种继承方式即:public protected private,这三种方式规定了不同的访问权限,这些权限的检查由编译器在语法检查阶段进行,不参与生成最终的机器码,所以在这里不对... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(184) 评论(0) 推荐(0) 编辑
摘要:面向对象的程序设计的三大要素之一就是多态,多态是指基类的指针指向不同的派生类,其行为不同。多态的实现主要是通过虚函数和虚表来完成,虚表保存在对象的头四个字节,要调用虚函数必须存在对象,也就是说虚函数必须作为类的成员函数来使用。 编译器为每个拥有虚函数的对象准备了一个虚函数表,表中存储... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(103) 评论(0) 推荐(0) 编辑
摘要:C++中每个类都有其构造与析构函数,它们负责对象的创建和对象的清理和回收,即使我们不写这两个,编译器也会默认为我们提供这些构造函数。下面仍然是通过反汇编的方式来说明C++中构造和析构函数是如何工作的。编译器是否真的会默认提供构造与析构函数在一般讲解C++的书籍中都会提及到当我们不为类... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(274) 评论(0) 推荐(0) 编辑
摘要:在C++中类与结构体并没有太大的区别,只是默认的成员访问权限不同,类默认权限为私有,而结构体为公有,所以在这将它们统一处理,在例子中采用类的方式。类对象在内存中的分布在类中只有数据成员占内存空间,而类的函数成员主要分布在代码段中,不占内存空间,一般对象所占的内存空间大小为sizeof... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(334) 评论(0) 推荐(0) 编辑
摘要:C语言中数组是十分重要的一种结构,数组采用的是连续存储的方式,下面通过反汇编的方式来解析编译器对数组的操作。数组作为局部变量在任意一个函数当中定义的变量都会被当做局部变量,它们的生命周期与函数的调用有关,下面是一个例子:int main(){ int nArray[5] = {... 阅读全文
posted @ 2017-10-24 20:55 masimaro 阅读(120) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示