SERVICE_BOOT_START 驱动程序逆向

Windows可信本地计算中枢:从联网入口到离线智能终端的演进 桌面操作系统正经历从‘互联网入口’向‘可信本地计算中枢’的根本性转变。这一演进源于网络基础设施成熟后用户对连接可靠性的新诉求,驱动系统级架构重构:通过Network-Aware应用生命周期管理实现默认离线优先,依托Pluton安全处理器与硬件隔离模型构建端到端可信执行环境,并借ARM能效重构与NPU原生支持释放边缘AI潜力。技术价值体现在资源调度更精准、安全边界更内聚、隐私控制更自主;典型场景覆盖工业实时仿真、医疗影像本地推理、教育离线AI助教等强数据主权需求领域。Windows未来已不再由云端服务数量定义 阅读详情
  今天发现了 syser debugger  的 SDbgMsg.sys。 这个驱动程序就是SERVICE_BOOT_START  类型的驱动程序, 在windows 启动后最新给出提示信息 "Press "ESC" to Cancel Load Syser Boot  Module ",我想看看到底是怎样编程实现的:


打开 IDA 载入 SDbgMsg.sys 程序, 反汇编代码如下:


; int __stdcall start(PDEVICE_OBJECT DeviceObject)
public start
start           proc near

SymbolicLinkName    = UNICODE_STRING ptr -18h
DeviceName              = UNICODE_STRING ptr -10h
SystemRoutineName = UNICODE_STRING ptr -8
DeviceObject             = dword ptr  8       

.text:00010850 push    ebp             
.text:00010851 mov     ebp, esp                  ; 打开栈帧

 

.text:00010853 sub       esp, 18h
.text:00010856 push     ebx
.text:00010857 push     esi
.text:00010858 mov      esi, [ebp+DeviceObject]
.text:0001085B push    edi
.text:0001085C push    1Bh
.text:0001085E lea       edx, [esi+38h]
.text:00010861 pop      ecx                         ; 给ecx赋值 1Bh
.text:00010862 mov     eax, offset loc_10428
.text:00010867 mov     edi, edx
.text:00010869 rep stosd

上面的反汇编代码可能有问题, DeviceObject 应该是 DirverObject。如果是 DeviceObject ,那偏移 38H 位置是
DeviceObject->Queue.Blink 或者是 DeviceObject->Queue.Wcb.WaitQueueEntry.Blink 。我想不出 DeviceObject 的这些成员怎么使用。一般情况下程序开始时就是设置 Dispatch 例程, 而 DriverObject 的 Dispatch 例程就是在 38H 偏移位置, 所以我可以认为这里的 DeviceObject 就是 DriverObject。
可见 loc_10428 例程就是通用的派遣例程.

下面是DeviceObject 的偏移为38H 位置的结构图
       下面是 DriverObject 偏移为 38H 位置的结构图


.text:0001086B mov     edi, ds:RtlInitUnicodeString
.text:00010871 push    offset aDeviceSyserdbg ;          "
//Device//SyserDbgMsg"
.text:00010876 lea       eax, [ebp+DeviceName]
.text:00010879 push    eax             ; DestinationString

; 设置 DirverObject->DriverUnload = sub_10702
.text:0001087A mov     dword ptr [esi+34h], offset sub_10702

; 设置 DirverObject->MajorFunction[IRP_MJ_CREATE] = loc_103DC
.text:00010881 mov     dword ptr [edx], offset loc_103DC    

; 设置 DirverObject->MajorFunction[IRP_MJ_READ] = sub_10646
.text:00010887 mov     dword ptr [esi+44h], offset sub_10646

; 设置 DirverObject->MajorFunction[IRP_MJ_CLOSE] = loc_103F8
.text:0001088E mov     dword ptr [esi+40h], offset loc_103F8

; 设置 DirverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = loc_10442
.text:00010895 mov     dword ptr [esi+70h], offset loc_10442

.text:0001089C call    edi ; RtlInitUnicodeString

.text:0001089E                 lea       eax, [ebp+DeviceObject]
.text:000108A1                 push    eax             ; DeviceObject
.text:000108A2                 xor      ebx, ebx
.text:000108A4                 push    ebx             ; Exclusive
.text:000108A5                 push    ebx             ; DeviceCharacteristics
.text:000108A6                 push    22h             ; DeviceType
.text:000108A8                 lea       eax, [ebp+DeviceName]
.text:000108AB                 push    eax             ; DeviceName
.text:000108AC                 push    ebx             ; DeviceExtensionSize
.text:000108AD                 push    esi             ; DriverObject
.text:000108AE                 call     ds:IoCreateDevice


.text:000108B4                 test      eax, eax
.text:000108B6                 jl          short loc_108E6
.text:000108B8                 mov      eax, 2000h
.text:000108BD                 push    eax             ; BugCheckParameter1
.text:000108BE                 mov     dword_1221C, eax
.text:000108C3                 mov     dword_12220, ebx
.text:000108C9                 call      sub_10FD6
.text:000108CE                 cmp     eax, ebx
.text:000108D0                 pop      ecx
.text:000108D1                 mov     dword_12224, eax
.text:000108D6                 jnz       short loc_108F0
.text:000108D8                 push    [ebp+DeviceObject] ; DeviceObject
.text:000108DB                 call     ds:IoDeleteDevice

NTSTATUS NtStatus= IoCreateDevice( esi, 
      0,
      "
//Device//SyserDbgMsg",  // UNICODE_STRING 类型的变量
      22h,                                   // FILE_DEVICE_UNKNOWN 
      0,
      0,
      DeviceObject );
if (STATUS_SUCCESS != NtStatus)
{
   退出; 
}

sub_10FD6 ( , 2000h);

.text:000108F0                 mov     eax, [ebp+DeviceObject]
.text:000108F3                 or        dword ptr [eax+1Ch], 4
.text:000108F7                 mov     eax, [ebp+DeviceObject]
.text:000108FA                 and      byte ptr [eax+1Ch], 7Fh
.text:000108FE                 push    offset a??Syserdbgms_0 ; "
//??//SyserDbgMsg"
.text:00010903                 lea        eax, [ebp+SymbolicLinkName]
.text:00010906                 push     eax             ; DestinationString
.text:00010907                 call       edi ; RtlInitUnicodeString
.text:00010909                 lea        eax, [ebp+DeviceName]
.text:0001090C                 push    eax             ; DeviceName
.text:0001090D                 lea       eax, [ebp+SymbolicLinkName]
.text:00010910                 push    eax             ; SymbolicLinkName
.text:00010911                 call      ds:IoCreateSymbolicLink
.text:00010917                 push    offset SpinLock ; SpinLock
.text:0001091C                 call     ds:KeInitializeSpinLock

RtlInitUnicodeString (SymbolicLinkName , L"//??//SyserDbgMsg");

// SymbolicLinkName: "//??//SyserDbgMsg"
// DeviceName:       "
//Device//SyserDbgMsg"
IoCreateSymbolicLink( SymbolicLinkName , DeviceName) ;


.text:00010938                 push    offset aDbgsetdebugpri ; "DbgSetDebugPrintCallback"
.text:0001093D                 lea      eax, [ebp+SystemRoutineName]
.text:00010940                 push    eax             ; DestinationString
.text:00010941                 call      edi ; RtlInitUnicodeString
.text:00010943                 mov     esi, ds:MmGetSystemRoutineAddress
.text:00010949                 lea       eax, [ebp+SystemRoutineName]
.text:0001094C                 push    eax             ; SystemRoutineName
.text:0001094D                 call      esi ; MmGetSystemRoutineAddress
.text:0001094F                 cmp     eax, ebx
.text:00010951                 mov      dword_12000, eax
.text:00010956                 jz         short loc_109A3
.text:00010958                 push    1
.text:0001095A                 push    offset sub_10D8A
.text:0001095F                 call      eax
.text:00010961                 test      eax, eax
.text:00010963                 jl          short loc_109A3
.text:00010965                 push     offset aDbgsetdebugfil ; "DbgSetDebugFilterState"
.text:0001096A                 lea       eax, [ebp+SystemRoutineName]
.text:0001096D                 push    eax             ; DestinationString
.text:0001096E                 mov     byte_11FFC, 1
.text:00010975                 call      edi ; RtlInitUnicodeString
.text:00010977                 lea       eax, [ebp+SystemRoutineName]
.text:0001097A                 push    eax             ; SystemRoutineName
.text:0001097B                 call      esi ; MmGetSystemRoutineAddress
.text:0001097D                 cmp     eax, ebx
.text:0001097F                 mov     dword_12004, eax
.text:00010984                 jz        short loc_109A3
.text:00010986                 xor      edi, edi


RtlInitUnicodeString (uniSystemRoutineName, L"DbgSetDebugPrintCallback");
dword_12000 = MmGetSystemRoutineAddress(uniSystemRoutineName);

RtlInitUnicodeString (uniSystemRoutineName, L"DbgSetDebugFilterState");
dword_12004 = MmGetSystemRoutineAddress(uniSystemRoutineName);

if ( (dword_12000 == NULL) && (dword_12004 == NULL) )
{

.text:000109AB                 push    ebx             ; DeferredContext
.text:000109AC                 push    offset DeferredRoutine ; DeferredRoutine
.text:000109B1                 mov     edi, offset Dpc
.text:000109B6                 push    edi             ; Dpc
.text:000109B7                 call      ds:KeInitializeDpc
.text:000109BD                 mov     esi, offset unk_11FB0
.text:000109C2                 push    esi             ; Timer
.text:000109C3                 call      ds:KeInitializeTimer
.text:000109C9                 push    edi             ; Dpc
.text:000109CA                 push    3E8h            ; Period
.text:000109CF                 or        ecx, 0FFFFFFFFh
.text:000109D2                 push    ecx
.text:000109D3                 mov     eax, 0FF676980h
.text:000109D8                 push    eax             ; DueTime
.text:000109D9                 push    esi             ; Timer
.text:000109DA                 call     ds:KeSetTimerEx
.text:000109E0                 jmp     short loc_109F3


DeferredContext = 0;
KTIMER  g_Timer ;

KeInitializeDpc( &g_Dpc , DeferredRoutine, 0);

KeInitializeTimer(  &g_Timer );

KeSetTimerEx( &g_Timer, 0FF676980h, 3E8h, &g_Dpc );


.text:000109F3 loc_109F3:                              ; CODE XREF: start+159j
.text:000109F3                                         ; start+190j
.text:000109F3                 xor     eax, eax
.text:000109F5
.text:000109F5 loc_109F5:                              ; CODE XREF: start+9Bj
.text:000109F5                 pop     edi
.text:000109F6                 pop     esi
.text:000109F7                 pop     ebx
.text:000109F8                 leave
.text:000109F9                 retn    8
.text:000109F9 start          endp


程序结束
}


下面是关于延迟过程调用和Timer的说明:
If the Dpc parameter is specified, a DPC object is associated with the timer object.
When the timer expires, the timer object is removed from the system timer queue and it is set to a signaled state.
If a DPC object was associated with the timer when it was set, the DPC object is inserted in the system DPC queue to be executed as soon as conditions permit after the timer interval expires.


总结:
(1)DeferredRoutine 是一个延迟过程调用, 在该例程中会做些什么呢? 我想可能是先前执行的某段代码由于执行时机的原因而没有成功,  在该例程中会重复执行直至成功为止.

(2)sub_10702:  DriverUnload
        loc_103DC:  SDbgMsgCreate
        sub_10646:  SDbgMsgRead
        loc_103F8:  SDbgMsgClose
        loc_10442:  SDbgMsgDeviceIoControl

在 IDA 中分别选中这些函数名,然后 鼠标右键-->"rename" ,把这些函数替换为上面容易记忆的名字;

(3) 上面的 DirverEntry 例程中通过 MmGetSystemRoutineAddress 来得到 DbgSetDebugPrintCallback和 DbgSetDebugFilterState 系统例程, 并分别存在 dword_12000 和 dword_12004 内存位置.以后的代码中肯定使用这 2 个值(函数的地址), 我们可以在代码中找到 对dword_12000 和 dword_12004 访问的代码并把它改成具体的例程名 "DbgSetDebugPrintCallback" 和 "DbgSetDebugFilterState "

 

.text:000104D2 ; void __stdcall DeferredRoutine(struct _KDPC *,PVOID,PVOID,PVOID)
.text:000104D2 DeferredRoutine proc near               ; DATA XREF: start+15Co
.text:000104D2                 xor     ecx, ecx
.text:000104D4                 cmp     dword_12220, ecx
.text:000104DA                 jz      short locret_104EE
.text:000104DC                 mov     eax, Event
.text:000104E1                 cmp     eax, ecx
.text:000104E3                 jz      short locret_104EE
.text:000104E5                 push    ecx             ; Wait
.text:000104E6                 push    ecx             ; Increment
.text:000104E7                 push    eax             ; Event
.text:000104E8                 call    ds:KeSetEvent
.text:000104EE
.text:000104EE locret_104EE:                           ; CODE XREF: DeferredRoutine+8j
.text:000104EE                                         ; DeferredRoutine+11j
.text:000104EE                 retn    10h
.text:000104EE DeferredRoutine endp

这是上面  KeInitializeDpc 例程设置延迟调用过程, 第二个参数为NULL, 再该例程中如果 dword_12220 不为 0, 就设置事件,这个event 变量是全局。

if (dword_12220 != 0)
{
        if (g_event != NULL)
 {
  KeSetEvent(g_event, NULL, NULL);  
 }
}

 

//--------------------下面是 IRP_MJ_CREATE 对应的例程--------------------------

.text:000103DC SDbgMsgCreate:                          ; DATA XREF: start+31o
.text:000103DC                 mov     ecx, [esp+8]
.text:000103E0                 and     dword ptr [ecx+18h], 0
.text:000103E4                 xor     dl, dl
.text:000103E6                 mov     dword ptr [ecx+1Ch], 1
.text:000103ED                 call    ds:IofCompleteRequest
.text:000103F3                 xor     eax, eax
.text:000103F5                 retn    8

NTSTATUS  SDbgMsgCreate(PDEVICE_OBJECT pDeviceObject, PIRP Irp)
{
 Irp->IoStatus.Status = STATUS_SUCCESS;
 Irp->IoStatus.Information = 1;
 
        //
        // IofCompleteRequest 例程是 _fastcall 调用方式
        // 采用 ecx 和 edx 传递参数
        //
 
   IoCompleteRequest( ecx , edx );   
       
        return Irp->IoStatus.Status ;
}


//--------------------下面是 IRP_MJ_READ 对应的派遣例程-------------------------
下面的代码是由 IDA 自动生成, SDbgMsgRead 是我根据在 DriverObject 例程中的分析得处的该例程对应着 IRP_MJ_READ

; int __stdcall SDbgMsgRead(int,KIRQL NewIrql)
.text:00010646 SDbgMsgRead     proc near               ; DATA XREF: start+37o
.text:00010646
.text:00010646 NewIrql         = byte ptr  18h
.text:00010646
.text:00010646                 push    ebx
.text:00010647                 push    ebp
.text:00010648                 push    esi
.text:00010649                 push    edi
.text:0001064A                 mov     edi, dword ptr [esp+NewIrql]
.text:0001064E                 mov     ebp, [edi+60h]
.text:00010651                 mov     ebx, offset SpinLock
.text:00010656                 mov     ecx, ebx        ; SpinLock
.text:00010658                 xor     esi, esi
.text:0001065A                 call    ds:KfAcquireSpinLock
.text:00010660                 mov     [esp+NewIrql], al
.text:00010664                 mov     eax, dword_12220
.text:00010669                 test    eax, eax
.text:0001066B                 jz      short loc_106BB
.text:0001066D                 mov     esi, [ebp+4]
.text:00010670                 inc     eax
.text:00010671                 cmp     esi, eax
.text:00010673                 jle     short loc_10677
.text:00010675                 mov     esi, eax
.text:00010677
// 上面的反汇编代码可能又有问题: NewIrql 是从哪来得?
从
  MOV edi, dword ptr [esp+NewIrql]
  MOV ebp, [edi+60h]
可以猜测出, 第二个参数应该是 Irp 才对, 这样Irp偏移量为 60H是 CurrentStackLocation

   
   

    ULONG UlLength;
    PVOID SystemBuffer = NULL ;

    ebp = IoGetCurrentIrpStackLocation(Irp);
   
    KfAcquireSpinLock(&g_SpinLock);       // __fastcall 调用方式
  
    UlLength  = ebp->Parameters.Read.Length;

    if (dword_12220 != 0)
 {
     if ( ebp->Parameters.Read.Length > dword_12220+1 )
  {
   UlLength = dword_12220+1;        // 应该是和存放读取数据的缓冲区有关, 取小值   
  } 

            if (UlLength == 0) 
  {
   ; 完成 Irp
                        ; 退出
  }
           
            // 取得读取数据的缓冲区
            pSystemBuffer = Irp->AssociatedIrp.SystemBuffer ;                                                   
.text:00010677 loc_10677:                              ; CODE XREF: SDbgMsgRead+2Dj
.text:00010677                 test    esi, esi        ; 比较  pSystemBuffer 是否为 NULL
.text:00010679                 jz      short loc_106BB
.text:0001067B                 mov     eax, [edi+0Ch]
.text:0001067E                 test    eax, eax
.text:00010680                 jz      short loc_106BB

   if ( pSystemBuffer == NULL)
  {
                        ; 完成 Irp
                        ; 退出
  }
.text:00010682                 push    esi             ; 读取数据的长度
.text:00010683                 push    dword_12224    
.text:00010689                 push    eax             ; 存放数据缓冲区的地址
.text:0001068A                 call    sub_1050E
 
          // 从数据存放的缓冲区中读取指定大小的字节
          retValue = sub_1050E( pSystemBuffer, dword_12224, UlLength);
         
.text:0001068F                 cmp     esi, dword_12220
.text:00010695                 jge     short loc_106B4
.text:00010697                 mov     eax, dword_12224
.text:0001069C                 lea     ecx, [eax+esi-1]
.text:000106A0                 push    ecx
.text:000106A1                 push    eax
.text:000106A2                 call    sub_104F2
        if (esi < dword_12220) 
        {
  sub104f2_Retvalue = sub_104F2 (dword_12224 , dword_12224+esi-1 );

.text:000106A7                 xor     eax, eax
.text:000106A9                 inc     eax
.text:000106AA                 sub     eax, esi
.text:000106AC                 add     dword_12220, eax
.text:000106B2                 jmp     short loc_106BB
               
                sub104f2_Retvalue = 1;
               
                sub104f2_Retvalue -= UlLength;
               
                dword_12220 +=  eax;      
               
        }else
        {
.text:000106B4 loc_106B4:                              ; CODE XREF: SDbgMsgRead+4Fj
.text:000106B4                 and     dword_12220, 0
  dword_12220 = 0;
        }

label :loc_106BB:      
.text:000106BB loc_106BB:                              ; CODE XREF: SDbgMsgRead+25j
.text:000106BB                                         ; SDbgMsgRead+33j ...
.text:000106BB                 mov     dl, [esp+NewIrql] ; NewIrql
.text:000106BF                 mov     ecx, ebx        ; SpinLock
.text:000106C1                 call    ds:KfReleaseSpinLock
         KfReleaseSpinLock(g_SpinLock);

.text:000106C7                 and     dword ptr [edi+18h], 0
.text:000106CB                 xor     dl, dl
.text:000106CD                 mov     ecx, edi        ; Irp
.text:000106CF                 mov     [edi+1Ch], esi                  ; esi 实际读取了多少字节的数据
.text:000106D2                 call    ds:IofCompleteRequest
.text:000106D8                 pop     edi
.text:000106D9                 pop     esi
.text:000106DA                 pop     ebp
.text:000106DB                 xor     eax, eax
.text:000106DD                 pop     ebx
.text:000106DE                 retn    8
 
 Irp->IoStatus.Status = STATUS_SUCCESS;
  Irp->IoStatus.Information = esi ;     // 实际读取了多少字节的数据    
 
 IofCompleteRequest(Irp, 0);         
 }

逆向随笔——对可以过TP的注入驱动的一次逆向 前言: 逆一些东西,有点收获,就写篇随笔记录一下。因为写的随便,就不发看雪了。 今天一个朋友给我发了一个说是可以过TP的注入驱动,希望我逆一下看看是什么套路。 正文: 接收过来压缩包,看了一下 loadddll32和64分别是用在32和64的驱动,MemOpe和dnf.exe都是测试用例(不过我是用自己写的123.exe进行测试)。 先跑起来,看看线程和模块上有没有什么特别的地方 有一个线程P... 阅读详情

相关推荐

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

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

2653

开启服务并设置服务启动方式

/*******************************************************************************函数名:OpenServerWithStartTypeByName函数功能:以请求的方式打开服务函数参数: strServerName: 服务名称 nStartType: 启动方式函数返回值: TRUE : 设置成功 FAL...

大头的博客 2011

HITCON2022--ctf驱动逆向题

当用户传入0x222080的时候,驱动进入这个分支,如果数组byte_140013190里的8个值均为1,则会跳转到LABEL_21,很显然,这里验证的内容是dword_140003000的开头是否是hitcon,这说明这里会出现flag。于是经过一番倒腾测试,发现执行一个函数,只有最后一个函数能执行下去,能行,一定是顺序问题,经过又一番测试,得到最终测试顺序,这大概是某种保护手段,阻碍静态分析,真正的函数是运行中动态生成的(实测,异或这两轮的结果并不是可执行的代码)

m0_64973256的博客 1592

SERVICE_BOOT_START 驱动程序逆向 2

.text:000104D2 ; void __stdcall DeferredRoutine(struct _KDPC *,PVOID,PVOID,PVOID).text:000104D2 DeferredRoutine proc near               ; DATA XREF: start+15Co.text:000104D2                 xor     e

FISH 的专栏 1811

minifilter开发文件过滤驱动、以及syser调试的经验

minifilter开发文件过滤驱动、以及syser调试的经验。  刚刚完成一个产品的开发,用了两个月,真不容易,像我这种菜鸟,为了搞清一个常识,得从老谭的那本古董级C程序设计翻起。  首先说驱动教程。 楚狂人谭文的《寒江独钓-Windows内核安全编程》和张帆的《Windows驱动开发技术详解》要反复地读。  我用的是最新的WDK 7600,那个帮助真叫人汗,英文的倒罢了,怎

jykj_007的专栏 3749

【信息科学与工程学】【安全领域】 第八十八篇 网络空间安全21

如果员工认为安全政策和流程(如复杂的密码规则、频繁的认证、繁琐的软件安装审批)阻碍了工作效率,他们可能会寻找变通方法,例如:写下密码、共享账户、使用未经批准的云服务(影子IT)、绕过安全控制。例如,一个用于显示用户列表的API,可能返回每个用户的完整个人资料,包括邮箱、地址、电话等敏感字段,而前端可能只显示了姓名。:在OAuth 2.0或OIDC流程中,攻击者可能截获授权请求中的“授权码”,或窃取“访问令牌”,然后将其用于另一个客户端(非原始授权的客户端),从而以用户身份访问受保护的资源。

weixin_49199313的博客 446

nt驱动CreateService创建SERVICE_BOOT_START级别服务报错87

在网上看了一个关于nt驱动安装卸载的例子,于是自己写了需要SERVICE_BOOT_START级别启动的驱动,但是安装的时候报错了,错误码是87。但是我只是改了一个级别而已,没道理会出错的。然后我只是简单的把驱动文件复制到C:\Windows\System32\Drivers目录。再执行一遍,居然成功了。不改级别的时候,测试过,路径不需要指定。可能因为这个级别的特殊性吧。...

youyudexiaowangzi的专栏 1600

架构决策之消息中间件MQ系列六-Pulsar

一、架构

恰恰虎的博客 7254

windows 内核原理与实现读书笔记之驱动程序初始化

I/O系统的初始化是在内核的阶段1初始化过程中完成的。主要函数是Phase1InitializationDiscard,它调用IoInitSystem 来初始化I/O系统。 IoInitSystem 初始化工作: 调用IopCreateObjectTypes ,创建7种类型对象:Adapter、DeviceHandler、Controller、Device、Driver、IoCompletion、File,并存放在相应的全局变量中。 WRK中的全局类型对象变量,如下表: CmpKeyObjec

maomao171314的专栏 1366

lisp方格网法计算土方量_分享:两期土方工程量计算(方格网法)实例例题

最近遇到一个飞时达土方软件试用版客户,咨询怎么根据平整前的原始地形图和平整后的现状地形图来计算产生的土方工程量,也就是两期土方量,且需要用方格网法来计算,作为一个老道的工程设计人员,博主对这类的项目实例例题简直太熟悉了,用飞时达土方计算软件V13.0可以很方便的计算出来。 方格网法计算两期土方量流程 一、软件安装及注册 专业的飞时达土方计算软件FastTFT,请到飞时达软件官方网站去下载,注册完...

weixin_35131425的博客 1700

从零搭建企业网络:使用Packet Tracer模拟多区域OSPF组网全过程

本文通过Cisco Packet Tracer模拟,详细演示了从零搭建一个典型企业多区域OSPF网络的完整流程。内容涵盖网络拓扑规划、IP地址设计、多区域划分原理,并提供了从设备初始化、接口配置到OSPF多区域核心配置与验证的详细步骤。文章旨在帮助网络学习者与IT支持人员通过动手实验,将理论知识转化为实际的配置与排障能力。

day7的博客 1032

5步深度解析:OpenArk系统工具驱动加载完整解决方案

OpenArk是一款功能强大的Windows平台开源反Rootkit(ARK)工具,集成了进程管理、内核分析、编程助手、文件扫描、工具仓库等多种系统工具功能。作为新一代系统安全分析工具,OpenArk通过内核驱动模式提供底层系统访问能力,但在实际使用中用户常遇到驱动加载失败的问题,影响工具功能的完整发挥。 ## 🔍 驱动加载问题的技术本质 OpenArk的核心功能依赖于其内核驱动模块Open

gitblog_01087的博客 600

C# 8. 在新窗口中使用chart控件波形移动显示

1. 添加新窗口 在Form1中新建button控件,名称为buttonStartWaveDisp,这样单击就能调出Form2窗口 在Form1中增加如下: private void buttonStartWaveDisp_Click(object sender, EventArgs e) { if((form2 == null) || (form2.IsDisposed == true)) { form2 = new Form2();

TrueLink的博客 1432

终极指南:如何将小爱音箱改造为开源智能家居语音助手

小爱音箱自定义固件项目是一个功能完整的开源解决方案,专门为技术开发者和智能家居爱好者设计,旨在将普通的小爱音箱改造为功能强大的开源智能家居中心。通过替换原厂固件,你可以安装各种开源软件,实现个性化的智能语音助手和多媒体播放功能,彻底摆脱厂商限制,打造真正属于自己的智能设备。 ## 📋 项目核心功能与技术架构 ### 开源智能语音助手系统 小爱音箱自定义固件项目集成了多种开源语音技术,提供了一

gitblog_01091的博客 323

A*(star)算法原理讲解以及程序实现(基于Python)

本文将以迷宫探索最优路径为例,讲解A *搜索算法原理及其程序实现。在原理讲解部分,首先从为什么要使用A *搜索算法和A *搜索算法的全局最优逻辑出发,讲解A *算法的原理。其次对A *的行动函数g(n)和启发函数h(n)的细节进行了讲解说明,并补充了启发函数的选择对于A *算法的影响。在程序实现部分,首先从程序流程框图出发,解释A *算法的流程。其次按函数的类划分并讲解主要代码,接着展示程序的运行结果,最后对A *算法进行总结分析。

m0_73366745的博客 8284

Android Settings 设置Preference置灰显示

使Preference置灰显示,不能点击。先调用Preference的setEnabled(false),再调用setShouldDisableView(true); 如果使置灰项恢复正常可点击,可调用setEnabled(true)。

随风而动 1049

《Windows内核原理与实现笔记》(三)Windows引导过程

内核加载 在Intel x86系统上,Windows操作系统获得控制首先从硬盘的主引导记录(MBR,MasterBoot Record)开始,Windows Setup程序在安装Windows时填充MBR(其他的磁盘管理程序也可能填充MBR)。MBR包含代码和数据,其代码称为引导代码,在系统引导时首先获得控制;MBR中的数据是一张分区表,指定了每个分区在磁盘上的位置和大小,以及分区的类型。当...

kernweak的博客 1381

VMware Workstation Pro必备技巧:5分钟搞定Ubuntu虚拟机磁盘瘦身(附常见错误解决)

本文详细介绍了如何为VMware Workstation Pro中的Ubuntu虚拟机进行磁盘瘦身,解决.vmdk文件只增不减的问题。通过清理系统垃圾、使用零填充空闲空间,并利用vmware-toolbox-cmd或vmware-vdiskmanager工具进行压缩,可有效回收被无效占用的磁盘空间。文章还提供了常见错误解决方案和预防性维护建议,帮助用户高效管理虚拟机存储。

sea99的博客 299

windows驱动加载顺序

CreateService的dwStartType 形参 有几个选项值 SERVICE_BOOT_START SERVICE_AUTO_START SERVICE_SYSTEM_START   我们一般都只用SERVICE_DEMAND_START 那么其他几个值的含义呢? 参考MSDN windows驱动加载顺序: 1. 判断StartType,依次按SERVICE_BOOT_ST

┌LiHoo┐ 3762

金蝶个版本下载地址,记得保存收藏。

专业版 V10.0 http://downloads.cmcloud.cn/kis/kis_pro/10.0/kiszybV10sp1.rar V11.0 http://downloads.cmcloud.cn/kis/kis_pro/11.0/KISV11Setup.rar V12.0 http://dow...

饺子的博客 2512

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

逆向基础-Windows驱动开发(一)

驱动开发

AppWhite_Star的博客 1431

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

某超级注入程序的驱动逆向

1、起因 从哥们儿那找到了一个超级注入的工具,打开一看加了vmp,然后还有驱动的驱动,于是这里把驱动提取出来,简单分析一下。 1.1运行 让程序先把驱动释放出来,可以看到这里需要买卡,然后才会释放驱动加载(简单破解一下就行,不是重点) 1.2破解之后 下一个CreateServiceA断点,让它在加载驱动之前断下,接着将驱动拷贝出来。从下图可以看到虽然驱动有签名,但是个过期签名,高版本windows10上是加载不上的。 2、驱动分析 好消息是驱动没有加壳,可以f5分析一下 2.1W.

被遗弃的庸才博客 3197

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

初学驱动逆向,笔记一。

初学驱动逆向,在《windows驱动开发技术详解》中随便找个例子逆逆看 [ \chapter09\SpecialStartIOTest ]。 水平很菜,各路牛人笑过。 逆向该例子的DriverEntry和CreateDevice函数,这两个函数在《windows驱动开发技术详解》的例子中十分常见。 并逆向的本范例驱动的核心部分 HelloDDKRead 函数,没什么技术含量。 经验:需要熟

Diomedes's Place 2059

我的成长

文 / 吴岩峰 求学之路 1976年,我出生在一个大家庭,爷爷奶奶与父母一起生活。姐姐大我两岁,父亲是一个工程师,母亲是个普通工人。与同龄孩子不同,我在上小学前并没上过幼儿园和学前班,而是在父母的辅导下完成了学前教育。小学四年级时被选中参加一个华罗庚数学班,在一次数学竞赛中获得长春市第四名的成绩。由于成绩突出,我被保送到市里一所重点中学学习。 重点中学在教育设施和师资力量上都有很大优势,在学...

《程序员》官方BLOG 960

吴岩峰,杯酒快意,志在高峰

<br /><br />1976年8月31日,吴岩峰出生于北国长春,在家中四个孩子中排行老二,上面有个姐姐,下面还有1个弟弟和1个妹妹。童年生活简单快乐,和罗大佑的那首《童年》中所唱的一样:“池塘边的榕树上 知了在声声叫着夏天 操场边的秋千上 只有蝴蝶停在上面……”吴岩峰说自己从小十分自由,“父母都是事业单位的,工作特别忙,家里孩子又多,所以几乎都不管我们,属于放任自由型。姐姐考上哈工大的通知书来了,家里人才知道。”没有什么学习压力,也不上什么补习班,过得非常轻松自在。“不像现在的小孩,幼儿园就压力很大”说

优快云 6632
上一篇: Breaking the Windows Server 2003 SP2 Stack
下一篇: 逆向TesSafe.sys
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值