易语言部分。。
.数据类型 IRP, , 32 结构只写了一部分
.成员 Type, 短整数型
.成员 Size, 短整数型
.成员 MdlAddress, 整数型
.成员 Flags, 整数型
.成员 AssociatedIrp, 整数型
.成员 ThreadListEntry, LIST_ENTRY
.成员 IoStatus, IO_STATUS_BLOCK
.版本 2
_Read_IRP (Irp, pIRP, 32)
_Read_Int (pIrpStack, pIRP + 96, 4)
_Read_Int (uIoControlCode, pIrpStack + 12, 4)
pIoBuffer = Irp.AssociatedIrp
_Read_Int (uInSize, pIrpStack + 8, 4)
_Read_Int (uOutSize, pIrpStack + 4, 4)
.如果 (uIoControlCode = 1024 或 uIoControlCode = 2048)
_Read_内存结构 (参数, pIoBuffer, 12)
.如果真 (uIoControlCode = 1024)
DbgPrint (“[内存读写]收到写内存指令”)
DbgPrintInt (“[内存读写]PID 0x%08X”, 参数.PID)
DbgPrintInt (“[内存读写]目标地址 0x%08X”, 参数.读写地址)
.如果 (PsLookupProcessByProcessId (参数.PID, EProcess) < 0) ' 取EProcess的地址
DbgPrint (“无法取得进程EProcess地址”)
status = #STATUS_UNSUCCESSFUL
.否则
KeStackAttachProcess (EProcess, APC) ' 把进程附加到内存里
memcpy (参数.读写地址, pIoBuffer + 12, 参数.读写长度) ' 1024 写入数据
KeUnstackDetachProcess (APC)
转的 C 。。
#pragma pack(1)
typedef struct _DEVICE_PARAS
{
ULONG PID;
PVOID Address;
ULONG Length;
BYTE Buffer[];
}DEVICE_PARAS,*PDEVICE_PARAS;
#pragma pack()
NTSTATUS status = STATUS_SUCCESS;
PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);//得到当前堆栈
//ULONG cbin = stack->Parameters.DeviceIoControl.InputBufferLength;//得到输入缓冲区大小
//ULONG cbout = stack->Parameters.DeviceIoControl.OutputBufferLength;//得到输出缓冲区大小
ULONG code = stack->Parameters.DeviceIoControl.IoControlCode;//得到IOCTL码
//局部变量
PVOID * buff;
DEVICE_PARAS para;
PEPROCESS EProcess;
KAPC_STATE apc;
if(code == 1024 || code ==2048)
{
buff = pIrp->AssociatedIrp.SystemBuffer;
memcpy(¶, buff, 12);
if (PsLookupProcessByProcessId (para.PID, &EProcess) < 0)
{
KdPrint(("无法取得进程EProcess地址! \n"));
}
else
{
KeStackAttachProcess( EProcess, &apc);
if( code == 1024)
{
memcpy ( para.Address , buff +12 , para.Length); //写
}
总是不行。。。。写入的时候 总是写入的不是想要的内容
比如我写入 02000000 可是写入地址那里显示的 XXXXXXXX 这样的一个地址。
可是我到那个地址那里看。。数据显示空
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法