逆向未知dhook.sys驱动源代码

逆向TesSafe.sys //------------------------------[IDA] => TesSafe.sys --------------------------------------//// File MD5: E780032179272AFD93BCF4A9A67C7706// Version: 0.0.6.5//----------------------------------------- 阅读详情
IRP_MJ_CREATE和IRP_MJ_CLOSE,DriverUnload例程很简单可以看写出的C代码或者是dhook.sys的驱动.
关键
IRP_MJ_DEVICE_CONTROL例程有点复杂和用户层通信.如下:
.text:000103DB ; int __stdcall sub_103DB(PDRIVER_OBJECT DeviceObject,PIRP Irp)
.text:000103DB sub_103DB proc near ; DATA XREF: start+5Eo
.text:000103DB
.text:000103DB Information = dword ptr -8
.text:000103DB ntStatus = dword ptr -4
.text:000103DB DeviceObject = dword ptr 8
.text:000103DB Irp = dword ptr 0Ch
.text:000103DB
.text:000103DB push ebp
.text:000103DC mov ebp, esp
.text:000103DE add esp, 0FFFFFFF8h
.text:000103E1 push esi
.text:000103E2 push edi
.text:000103E3 push ebx
.text:000103E4 mov [ebp+Information], 0
.text:000103EB mov [ebp+ntStatus], 0C0000001h
.text:000103F2 mov esi, [ebp+Irp]
.text:000103F5 mov eax, esi
.text:000103F7 mov eax, [eax+60h] ; IrpStack
.text:000103FA mov edi, eax
.text:000103FC mov eax, [edi+0Ch]
.text:000103FF push edi ; IrpStack
.text:00010400 cmp eax, 22E000h
.text:00010405 jnz loc_104C3
.text:00010405
.text:0001040B mov ecx, 34h
.text:00010410 cmp [edi+4], ecx
.text:00010413 jb loc_104B7
.text:00010413
.text:00010419 mov edi, [esi+0Ch] ; Irp->AssociatedIrp.SystemBuffer
.text:0001041C push edi ; VirtualAddress
.text:0001041D call MmIsAddressValid
.text:0001041D
.text:00010422 test al, al
.text:00010424 jz loc_10547
.text:00010424
.text:0001042A mov esi, [edi]
.text:0001042C movzx eax, byte ptr [edi+4]
.text:00010430 movzx edx, byte ptr [edi+5]
.text:00010434 mov VarA, eax
.text:00010439 mov VarB, edx
.text:0001043F push esi ; VirtualAddress__PUnKownData
.text:00010440 call MmIsAddressValid ; XXXXXXXXXXXXXXXXX
.text:00010440
.text:00010445 test al, al
.text:00010447 jz loc_10547
.text:00010447
.text:0001044D mov ecx, 34h
.text:00010452 push esi ; PUnKownData
.text:00010453 push edi ; inBuf
.text:00010454 rep movsb
.text:00010456 pop edi ; inBuf
.text:00010457 pop esi ; PUnKownData
.text:00010458 mov esi, [edi+24h]
.text:0001045B cmp esi, 0FFFFFFFFh
.text:0001045E jz short loc_104A1
.text:0001045E
.text:00010460 mov ebx, [edi+8]
.text:00010463 mov ebx, [ebx]
.text:00010465 mov ecx, UnKnowVariable_1
.text:0001046B mov ebx, [ecx+ebx]
.text:0001046E push ebx ; VirtualAddress
.text:0001046F call MmIsAddressValid
.text:0001046F
.text:00010474 or al, al
.text:00010476 jnz short loc_1047F
.text:00010476
.text:00010478 mov esi, 0FFFFFFFFh
.text:0001047D jmp short loc_104A1
.text:0001047D
.text:0001047F ; ---------------------------------------------------------------------------
.text:0001047F
.text:0001047F loc_1047F: ; CODE XREF: sub_103DB+9Bj
.text:0001047F mov eax, VarA
.text:00010484 mov ebx, [eax+ebx]
.text:00010487 push ebx ; VirtualAddress
.text:00010488 call MmIsAddressValid
.text:00010488
.text:0001048D or al, al
.text:0001048F jnz short loc_10498
.text:0001048F
.text:00010491 mov esi, 0FFFFFFFFh
.text:00010496 jmp short loc_104A1
.text:00010496
.text:00010498 ; ---------------------------------------------------------------------------
.text:00010498
.text:00010498 loc_10498: ; CODE XREF: sub_103DB+B4j
.text:00010498 add ebx, VarB
.text:0001049E mov esi, [ebx+esi*4]
.text:0001049E
.text:000104A1
.text:000104A1 loc_104A1: ; CODE XREF: sub_103DB+83j
.text:000104A1 ; sub_103DB+A2j
.text:000104A1 ; sub_103DB+BBj
.text:000104A1 mov [edi+30h], esi
.text:000104A4 mov [ebp+Information], 34h
.text:000104AB mov [ebp+ntStatus], 0
.text:000104B2 jmp loc_10547
.text:000104B2
.text:000104B7 ; ---------------------------------------------------------------------------
.text:000104B7
.text:000104B7 loc_104B7: ; CODE XREF: sub_103DB+38j
.text:000104B7 mov [ebp+ntStatus], 0C0000023h ; STATUS_BUFFER_TOO_SMALL
.text:000104BE jmp loc_10547
.text:000104BE
.text:000104C3 ; ---------------------------------------------------------------------------
.text:000104C3
.text:000104C3 loc_104C3: ; CODE XREF: sub_103DB+2Aj
.text:000104C3 cmp eax, 22E004h
.text:000104C8 jnz short loc_10547
.text:000104C8
.text:000104CA cmp dword ptr [edi+4], 18h
.text:000104CE jb short loc_10540
.text:000104CE
.text:000104D0 mov edi, [esi+0Ch]
.text:000104D3 push edi ; VirtualAddress
.text:000104D4 call MmIsAddressValid
.text:000104D4
.text:000104D9 test al, al
.text:000104DB jz short loc_10547
.text:000104DB
.text:000104DD mov esi, [edi]
.text:000104DF push esi ; VirtualAddress
.text:000104E0 call MmIsAddressValid
.text:000104E0
.text:000104E5 test al, al
.text:000104E7 jz short loc_10547
.text:000104E7
.text:000104E9 mov esi, [esi]
.text:000104EB push esi ; VirtualAddress
.text:000104EC call MmIsAddressValid
.text:000104EC
.text:000104F1 test al, al
.text:000104F3 jz short loc_10547
.text:000104F3
.text:000104F5 push esi
.text:000104F6 call IoThreadToProcess
.text:000104F6
.text:000104FB mov ebx, eax
.text:000104FD push ebx ; VirtualAddress
.text:000104FE call MmIsAddressValid
.text:000104FE
.text:00010503 test al, al
.text:00010505 jz short loc_10547 ; xxxxxxxxxxxxx
.text:00010505
.text:00010507 mov ecx, UnKnowVariable_2
.text:0001050D push dword ptr [ecx+esi]
.text:00010510 pop dword ptr [edi]
.text:00010512 mov ecx, UnKnowVariable_3
.text:00010518 push dword ptr [ecx+esi]
.text:0001051B pop dword ptr [edi+4]
.text:0001051E mov ecx, 10h
.text:00010523 mov esi, UnKnowVariable_4
.text:00010529 add esi, ebx
.text:0001052B add edi, 8
.text:0001052E rep movsb
.text:00010530 mov [ebp+Information], 18h
.text:00010537 mov [ebp+ntStatus], 0
.text:0001053E jmp short loc_10547
.text:0001053E
.text:00010540 ; ---------------------------------------------------------------------------
.text:00010540
.text:00010540 loc_10540: ; CODE XREF: sub_103DB+F3j
.text:00010540 mov [ebp+ntStatus], 0C0000023h
.text:00010540
.text:00010547
.text:00010547 loc_10547: ; CODE XREF: sub_103DB+49j
.text:00010547 ; sub_103DB+6Cj
.text:00010547 ; sub_103DB+D7j
.text:00010547 ; sub_103DB+E3j
.text:00010547 ; sub_103DB+EDj
.text:00010547 ; sub_103DB+100j ...
.text:00010547 pop edi ; IrpStack
.text:00010548 mov esi, [ebp+Irp]
.text:0001054B push [ebp+ntStatus]
.text:0001054E pop dword ptr [esi+18h]
.text:00010551 push [ebp+Information]
.text:00010554 pop dword ptr [esi+1Ch]
.text:00010557 push 0
.text:00010559 push [ebp+Irp]
.text:0001055C call IoCompleteRequest
.text:0001055C
.text:00010561 mov eax, [ebp+ntStatus]
.text:00010564 pop ebx
.text:00010565 pop edi
.text:00010566 pop esi
.text:00010567 leave
.text:00010568 retn 8
.text:00010568
.text:00010568 sub_103DB endp
.text:00010568




逆向出来得源代码:
里边用的数据类型很生硬,PVOID指针多处用到我都是根据寄存器和内存的长度才转化成特定的类型的.
#include <ntddk.h>
#include <ntdef.h>

#define dHook_CtlCode_A 0x22E000
#define dHook_CtlCode_B 0x22E004

VOID dHookUnloadDriver(
IN PDRIVER_OBJECT DriverObject);

NTSTATUS dHookCreateClose(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);

NTSTATUS dHookDeviceControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);

NTSYSAPI PEPROCESS NTAPI
IoThreadToProcess(
IN PETHREAD Thread
);

UNICODE_STRING DeviceNameString;
UNICODE_STRING LinkDeviceNameString;
ULONG UnKnowVariable[4];
NTSTATUS DriverEntry (IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
{
ULONG MajorVersion;
ULONG MinorVersion;
PDEVICE_OBJECT deviceObject = NULL;
NTSTATUS ntStatus=STATUS_DEVICE_CONFIGURATION_ERROR;

RtlInitUnicodeString( &DeviceNameString, L"//Device//devEnumHook2" );
RtlInitUnicodeString( &LinkDeviceNameString,L"//DosDevices//slEnumHook2");


ntStatus = IoCreateDevice(
DriverObject,
0,
&DeviceNameString,
FILE_DEVICE_DISK_FILE_SYSTEM,//8790H
FILE_DEVICE_SECURE_OPEN,
FALSE,
& deviceObject );

if (!NT_SUCCESS( ntStatus ))
{

return ntStatus;;
}

ntStatus = IoCreateSymbolicLink(
(PUNICODE_STRING) &LinkDeviceNameString,
(PUNICODE_STRING) &DeviceNameString
);

if (!NT_SUCCESS(ntStatus))
{
IoDeleteDevice(deviceObject);
return ntStatus;;
}

DriverObject->MajorFunction[IRP_MJ_CREATE] = dHookCreateClose;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = dHookCreateClose;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = dHookDeviceControl;

DriverObject->DriverUnload=dHookUnloadDriver;

PsGetVersion(&MajorVersion,&MinorVersion,NULL,NULL);

ntStatus=STATUS_SUCCESS;

if(MajorVersion!=5)
{
ntStatus=STATUS_DEVICE_CONFIGURATION_ERROR;
return ntStatus;
}

if(MinorVersion==0)
{
UnKnowVariable[0]=0x22C;//这些常量在dHook_CtlCode_B过程中调用修改Window进程结构_KPROCESS体用的.
UnKnowVariable[1]=0x124;//具体我这里也没有各个window 的内核_KPROCESS结构体详细文挡.
UnKnowVariable[2]=0x1E0;
UnKnowVariable[3]=0x1E4;
UnKnowVariable[4]=0x1FC;
}
else if(MinorVersion==1)
{
UnKnowVariable[0]=0x220;
UnKnowVariable[1]=0x130;
UnKnowVariable[2]=0x1EC;
UnKnowVariable[3]=0x1F0;
UnKnowVariable[4]=0x174;

}
else if(MinorVersion==2)
{

UnKnowVariable[0]=0x228;
UnKnowVariable[1]=0x14C;
UnKnowVariable[2]=0x1F4;
UnKnowVariable[3]=0x1F8;
UnKnowVariable[4]=0x154;

}

return ntStatus; ;

}

VOID dHookUnloadDriver(
IN PDRIVER_OBJECT DriverObject)
{

IoDeleteSymbolicLink(&LinkDeviceNameString);

IoDeleteDevice( DriverObject->DeviceObject );
}

NTSTATUS dHookCreateClose(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)

{
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest( Irp, IO_NO_INCREMENT );
return STATUS_SUCCESS;
}

NTSTATUS dHookDeviceControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)

{
PVOID PUnKownData,PUnKownData_A,PUnKownData_B;
ULONG outBufLength,inBufLength;
PIO_STACK_LOCATION IrpStack;
char VarA,VarB, VarC;
PEPROCESS peProcess;
PVOID inBuf, PInfoProcess_A,PInfoProcess_B;
int counter=0 ;
ULONG UEnd;

NTSTATUS ntStatus= STATUS_UNSUCCESSFUL;
Irp->IoStatus.Information = 0;
inBuf = Irp->AssociatedIrp.SystemBuffer;
IrpStack = IoGetCurrentIrpStackLocation( Irp );

outBufLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;//[ebp+60H+4]

switch(IrpStack->Parameters.DeviceIoControl.IoControlCode )
{
case dHook_CtlCode_A:
if(outBufLength<0x34)
{
ntStatus= STATUS_BUFFER_TOO_SMALL;
break;
}
if(!MmIsAddressValid(inBuf))
{
break;
}
PUnKownData=(PVOID)((PLONG)inBuf)[0];//I/0包中前四个字节数据类型是另一个缓冲区的(指针)虚拟地址,因为下边用传数据用. PUnKownData
VarA=(char)((PCHAR)inBuf)[4];//取出I/0包第5个字节
VarB=(char)((PCHAR)inBuf)[5];//取出I/0包第6个字节
if(!MmIsAddressValid(PUnKownData))
{
break;
}

for(counter=0;counter<=34;counter++)
{
VarC=*(((PCHAR)PUnKownData)+counter); //PUnKownData做源缓冲区地址,inBuf做目源缓冲区地址
VarC=(char)((PCHAR)inBuf)[counter];//counter=34传34个字节
}

UEnd=(ULONG)((PLONG)inBuf)[24];//传输完毕,inBuf有了新的内容.要检测是否为0XFFFFFFF;
if(UEnd==-1)//用-1做end标志.
{
(ULONG)((PULONG)inBuf)[30]=-1;//把设置-1标志做结束
Irp->IoStatus.Information=0x34;//记录I/0包传的字节数量
ntStatus=STATUS_SUCCESS;//设置成功
break;
}

PUnKownData_A=(PVOID)((PULONG)inBuf)[8]; //inBuf[8]里又是一个指针的指针:PUnKownData_A
PUnKownData_B=(PVOID)((PULONG)*(PULONG)((*(PULONG)PUnKownData_A)+UnKnowVariable[1]));//取出一个指针给PUnKownData_B
if(!MmIsAddressValid(PUnKownData_A))
{
(ULONG)((PULONG)inBuf)[30]=-1;
break;
}
PUnKownData_B=(PULONG)*((PULONG)PUnKownData_B+(ULONG)VarA); //设置缓冲区的偏移地址加VarA

if(!MmIsAddressValid(PUnKownData_B))
{
(ULONG)((PULONG)inBuf)[30]=-1;
break;
}
PUnKownData_B=(PULONG)*((PULONG)PUnKownData_B+(ULONG)VarB); //缓冲区的偏移地址加VarB
(ULONG)((PULONG)inBuf)[30]=(ULONG)*((PULONG)PUnKownData_B+(ULONG)(UEnd*0x04));//哈哈自己看吧!:=)

break;

case dHook_CtlCode_B:
if(outBufLength< 0x18)
{
ntStatus= STATUS_BUFFER_TOO_SMALL;
break;
}
if(!MmIsAddressValid(inBuf))
{
break;
}
PUnKownData=(PVOID)*((PLONG)inBuf);
if(!MmIsAddressValid(PUnKownData))
{
break;
}
PUnKownData_A=(PVOID)*(PULONG)PUnKownData;
peProcess=IoThreadToProcess((PETHREAD)PUnKownData_A);//获取进程上下文
if(!MmIsAddressValid(peProcess))
{
break;
}
PInfoProcess_A=(PULONG)peProcess+UnKnowVariable[2];//修改进程
*(PULONG)inBuf=(ULONG)*(PULONG)PInfoProcess_A;
PInfoProcess_B=(PULONG)peProcess+UnKnowVariable[3];//修改进程
((PULONG)inBuf)[1]=(ULONG)*(PULONG)PInfoProcess_B;

PInfoProcess_A=(PULONG)peProcess+UnKnowVariable[4];//修改进程
PInfoProcess_B=(PULONG)inBuf+2;
for(counter=0;counter<=0x10;counter++)
{
VarC=*((PCHAR)PInfoProcess_A+counter);
*((PCHAR)PInfoProcess_A+counter)=VarC;
}

break;
}

IoCompleteRequest( Irp, IO_NO_INCREMENT );
return ntStatus;
}

=============================================
用户把一个函数或变量的虚拟地址或指针写入I/0缓冲区.然后驱动读出里边数据,通信的数据类型可能有常量,变量,或指针.函数指针等.
方便期间各个举了个例子,用C写点.可以放在VC.60中编译通过.
[注意下面的例子仅仅是针对我上边那个IRP_MJ_DEVICE_CONTRL例程中一些各个类型访问用的]

char Data[256];
int a;
PVOID PUnKnowData;
PVOID PAdd;//定义函数指针
ULONG A=1;//偏移地址A

PUnKnowData=Data;

((PCHAR)PUnKnowData)[2]='1';//写个某个类型的常量
char c= ((PCHAR)PUnKnowData)[2];//读

((PLONG)PUnKnowData)[4]=(ULONG)&a; //写入某个变量地址
a=((PLONG)PUnKnowData)[4];//读

((PULONG)PUnKnowData)[4]=(ULONG)add;//写入某个函数地址
PAdd=(PVOID)((PULONG)PUnKnowData)[4];//读

(ULONG)(*(PULONG)PUnKnowData)=(ULONG)add;//指针方式写
PAdd=(PULONG)((ULONG)(*(PULONG)PUnKnowData));//读

(ULONG)(*((PULONG)PUnKnowData+A))=(ULONG)add; //用户把一个函数或变量的虚拟地址或指针写入I/0缓冲区任意++或--的偏移地址A中
PAdd=(PULONG)(*((PULONG)PUnKnowData+A)); //这里是驱动的读出是个反向操作. 
逆向还原exeshell一个可以给sys加花的小东西 很早的时候,在研究怎么给驱动加壳的时候,忘了从哪有了这个exeshell小工具(这个小工具好像是V大写的,我也不是很确定,希望V大不要生气呵呵)可以给sys加密,从而在一定程度上拖延了sys被人用F5虐待的时间 ,于是当时就花了几天把他给逆了,其实简单的说就是把sys文件的.text段与与0x44异或,进行简单加密。具体可以看idb的sub_4014A0函数。 关键代码: BOOL CEncrpt 阅读详情

相关推荐

新手也能看懂的Windows驱动逆向:从.sys文件到Inline Hook实战(附Python脚本)

本文详细解析Windows驱动逆向技术,从.sys文件分析到Inline Hook实战,适合新手入门。通过CTF赛题案例,介绍驱动文件结构、核心函数逆向及Python脚本实现,帮助读者掌握驱动逆向基础与高级技巧。

weixin_27722377的博客 628

逆向:Ucoresys.sys (一)

<br /> <br />刚开始练习逆向才粗学浅,大牛见之,请提点提点... ...<br /> <br />::000119A6::  55                       PUSH    EBP                             <br />::000119A7::  8BEC                     MOV     EBP, ESP                        <br />::000119A9::  8B45 08          

a294447011294447011的专栏 879

逆向一个基于驱动的恶意程序

本程序发现于机器狗变种病毒释放恶意程序的下载列表中:穿透还原系统后的机器狗病毒在机器启动后会从指定网址下载多个恶意程序,本程序即其中之一,其功能为通过底层键盘过滤方式盗取用户键盘输入信息。因程序使用了底层键盘过滤技术,故而可记录大部分软件的键盘输入,包括网游、QQ、邮箱的帐户输入信息等。 一、原理:     此程序随系统进程internat.exe启动而被执行,程序通过加载自身资源里的两个驱动来隐

2653

360安全卫士hookport.sys简单逆向

360安全卫士hookport.sys简单逆向——MyHookMgr数据结构 2009年10月23日 星期五 17:12 MyHookMgr数据结构 MyHookMgr是一个大小为0x5DDC的巨大结构,是360挂钩中的一个重要数据,它记录了挂钩函数的原地址、代理函数地址及相应函数是否挂钩的标志位。 它的数据结构是这样的: struct MyHookMgr{

lionzl的专栏 3150

初学驱动逆向,笔记二。

例子: [ \chapter09\StartIOTest ] 本例子的核心代码是HelloDDKStartIO处理过程。 初学驱动逆向,逆向函数还原代码,无壳无花,流程也很简单。 IDA反汇编代码: void __stdcall HelloDDKStartIO(_DEVICE_OBJECT *DeviceObject, _IRP *Irp) event= _KEVENT ptr -1Ch

Diomedes's Place 1043

逆向得来的WinFlash.sys的c程序

逆向得来的WinFlash.sys的c程序,因为涉及端口输入输出,所以有一部分用内镶汇编来实现。逆向 WinFlash.sys c程序在vc++6.0配置winxp DDK编译链接通过,是否与原WinFlash.sys的功能全部一致,需要自己调试。

IDA使用之旅(一)用IDA查看最简单的sys文件

转载请标明是引用于 http://blog.csdn.net/chenyujing1234  欢迎大家拍砖!   本系列内容是我根据“知其所以然论坛”博主录制的学习视频,做的笔记。 使用的IDA软件版本: IDA.pro.5.5 (参考下载地址: http://www.pc6.com/softview/SoftView_55231.html) 下载后得到IDA.pro.5.5dapr

chenyujing1234的专栏 1万+

基于STM32的家用新风系统智能控制器 | 保姆式教程 开源可复刻

本项目基于STM32F103C8T6核心控制器,完整实现了家用新风系统智能控制器的全功能开发,覆盖多传感器数据采集、双模式控制、PID调速、异常报警、掉电记忆等核心功能,全程采用保姆式无跳步教学,从硬件选型、接线、CubeMX配置、代码开发、调试排坑全流程拆解,跟着步骤一步步操作,就能顺利完成项目复刻

ZhongWeiXiang9的博客 470

某CCC-BASE的逆向

很早之前就已经分析过一遍,一直放在。今天突然又看到了,放着也是放着,索性拿出来分享一下;这里的版本是22-03-14,时间比较久了,有些可能说的不全,可能和你的分析有差别,以你的为准。

被遗弃的庸才博客 3720

“风色幻想XX:交错轨迹游戏卡顿:从解决d3dx9_xx.dll缺失开始——风色幻想XX优化指南

《风色幻想XX:交错轨迹》作为一款深受玩家喜爱的角色扮演游戏,以其丰富的剧情、独特的角色设定和精美的画面赢得了广泛的赞誉。然而,在游戏过程中,部分玩家可能会遇到游戏卡顿的问题,这不仅影响了游戏体验,还可能让玩家错失精彩的剧情和战斗瞬间。在众多导致游戏卡顿的因素中,d3dx9_xx.dll文件的缺失往往是一个不容忽视的原因。

czl922的博客 1259

Benchmark系列——基本概念和分类

本文主要介绍了Benchmark的基本概念和分类情况。

Bluetangos的博客 8444

access驱动程序_华硕ASIO2.sys驱动程序逆向分析研究

我有个朋友买了一台新PC,然后他在GPU上安装了风扇,并将其连接到GPU板上的接头连接器上,不幸的是,在Linux上设置风扇速度似乎并不容易,风扇不旋转。在Windows上,可以使用ASUS GPU Tweak II。因此,我想将其逆向分析一下了解其工作原理。https://www.asus.com/supportonly/GPUTweak%20II/HelpDesk_Download看...

weixin_39690972的博客 1377

【学习记录】IIC驱动ICM42670+卡尔曼滤波+四元数姿态角解算

ICM42670陀螺仪可以使用iic驱动,单片机平台使用GD32f305VE。

liarsup的博客 8271

【记录】逆向一个驱动然后手动调用,内核工具,skt64

本文介绍了对SKT64内核工具的逆向分析过程。作者首先通过拦截驱动加载的方式获取了被加密的.sys驱动文件,随后转向逆向分析程序本体,定位到三个进程终止函数。通过动态调试确定实际调用的KernelForceTerminateProcess2函数,并分析其通过EPROCESS结构体终止进程的机制。最后,作者编写了一个C++程序,实现了加载驱动、枚举进程并强制终止指定进程的功能,成功测试终止了Windows Defender的核心进程MsMpEng.exe。

Lan_yang_yang_gg的博客 1751

小工匠聊架构-分布式场景下的并发幂等性常见的解决方案

Pre 我们来回顾下单体时代 单体时代,应用部署在一台主机上,可以使用JVM级别的锁来控制并发请求 。 随着应用规模的不断扩大,集群化或者微服务化的分布式部署越来越普及,每个应用都是一个单独的JVM应用,所以单体时代的这种处理方式已经无法满足当前架构下的业务需求了。 JVM级别的锁已经无法满足跨进程之间访问控制了,进而演化出来了分布式锁。 分布式锁 能否解决幂等性问题? 分布式锁解决什么问题? 简言之: 解决跨进程间无法共享本地资源的问题 ,解决的是分布式场景下并发访问的问题。 为什么需要确保并发.

小工匠 2万+

fanuc机器人KAREL中 函数的应用

本次课程讲解编程的思路。很多的同学都玩过积木,一个一个的模块逐渐累积起来,通过彼此之间的相互联系,最终形成一个完整的整体。其实编程也是这样。 将一个对象根据其特点进行模块化拆分,尤其是一些特点非常相似的内容,将其变成一个模块。然后通过传递参数,实现不同的功能,这就是模块化编程。

haier123888的博客 2744

Sysinternal出品工具TcpView的驱动逆向源代码

 标 题: 【原创】Sysinternal出品工具TcpView的驱动逆向源代码作 者: vxasm时 间: 2008-07-28,22:24链 接: http://bbs.pediy.com/showthread.php?t=69543TcpView 简介 TcpViews是一款免费的端口和线程监控工具,可以列出当前所有TCP和UDP端口的进程清单,包括本地和远程地址的TCP

2048

【linux】linux 出现一个网卡绑定多个ip怎么处理

我的原因是我使用了dhcp,这个会自动分配ip, 将 BOOTPROTO 参数由 dhcp 改为 static,并移除或注释掉与动态分配地址 10.0.2.15 相关的配置行(如果存在)。执行后,您可以再次使用 ip -4 a 或 ifconfig 命令确认 IP 地址已被移除。输出可以看出,您的虚拟机(k8s003)中存在一个名为 enp0s3 的网卡绑定了多个 IPv4 地址。对于某些 Linux 发行版(如 Ubuntu、Debian),您可能需要编辑网络接口的配置文件来移除多余的 IP 地址。

九师兄 298

显卡驱动入手的构造D3DHook的方法

转载https://bbs.pediy.com/thread-195759.htm本文要点: 介绍一种从显卡驱动入手的构造D3DHook的方法,DX9,DX9EX,DX10,DX11均试用,无需重启进程,注入即可使用。以DX9为例。前置知识: 1. API Hook的基础知识 2. DX绘图知识 3. 关于DX Hook 有很多种方法,传统的方法请自行查找资料。 4. Windows Display

YuHengZuo的博客 5519

华为OD机试真题 新系统2026-04-08 Python&JS 实现【配置操作失败数量统计】

模拟一个系统的命令行配置,包含添加、修改、删除三项操作,详情如下: 添加操作命令:add_rulerule_id=1rule_index = 18 修改操作命令: mod_rule rule_id= 1rule_index = 100 删除操作命令:del_rulerule_id=1

MISAYAONE的博客 588

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Rootkit---HOOK内核驱动

当插入一个内核驱动时,一般会使用工具insmod,该工具实际上调用了系统调用init_module,在该系统调用函数中,首先调用 load_module,把用户空间传入的整个内核模块文件创建成一个内核模块,返回一个struct module结构体。内核中便以这个结构体代表这个内核模块。 init_module系统调用定义,可以看到主要是调用了load_module。 在load_module中,主要prepare_coming_module,准备将内核模块进行加载。 prepare_coming_mo

q759451733的博客 1785

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

内核层 SSDT Hook

31 30 29 28 19 18 17 16 15 6 5 4 3 2 1 0 PG CD NW AM WP NE ET TS EM MP PE 将WP位从1改为0来关闭写保护。可以通过将 ZwOpenProcess 的第二个参数改为0(访问权限为拒绝访问)来保护进程。2.在函数找SSDT表的路上jmp到新的SSDT表(360是这样的)SSDT表的物理页是只读的,想修改SSDT表需要先对寄存器进行操作。通过 SSDT Hook 保护进程。

星星我啊,已经很努力在学习了, 有人一起学习吗?Ziansec-1 376

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

DXGKRNL Hook:深度探索Windows图形驱动程序的调试利器

DXGKRNL Hook:深度探索Windows图形驱动程序的调试利器 去发现同类优质开源项目:https://gitcode.com/ 项目简介 是一个开源的工具,主要目标是为开发者提供一种便捷的方式来监控和挂钩Windows操作系统的DXGKRNL接口。DXGKRNL是DirectX图形内核子系统的核心组件,处理图形硬件的交互。通过此项目,你可以深入了解图形驱动的工作机制,并进行各种调试和性能...

gitblog_00082的博客 633

恶意软件分析实战17-内核级软件逆向Lab10-1

这是我第一次调试带有内核级代码的软件。之前调试过内核级代码但是都是自己编写的源码级调试。这是我第一次无源码逆向带有驱动的软件。 这个软件非常简单,我主要是为了学习如何调试内核级代码, 其包含了2个文件,一个是exe可执行文件还有一个是sys驱动文件。 查看下驱动文件的PE头 查看下其各节的节表, 发现其有资源节。 查看下对应的资源信息, 主要是版本信息: 查看它的导入信息,发现是从ntoskrnl.exe内部导入的三个内核函数。主要是注册表信息操作 首先把exe拖入...

輚至消亡 767

写一篇Hook Driver.

关于Hook,有一本书讲的比较清楚,最近刚刚看完,《Rootkits: Subverting the Windows Kernel》 http://www.amazon.com/Rootkits-Subverting-Windows-Greg-Hoglund/dp/0321294319 总结下来,Hook的方法有以下几种: 1.修改各种table,IAT/IDT/SSDT 涉及到...

350
上一篇: icesword 驱动部分分析 by wuyanfeng
下一篇: Windows Native Debugging Internals
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值