天书夜读里面可以找到C语音对应的汇编程序
for循环
一般是 mov dword ptr [i],0
jmp xxxxxxh
imul一般会联系到结构体数组,是一个特征
X386 CPU使用的堆栈方式是递减堆栈(DecendingStack):当堆栈由高地址向低地址生成时,称为递减堆栈。
Fulldescending 满递减堆栈 : 堆栈首部是高地址,堆栈向低地址增长。栈指针总是指向堆栈最后一个元素(最后一个元素是最后压入的数据)。
push esp -4
pop esp+4
call esp - 4
ret esp + 4 (ret n???)
数据传送指令
mov 指令 不能使用寄存器加减法,所以有lea edi, [ebp-0cch],但不能使用mov edi, ebp - 0cch;两者似乎是相等(mov这样用会出错)
xor 异或 xor eax, eax 清零 = mov eax, 0
lea 取地址操作
lea edi, [ebp-0cch] 后 edi = ebp - 0cch
方括号表示存储器
stos:串存储指令 将eax中的数据放到edi所指的地址中,同时edi会自增4字节 rep重复ecx中次数
mov ecx,30h
mov eax,0cccccccch
rep stos dword ptr es:[edi]
这段代码的作用是堆栈中的30h*4字节初始化为cch,也就是int 3指令,如果发生执行堆栈地址就立刻会中断
stosd 4字节,stosb 1字节, stosw 2字节
跳转指令
jmp 无条件跳转
jg 大于是跳转,通常前面有一条比较指令
jl 小于跳转
jge 大于等于跳转
比较指令
cmp 比较指令 之后往往是jg jl jge等
c调用方式:
_cdecl
1 保存ebp.ebp保存这个函数执行之前的esp。执行完毕我们用ebp恢复esp,先把ebp压栈,返回之前弹出
2 保存esp到ebp中
push ebp
mov ebp, esp
此时ebp和esp都指向这次函数调用时栈顶
3 在堆栈中腾出一个区域保存局部变量,局部变量保存在栈空间
4 保存ebx esi edi 到堆栈中,调用完毕后恢复
sub esp, 0cch
push ebx
push esi
push edi
5 把局部区域初始化cch(int 3)
lea edi, [ebp - 0cch]
mov ecx, 33h
mov eax, 0cccccccch
rep stos dword ptr[edi]
6 做参数该做的事情
ebp+12 是第二个参数
ebp+8是第一个参数
ebp+4要返回的地址
7 恢复edi,esi,ebx,esp ebp
push edi
push esi
push ebx
mov esp, ebp
pop ebp
ret
-------------------------------------------
驱动程序和系统其他组件之间的交互是通过给设备发送或者接受发送给设备的请求来交互的。
也就是说,一个没有任何设备的驱动是不能按照规范方式和系统交互的,当然也不会受到任何IRP请求,分发函数也就失去了意义
但这样的驱动程序是存在的。例如一个驱动程序只是Hook某些内核函数或者做其他的一些小动作,则可以不生成任何设备,也不用设置分发函数
如果驱动程序要和应用程序之间通信,则必须生成设备,此外还必须为设备生成应用程序可以访问的符号链接。
创建设备API
IoCreateDevice创建的设备,必须拥有管理员权限的用户才能使用
IoCreateDeviceSecure,普通用户也可以使用
驱动程序创建的线程始终在System进程中
在windows中,不同类型设备驱动有不同的安装方式,这些方式被写成一个脚本,也就是inf文件,但是对于完全“非任何类型”的驱动程序,可以简单的当做一个服务安装;但是由于有现成的工具“服务安装卸载工具”,检索这个可以找到该软件。安装驱动程序后输入下面命令
net stgart 服务名
for循环
一般是 mov dword ptr [i],0
jmp xxxxxxh
imul一般会联系到结构体数组,是一个特征
X386 CPU使用的堆栈方式是递减堆栈(DecendingStack):当堆栈由高地址向低地址生成时,称为递减堆栈。
Fulldescending 满递减堆栈 : 堆栈首部是高地址,堆栈向低地址增长。栈指针总是指向堆栈最后一个元素(最后一个元素是最后压入的数据)。
push esp -4
pop esp+4
call esp - 4
ret esp + 4 (ret n???)
数据传送指令
mov 指令 不能使用寄存器加减法,所以有lea edi, [ebp-0cch],但不能使用mov edi, ebp - 0cch;两者似乎是相等(mov这样用会出错)
xor 异或 xor eax, eax 清零 = mov eax, 0
lea 取地址操作
lea edi, [ebp-0cch] 后 edi = ebp - 0cch
方括号表示存储器
stos:串存储指令 将eax中的数据放到edi所指的地址中,同时edi会自增4字节 rep重复ecx中次数
mov ecx,30h
mov eax,0cccccccch
rep stos dword ptr es:[edi]
这段代码的作用是堆栈中的30h*4字节初始化为cch,也就是int 3指令,如果发生执行堆栈地址就立刻会中断
stosd 4字节,stosb 1字节, stosw 2字节
跳转指令
jmp 无条件跳转
jg 大于是跳转,通常前面有一条比较指令
jl 小于跳转
jge 大于等于跳转
比较指令
cmp 比较指令 之后往往是jg jl jge等
c调用方式:
_cdecl
1 保存ebp.ebp保存这个函数执行之前的esp。执行完毕我们用ebp恢复esp,先把ebp压栈,返回之前弹出
2 保存esp到ebp中
push ebp
mov ebp, esp
此时ebp和esp都指向这次函数调用时栈顶
3 在堆栈中腾出一个区域保存局部变量,局部变量保存在栈空间
4 保存ebx esi edi 到堆栈中,调用完毕后恢复
sub esp, 0cch
push ebx
push esi
push edi
5 把局部区域初始化cch(int 3)
lea edi, [ebp - 0cch]
mov ecx, 33h
mov eax, 0cccccccch
rep stos dword ptr[edi]
6 做参数该做的事情
ebp+12 是第二个参数
ebp+8是第一个参数
ebp+4要返回的地址
7 恢复edi,esi,ebx,esp ebp
push edi
push esi
push ebx
mov esp, ebp
pop ebp
ret
-------------------------------------------
驱动程序和系统其他组件之间的交互是通过给设备发送或者接受发送给设备的请求来交互的。
也就是说,一个没有任何设备的驱动是不能按照规范方式和系统交互的,当然也不会受到任何IRP请求,分发函数也就失去了意义
但这样的驱动程序是存在的。例如一个驱动程序只是Hook某些内核函数或者做其他的一些小动作,则可以不生成任何设备,也不用设置分发函数
如果驱动程序要和应用程序之间通信,则必须生成设备,此外还必须为设备生成应用程序可以访问的符号链接。
创建设备API
IoCreateDevice创建的设备,必须拥有管理员权限的用户才能使用
IoCreateDeviceSecure,普通用户也可以使用
驱动程序创建的线程始终在System进程中
在windows中,不同类型设备驱动有不同的安装方式,这些方式被写成一个脚本,也就是inf文件,但是对于完全“非任何类型”的驱动程序,可以简单的当做一个服务安装;但是由于有现成的工具“服务安装卸载工具”,检索这个可以找到该软件。安装驱动程序后输入下面命令
net stgart 服务名