【汇编、逆向、Windows内核、驱动开发】
老子横刀向天笑
我是学习c#网络安全开发的,我也非常热爱这一行业,有兴趣的可以加我为好友,qq773173224.
展开
-
如何在堆栈中分配4个4字节的长整形的空间
其实没必要4次push,只需把esp减去4*4就行了,同样也可以用add指令来恢复esp。原创 2021-04-27 18:12:05 · 225 阅读 · 0 评论 -
CALL和JMP的区别
call会把他的下一条指令的地址压入堆栈,然后跳转到他调用的开始处,同时ret会自动弹出返回地址。JMP只是简单的跳转call的本质相当于push+jmp ret的本质相当于pop+jmp原创 2021-04-27 18:11:33 · 2231 阅读 · 0 评论 -
PUSH和POP
push把一个32位数压入堆栈中。这个操作导致esp被减4.esp被形象的称为栈顶,最开始esp的值是最大的。顶部是地址小的区域,压入栈的数据越多,这个堆栈的也就越堆越高,esp也就越来越小。在32位平台上,esp每次减少4(字节)。pop 一个数据出栈,esp被加4.pop的参数一般是一个寄存器,栈顶的数据被弹出到这个寄存器中。...原创 2021-04-27 18:10:55 · 1070 阅读 · 0 评论 -
汇编指令大全
【各种通用的跳转指令】JE 等于就跳转,与CMP指令合用JAE 大于或等于时跳转,与CMP指令合用(Jump if above or equal)JB 小与就跳转,与CMP指令合用JBE 小于等于就跳转,与CMP指令合用JC 错误就跳转JNC 正确就跳转(Jump if not carry)JMP 无条件跳转ADD 加法指令ORG 是指把机器指令装在到内存中的某个地址中去INT 软件中断指令或函数调用HLT 让CPU进入待机状态JL 小于JLE 小于等于INC 自加...原创 2021-04-27 18:10:24 · 568 阅读 · 0 评论 -
ESP和EBP 栈顶指针和栈底指针
1)ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。(2)EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。【本次重点内容:了解几个常见的寄存器名字,记住eax一般用来保存函数的返回值,记住esp是栈顶指针寄存器,ebp是栈底指针寄存器。】ESP 中的指针将一直指向这个新位置, 所以 ESP 中的地址数据是动态的....原创 2021-04-27 18:09:52 · 3622 阅读 · 0 评论 -
有效地址传送指令LEA
将源操作数给出的有效地址传送到指定的的寄存器中.LEA DX,BETA[BX+SI]原创 2021-04-27 18:09:20 · 292 阅读 · 0 评论 -
几个常用寄存器
4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI)2个指针寄存器(ESP和EBP)原创 2021-04-27 18:08:49 · 720 阅读 · 0 评论 -
NDIS函数大全手册
无连接微端口的上层函数DriverEntry 由操作系统调用来激活和初始化微端口驱动程序MiniportAllocateComple 调用它来指示以前调用的NdisMAllocateMemoryAsync已经完成MiniportCheckForHang 检查NIC的内部状态MiniportDisableInterrupt 禁止NIC产生中断MiniportEnableInterrupt 允许NIC产生中断MiniportHalt 重新分配和重新注册NIC占用的资源并且终止NIC以使.原创 2021-04-27 18:07:53 · 734 阅读 · 0 评论 -
PHYSICAL_ADDRESS
这是我查找DDK的 ntdef.h 文件找到PHYSICAL_ADDRESS的定义:..............................................typedef union _LARGE_INTEGER { struct { ULONG LowPart; LONG HighPart; }; struct { ULONG LowPart; LONG HighPart; } ...原创 2021-04-27 18:07:08 · 467 阅读 · 0 评论 -
#PRAGMA NDIS_INIT_FUNCTION(DRIVERENTRY)
/*——————————————————————————————————————用NDIS_INIT_FUNCTION宏标识DriverEntry函数只运行一次*/#pragma NDIS_INIT_FUNCTION(DriverEntry)原创 2021-04-27 18:06:09 · 134 阅读 · 0 评论 -
#PRAGMA HDRSTOP
#pragma hdrstop表示预编译头文件到此为止,后面的头文件不进行预编译。BCB可以预编译头文件以加快链接的速度,但如果所有头文件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文件。...原创 2021-04-23 09:53:08 · 266 阅读 · 0 评论 -
#PRAGMA
在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。...原创 2021-04-23 09:52:37 · 63 阅读 · 0 评论 -
EXTERN
extern可以用来引用一个已经定义过的全局变量,如在一个文件想用到在另一文件中定义的全局变量可用extern原创 2021-04-23 09:52:04 · 87 阅读 · 0 评论 -
键盘过滤驱动之IRP劫持
参考资料:[1] 《Rootkits——Windows内核的安全与防护》[2]让一切输入都难逃法眼(驱动级键盘过滤钩子)本文主要介绍通过劫持IRP(IRP_MJ_READ)实现键盘过滤驱动的基本方法。算是学习总结吧。这里简单地列举了几个需要注意的地方:[1] 由于需要动态卸载驱动程序,所以要挂接KeyboardClass0。[2] 键盘过滤驱动工作在异步模式。为了得到一个按键操作,首先会发送一个IRP(IRP_MJ_READ)到驱动的设备栈,键盘物理驱动收到这个IRP后会一直保持为pend.原创 2021-04-23 09:51:28 · 627 阅读 · 1 评论 -
初学驱动开发书籍介绍
Windows NT Device Driver Development初学驱动开发书籍介绍一、总述........................................................................................................................21.1分类..........................................................................原创 2021-04-23 09:48:03 · 1644 阅读 · 1 评论 -
驱动和应用层的异步通信
标 题:【原创】[成果3.6]驱动和应用层的异步通信作 者:sislcb时 间:2008-01-28,11:13:28链 接:http://bbs.pediy.com/showthread.php?t=59015这里来简单的讲解下驱动和应用层的异步通信,上次我写了驱动和应用层的三种基本通信方法,但是那三种方法都是通过同步的方法来实现的,就是说,在应用层向驱动层发送消息后,就堵死在那里等待驱动层的返回了,而异步的概念就是,应用层向驱动发送消息后,就马上返回了,而在驱动层的消息触发后,再将该消息...原创 2021-04-23 09:45:18 · 297 阅读 · 0 评论 -
驱动和应用层的三种通信方式
驱动程序和客户应用程序经常需要进行数据交换,但我们知道驱动程序和客户应用程序可能不在同一个地址空间,因此操作系统必须解决两者之间的数据交换。驱动层和应用层通信,主要是靠DeviceIoControl函数,下面是该函数的原型:BOOLDeviceIoControl(HANDLEhDevice,//设备句柄DWORDdwIoControlCode,//IOCTL请求操作代码LPVOIDlpInBuffer,//输入缓冲区地址DWORDnInBufferSize,//...原创 2021-04-23 09:44:43 · 1113 阅读 · 0 评论 -
INF文件的编写
这部分主要讲解inf文件的编写,其实inf文件不仅仅可以用来做为安装驱动使用,还有很多其他用法,这里就不涉及了,先讲下inf的语法,这些语法都是google上有的。inf文件其实是一种纯文本文件,可以用任意一款文本编辑软件来打开进行编辑。inf是不区分大小写的。inf中包含各节的含义:1、Version节每一个INF文件都包含一个这样的节,该节中的条目主要是描述此INF文件支持的设备类型和适用的操作系统。在该节中如果出现"signature="$CHICAGO$""这样的条目则表示该INF文...原创 2021-04-23 09:44:07 · 1236 阅读 · 0 评论 -
IRP_MJ_INTERNAL_DEVICE_CONTROL
什么时候发送这个请求:Any time after the successful completion of a create request.(任何时候完成了一个请求的创建)作用:This I/O control code has been defined for communication between paired and layered kernel-mode drivers, such as one or more class drivers layered over a po.原创 2021-04-23 09:43:31 · 586 阅读 · 0 评论 -
TYPEDEF + STRUCT + 指针
c语言规范,定义结构体:typedefstructANSWER_HEADER{u8u8Type;u8u8Code;u32u32TimeStamp;structANSWER_HEADER *pNext;}ANSWER_HEADER_T, *PANSWER_HEADER_T;ANSWER_HEADER为结构名,这个名字主要是为了在结构体中包含自己为成员变量的时候有用ANSWER_HEADER_T为structANSWER_HEADER的别名PA...原创 2021-04-23 09:42:54 · 217 阅读 · 0 评论 -
位运算妙用 逻辑与之判断奇偶数
//判断奇数偶数 用一个数与00000001逻辑与运算,结果为1的是奇数,0是偶数 static void bb() { qq: Console.WriteLine("请输入一个数字:"); int aa = 0; string ss = Console.ReadLine(); if (!int.TryParse(ss, out aa)) { ..原创 2021-04-22 11:52:52 · 330 阅读 · 0 评论 -
位运算妙用 逻辑与之循环序列获取
构建循环队列数组下标的控制(应该填的是实现当数组下标大于某个值的时候再次恢复到0), * 标准的答案只有一个,就是i%n。熟悉位运算的同学知道,这里填i&n是完全可以的。 * 比如i%7,可以实现的序列是0,1,2,3,4,5,6,7,0,1,2,3,4……。 * 但是现在来看一下位运算,7的八位二进制表示是00000111,将一个数与其做按位与 * 则高位全变...原创 2021-04-22 11:52:04 · 145 阅读 · 0 评论 -
MESSAGEBOXEXA
该函数创建、显示、和操作一个消息框。消息框含有一个应用程序定义的消息和标题,加上预定义目标与push(下推)按钮的任何组合。wLanguageld参数指定哪一个语言资源集被用于预定义的下推按钮。有关MessageBoxEX函数其他参数的完整描述,请参见MessageBoxEx函数。函数原型:int MessageBoxEx (HWND hWnd,LPCTSTR lpText, LPCTSTR IpCaption, UINT UType, WORD wLanguageld);参数:hWnd:标识将原创 2021-04-22 11:50:31 · 334 阅读 · 0 评论 -
软件逆向学习,RET指令去除NAG
面是逆向一个程序的部分代码::0046B45A B8E0B44600 mov eax, 0046B4E0:0046B45F E83C90FFFF call 004644A0 //这句运行后便出现Nag进入那个产生Nag的call,便到了这里:* Referenced by a CALL at Address:|:0046B45F|:004644A0 55 push ebp...原创 2021-04-22 11:50:04 · 188 阅读 · 0 评论 -
GETWINDOWTEXTA
GetWindowTextA(HWNDhWnd, //控件的句柄LPSTRlpString, //拷贝字符的缓冲区intnMaxCount); //拷贝的长度该API可以根据句柄获取窗口标题,另外在破解的时候,好比如说,破解用户登录,在登录的时候程序会获取用户输入的用户名密码,程序在反汇编之后,你会发现,在系统底层获取用户输入的函数就是这个函数,所以在破解登录的时候你只需要监控这个函数就可以了。...原创 2021-04-22 11:49:07 · 941 阅读 · 0 评论 -
DIALOGBOXPARAMA
nt DialogBoxParamA(HINSTANCE hInstance,LPCTSTR IpTemplateName,HWND hWndParent, DLGPROC IPDialogFunc,LPARAM dwlnitParam);hlnstance:标识一个模块的事例,该模块的可执行文件含有对话框模板。IpTemplateName:标识对话框模板。此参数可以指向一个以NULL结尾的字符串的指针,该字符串指定对话框模扳名,或是指定对话框模板的资源标识符的一个整型值。如果此参数指定了一个资源标原创 2021-04-22 11:48:30 · 338 阅读 · 0 评论 -
寄存器
首先介绍我们会经常看到的一些寄存器:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI)2个指针寄存器(ESP和EBP)4个数据寄存器(EAX、EBX、ECX和EDX):32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。对低16位数据的存取,不会影响高16位的数据。这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH原创 2021-04-22 11:47:59 · 508 阅读 · 0 评论 -
GETDLGITEM
API原型:HWND GetDlgItem( HWND hDlg, // handle to dialog box int nIDDlgItem // control identifier );假如一个窗口中有多个子窗口,该API的作用就是返回这个窗口的子窗口的句柄。比如说,一个窗口中有一个状态栏,要获取状态栏的额句柄,首先传入第一个参数父窗口句柄,再传入第二个参数状态栏ID,...原创 2021-04-22 11:47:06 · 708 阅读 · 0 评论 -
OLLYDBG使用笔记
F2 断点 F3载入程序 F4运行到光标处 F7单步步入 F8单步步过 F9运行Ctrl+F2重新载入分号: 写注释Ctrl+G 查询表达式CTRL+F9返回到被调用之前的位置点击窗口上的B跳到断点窗口点击C跳到CPU窗口void A(a,b,c);//将函数参数从左往右推入栈中push cpush bpush a然后再调函数地址Call A修改字符串时,后面要加00,字符串默认是以00结尾的获取文本框的内容的API:GetDlgItemTextA ...原创 2021-04-22 11:46:21 · 1094 阅读 · 0 评论 -
OLLYDBG快捷键记录帖
OllyDbg 主线程窗口:1. 汇编代码对应的地址窗口2. 汇编代码对应的十六进制机器码窗口3. 反汇编窗口4. 反汇编代码对应的注释信息窗口5. 寄存器信息窗口6. 当前执行到的反汇编代码的信息窗口7~9. 数据所在的内存地址,十六进制,ASCII码10~12.栈地址,存放的数据,对应说明信息OD基本快捷键及功能:F2下断点,也就是指定断点的地址F3加载一个可执行程序,进行调试分析F4程序执行到光标处F5缩小、还原当前窗口F7单步步入F8单步步过...原创 2021-04-22 11:39:34 · 572 阅读 · 0 评论 -
关于调用约定
#ifdef__cplusplusextern"C"{#endif#include<NTDDK.h>#ifdef__cplusplus}#endif从上面可以看出,在包含NTDDK.h这个头文件的时候用了extern"C",是因为C++和C语言的编译器的编译后的函数符号不一致,可能会导致链接错误。下面详细说明:各种调用约定:C语言调用约定__cdecl调用者清除堆栈,会在call后addesp,***标准调用约定__std...原创 2021-04-21 14:34:28 · 163 阅读 · 0 评论 -
利用API函数加载系统服务以加载驱动
利用API函数加载系统服务以加载驱动基础知识:一个服务由三部分组成,第一部分是ServiceControlManager(SCM)。每个WindowsNT/2000系统都有一个SCM,SCM存在于Service.exe中,在Windows启动的时候会自动运行,伴随着操作系统的启动和关闭而产生和终止。这个进程以系统特权运行,并且提供一个统一的、安全的手段去控制服务。它其实是一个RPCServer,因此我们可以远程安装和管理服务,不过这不在本文讨论的范围之内。SCM包含一个储存着已安装的服...原创 2021-04-21 14:33:56 · 772 阅读 · 0 评论 -
获取设备扩展指针
pDeviceExtension=(PDEVICE_EXTENSION)pDeviceObject->DeviceExtension;注意:DeviceExtension本来的类型是PVOID,所以要强制转换原创 2021-04-21 14:33:25 · 143 阅读 · 0 评论 -
创建设备的符号链接
在NT式驱动中,设备都有一个符号链接,供ring0层找到指定设备。ntStatus=IoCreateSymbolicLink(&szSymLinkName,//IN设备符号链接名称&szDeviceName);//IN设备名称if(!NT_SUCCESS(ntStatus)){KdPrint(("IoCreateSymbolicLinkFailed..."));//删除设备对象,注意:设备符号链接创建失败就吧驱动对象删除了吧,避免很多问题IoDe...原创 2021-04-21 14:32:51 · 169 阅读 · 0 评论 -
IOMARKIRPPENDING函数
IoMarkIrpPendingIoMarkIrpPending例程用于标记指定的IRP,标志着某个驱动的分发例程(分发函数)因需要被其他的驱动程序进一步处理最终返回STATUS_PENDING状态。VOID IoMarkIrpPending( IN OUT PIRPIrp);参数:Irp 将被标记为Pending状态的IRP指针。返回值: 无Comments:...原创 2021-04-21 14:32:21 · 256 阅读 · 0 评论 -
KEINITIALIZEEVENT、KEINITIALIZESEMAPHORE、KEINITIALIZEMUTEX
/////////////////////////////////////////////////////////////////////////////// 内核模式下事件对象 VOID KeInitializeEvent( INPRKEVENTEvent,//这个参数是初始化事件对象的指针 INEVENT_TYPEType,//这个参数是时间的类型。事件的类型分为两类,一类是"通知事...原创 2021-04-21 14:31:50 · 303 阅读 · 0 评论 -
KEINITIALIZEEVENT内核模式下事件对象
内核模式下事件对象VOIDKeInitializeEvent(IN PRKEVENT Event, // 这个参数是初始化事件对象的指针IN EVENT_TYPE Type, // 这个参数是事件的类型。一类是“通知事件”对应参数为 NotificationEvent。另一类是“同步事件”,对应参数 SynchronizationEventIN BOOLEAN State // TRUE:事件对象初始化状态为激发。FALSE:事件对象初始化状态为未激发);解释1...原创 2021-04-21 14:31:16 · 664 阅读 · 0 评论 -
KEINITIALIZESPINLOCK
KeInitializespinlock()初始化一个自旋锁,你可以在一小段时间(25us)内不让其他程序访问你的自旋锁直到你解锁。原创 2021-04-21 14:30:35 · 177 阅读 · 0 评论 -
NDISZEROMEMORY用法
void NdisZeroMemory( PVOID Destination, SIZE_T Length);用0来填充一块内存区域。Destination :指向一块准备用0来填充的内存区域的开始地址。Length :准备用0来填充的内存区域的大小,按字节来计算。例如:NdisZeroMemory( pTDIH_DeviceExtension, sizeof( TDIH_DeviceExtension ) );...原创 2021-04-21 14:29:58 · 138 阅读 · 0 评论 -
IO_STACK_LOCATION
IO_STACK_LOCATION结构定义了一个I / O堆栈的位置,这是一个I / O栈的入口并且与每一个IRP关联着,。每个I / O堆栈的位置在一个IRP一些常见的成员和一些request-type-specific成员。MEMBERS MajorFunction TheIRP major function codeindicating the type of I/O operation to be performed. MinorFunction...原创 2021-04-21 14:29:06 · 293 阅读 · 0 评论