对Rav 2005中HOOK的初步分析

C++反汇编学习笔记7——数组和指针以及他们的寻址 两年前写的,欢迎大家吐槽!  转载请注明出处。 1.      数组在函数内 先通过一个简单的例子来看一下数组和普通变量在初始化时的不同之处: 这是数组初始化:     42:   int nArry[5] = {1, 2, 3, 4, 5}; 0042B758  mov        dword ptr [ebp-1Ch],1  0042B75F mov         dw 阅读详情
分析了半天,准备放弃了。不过因为和驱动有关,而且分析过程也和RE挂钩,所以放上来给兄弟们看看。有知道的讨论一下,没有懂NT内核的作个参考,算废物利用吧。

废话几句,记得Xtreme是用驱动的……寒一个……

===================================================================
对Rav 2005中HOOK的初步分析

昨天升级了一下RAV2004。本以为很快就完,但升级程序却拖了近一个小时。启动后发现,RAV已经被升级到了2005。这事本应该就这么完了,但恰巧我对各种软件的内存占用非常敏感,弄了个empty.exe放在bat里,定期清理一下内存。执行了一遍bat却发现empty报错,说无法清理ravmond.exe!于是本能地觉得有名堂。赶紧分析了一下empty。

从出错信息入手,可以找到下面的代码(注释是我加的):

.text:01001603 loc_1001603:
.text:01001603                 call    sub_1001D1B
.text:01001608                 mov     eax, dword_12D3180 ; EAX里应该是PID
.text:0100160D                 test    eax, eax
.text:0100160F                 jz      short loc_100163D
.text:01001611                 push    eax
.text:01001612                 call    sub_1001F2C     ; 清理内存
.text:01001617                 test    eax, eax
.text:01001619                 jnz     short loc_1001636
.text:0100161B                 push    dword_12D3180
.text:01001621                 push    offset aCouldNotEmptyW ; "could not empty working set for process"...
.text:01001626                 call    ds:printf
.text:0100162C                 pop     ecx

  OK,到sub_1001F2C去看看:

.text:01001F2C                 push    ebp
.text:01001F2D                 mov     ebp, esp
.text:01001F2F                 push    ecx
.text:01001F30                 push    esi
.text:01001F31                 push    edi
.text:01001F32                 push    [ebp+MaximumWorkingSetSize] ; dwProcessId
.text:01001F35                 xor     edi, edi
.text:01001F37                 push    edi             ; bInheritHandle
.text:01001F38                 push    1F0FFFh         ; dwDesiredAccess
.text:01001F3D                 call    ds:OpenProcess
.text:01001F43                 mov     esi, eax
.text:01001F45                 cmp     esi, edi
.text:01001F47                 jnz     short loc_1001F4D
.text:01001F49                 xor     eax, eax
.text:01001F4B                 jmp     short loc_1001F77

首先是以PROCESS_ALL_ACCESS权限调用OpenProcess。但就是在这里,esi=edi,跳到出口loc_1001F77。

好,于是写段调用OpenProcess的程序。结果发现,对ravmond的操作结果是返回ERROR_INVALID_PARAMETER??!!但是我的参数没有写错啊!然后开始怀疑bInheritHandle参数,但改了还是一样。那么,换PID。换了SMSS的PID,说没有权限,很正常。换delphi32的PID,可以正常打开。那么,就是说,参数绝对是正确的,只是RAV玩了个花样。那样,按照系统给的PID去找就找不到了。

既然这样,那就拿RAV开刀。先翻了一下RAV的目录,有几个驱动文件引起了我的注意:

Hooksys.sys
hookbase.sys
HOOKREG.sys
HookCont.sys
HookApi.sys

难道是OpenProcess被HOOK了?于是先在HookApi里查import,没有可疑的API。hookbase?Hooksys?HookCont?都没有。

还是写程序看看……GetProcAddress却报告说没有异常。

没办法,查找ravmond吧……HOOKREG里居然有ravmond的字样!改之,重新启动RAV的服务,bingo!在任务管理器里k进程时显示没有权限!那么很明显是被HOOK了。

以前玩过rootkit(只是玩而已,写不来),本来是应该想到的……

那么反汇编HOOKREG,查找ravmond的xref……在00011BEF有一个push,向上找到函数入口,得到整个函数:

.text:00011B74 sub_11B74       proc near
.text:00011B74
.text:00011B74 var_2C          = dword ptr -2Ch
.text:00011B74 var_28          = byte ptr -28h
.text:00011B74 var_9           = byte ptr -9
.text:00011B74 var_8           = dword ptr -8
.text:00011B74 var_4           = dword ptr -4
.text:00011B74 arg_0           = dword ptr  8
.text:00011B74
.text:00011B74                 push    ebp
.text:00011B75                 mov     ebp, esp
.text:00011B77                 sub     esp, 2Ch
.text:00011B7A                 mov     [ebp+var_2C], 0
.text:00011B81                 mov     [ebp+var_28], 0
.text:00011B85                 call    ds:IoGetCurrentProcess
.text:00011B8B                 mov     [ebp+var_8], eax
//指向当前进程开头的指针
.text:00011B8E                 mov     eax, [ebp+var_8]
.text:00011B91                 add     eax, dword_12F48
//dword_12F48的真实偏移
.text:00011B97                 mov     [ebp+var_4], eax
.text:00011B9A                 mov     ecx, [ebp+var_4]
.text:00011B9D                 push    ecx
.text:00011B9E                 lea     edx, [ebp+var_28]
//缓冲的长度是$1F
.text:00011BA1                 push    edx
.text:00011BA2                 call    strcpy
.text:00011BA7                 add     esp, 8
//复制
.text:00011BAA                 mov     [ebp+var_9], 0
.text:00011BAE                 lea     eax, [ebp+var_28]
.text:00011BB1                 push    eax             ; char *
.text:00011BB2                 call    ds:_strupr
.text:00011BB8                 add     esp, 4
//大写
.text:00011BBB                 cmp     [ebp+arg_0], 0
.text:00011BBF                 jz      short loc_11BD1
//若参数是0就走
.text:00011BC1                 lea     ecx, [ebp+var_28]
//dword_12F48的复件
.text:00011BC4                 push    ecx
.text:00011BC5                 mov     edx, [ebp+arg_0]
.text:00011BC8                 push    edx
.text:00011BC9                 call    strcpy
.text:00011BCE                 add     esp, 8
//这样看,参数应该是PChar
//参数非0就给个dword_12F48的复件
.text:00011BD1 loc_11BD1:
.text:00011BD1                 push    offset dword_11B50
.text:00011BD6                 lea     eax, [ebp+var_28]
.text:00011BD9                 push    eax
.text:00011BDA                 call    strcmp
.text:00011BDF                 add     esp, 8
.text:00011BE2                 test    eax, eax
.text:00011BE4                 jnz     short loc_11BEF
//和dword_11B50比较(RAV.EXE),若不等就继续,否则返回2
.text:00011BE6                 mov     [ebp+var_2C], 2
.text:00011BED                 jmp     short loc_11C41
.text:00011BEF loc_11BEF:
.text:00011BEF                 push    offset dword_11B58
.text:00011BF4                 lea     ecx, [ebp+var_28]
.text:00011BF7                 push    ecx
.text:00011BF8                 call    strcmp
.text:00011BFD                 add     esp, 8
.text:00011C00                 test    eax, eax
.text:00011C02                 jz      short loc_11C19
//和dword_11B58比较(RAVMOND.EXE),若相等就返回3,否则继续
.text:00011C04                 push    offset dword_11B64
.text:00011C09                 lea     edx, [ebp+var_28]
.text:00011C0C                 push    edx
.text:00011C0D                 call    strcmp
.text:00011C12                 add     esp, 8
.text:00011C15                 test    eax, eax
.text:00011C17                 jnz     short loc_11C22
//和dword_11B64比较(RAVMON.EXE),若相等就返回3,否则继续
.text:00011C19 loc_11C19:
.text:00011C19                 mov     [ebp+var_2C], 3
.text:00011C20                 jmp     short loc_11C41
.text:00011C22 loc_11C22:
.text:00011C22                 push    3               ; size_t
.text:00011C24                 push    offset aRav     ; char *
.text:00011C29                 lea     eax, [ebp+var_28]
.text:00011C2C                 push    eax             ; char *
.text:00011C2D                 call    ds:strncmp
.text:00011C33                 add     esp, 0Ch
.text:00011C36                 test    eax, eax
.text:00011C38                 jnz     short loc_11C41
//检查var_28的头3个字符是否RAV,是就返回4,不是就直接返回
.text:00011C3A                 mov     [ebp+var_2C], 4
.text:00011C41 loc_11C41:
.text:00011C41                 mov     eax, [ebp+var_2C]
.text:00011C44                 mov     esp, ebp
.text:00011C46                 pop     ebp
.text:00011C47                 retn    4
.text:00011C47 sub_11B74       endp

我们可以看到,这个东西有点象call/pop的手法。好处就是可以不要数据段(反正特征字符串是只读的)。

那么,这只是一个判断。判断dword_12F48是否含有特定的字符串,若是RAV的核心就返回3,主程序返回2,外围程序返回4,其他返回0。

那么来看看sub_11B74的xref,有三处:11D27、119E6、115E2,对应的sub分别是sub_11D00、sub_119D0、sub_115BC。

sub_115BC有4个xref,全部是code引用,sub_119D0只有1个data引用的xref,而11D00,有3个xref,data引用。

先看11D00,xref全在start里:

.text:00010453 8B 45 08                          mov     eax, [ebp+DriverObject]
.text:00010456 C7 40 38 00 1D 01+                mov     dword ptr [eax+38h], offset sub_11D00
.text:0001045D 8B 4D 08                          mov     ecx, [ebp+DriverObject]
.text:00010460 C7 41 40 00 1D 01+                mov     dword ptr [ecx+40h], offset sub_11D00
.text:00010467 8B 55 08                          mov     edx, [ebp+DriverObject]
.text:0001046A C7 82 80 00 00 00+                mov     dword ptr [edx+80h], offset sub_11D00

下面就dump一下和DriverObject有关的代码(eax,ecx,edx都是临时使用的):

.text:00010308                   ; int __stdcall start(PDRIVER_OBJECT DriverObject)
.text:00010308                                   public start
.text:00010308                   start           proc near
.text:00010308
.text:00010308                   var_64          = dword ptr -64h
.text:00010308                   var_60          = dword ptr -60h
.text:00010308                   SymbolicLinkName= UNICODE_STRING ptr -5Ch
.text:00010308                   DeviceObject    = dword ptr -54h
.text:00010308                   DeviceName      = UNICODE_STRING ptr -50h
.text:00010308                   SourceString    = word ptr -48h
.text:00010308                   var_28          = dword ptr -28h
.text:00010308                   DriverObject    = dword ptr  8
.text:00010308
.text:00010308 55                                push    ebp
.text:00010309 8B EC                             mov     ebp, esp
.text:0001030B 83 EC 64                          sub     esp, 64h
.text:0001030E 56                                push    esi
.text:0001030F 57                                push    edi
.text:00010310 C7 45 AC 00 00 00+                mov     [ebp+DeviceObject], 0
.....
.text:0001036A 8D 55 AC                          lea     edx, [ebp+DeviceObject]
.text:0001036D 52                                push    edx             ; DeviceObject
.text:0001036E 6A 00                             push    0               ; Exclusive
.text:00010370 6A 00                             push    0               ; DeviceCharacteristics
.text:00010372 68 00 84 00 00                    push    8400h           ; DeviceType
.text:00010377 8D 45 B0                          lea     eax, [ebp+DeviceName]
.text:0001037A 50                                push    eax             ; DeviceName
.text:0001037B 6A 00                             push    0               ; DeviceExtensionSize
.text:0001037D 8B 4D 08                          mov     ecx, [ebp+DriverObject]
.text:00010380 51                                push    ecx             ; DriverObject
.text:00010381 FF 15 DC 26 01 00                 call    ds:IoCreateDevice
.....
.text:000103BD 8B 45 08                          mov     eax, [ebp+DriverObject]
.text:000103C0 8B 48 04                          mov     ecx, [eax+4]
.text:000103C3 51                                push    ecx             ; DeviceObject
.text:000103C4 FF 15 D4 26 01 00                 call    ds:IoDeleteDevice
.text:000103CA 8B 45 9C                          mov     eax, [ebp+var_64]
.....
.text:00010453 8B 45 08                          mov     eax, [ebp+DriverObject]
.text:00010456 C7 40 38 00 1D 01+                mov     dword ptr [eax+38h], offset sub_11D00
.text:0001045D 8B 4D 08                          mov     ecx, [ebp+DriverObject]
.text:00010460 C7 41 40 00 1D 01+                mov     dword ptr [ecx+40h], offset sub_11D00
.text:00010467 8B 55 08                          mov     edx, [ebp+DriverObject]
.text:0001046A C7 82 80 00 00 00+                mov     dword ptr [edx+80h], offset sub_11D00
.text:00010474 8B 45 08                          mov     eax, [ebp+DriverObject]
.text:00010477 C7 40 70 BF 1D 01+                mov     dword ptr [eax+70h], offset sub_11DBF
.text:0001047E 8B 4D 08                          mov     ecx, [ebp+DriverObject]
.text:00010481 C7 41 34 68 05 01+                mov     dword ptr [ecx+34h], offset sub_10568

就是填充PDRIVER_OBJECT,其他没有什么。这里的大概意思是创建一个内核Device,然后定义几个Function。问题是,这个驱动的Type是自定义的,而我又不懂Driver……

不过还好,119D0的xref有点意思:

.text:00010CBA                 mov     eax, ds:ZwSetValueKey
.text:00010CBF                 mov     ecx, [eax+1]
.text:00010CC2                 mov     edx, ds:KeServiceDescriptorTable
.text:00010CC8                 mov     eax, [edx]
.text:00010CCA                 mov     dword ptr [eax+ecx*4], offset sub_119D0

那么,这里是修改ServiceDescriptorTable里ZwSetValueKey的入口。联想一下,应该是不允许修改RAVMOND服务的Key。

最后看看115BC,xref对应的sub有111A0,112F0,11360和119D0。而它们都是只有一个data的xref,应该是function了:

.text:00010CD1                 mov     ecx, ds:ZwCreateKey
.text:00010CD7                 mov     edx, [ecx+1]
.text:00010CDA                 mov     eax, ds:KeServiceDescriptorTable
.text:00010CDF                 mov     ecx, [eax]
.text:00010CE1                 mov     dword ptr [ecx+edx*4], offset sub_111A0
.text:00010CE8                 mov     edx, ds:ZwDeleteValueKey
.text:00010CEE                 mov     eax, [edx+1]
.text:00010CF1                 mov     ecx, ds:KeServiceDescriptorTable
.text:00010CF7                 mov     edx, [ecx]
.text:00010CF9                 mov     dword ptr [edx+eax*4], offset sub_11360
.text:00010D00                 mov     eax, ds:ZwDeleteKey
.text:00010D05                 mov     ecx, [eax+1]
.text:00010D08                 mov     edx, ds:KeServiceDescriptorTable
.text:00010D0E                 mov     eax, [edx]
.text:00010D10                 mov     dword ptr [eax+ecx*4], offset sub_112F0

没有什么,都是常规的Reg读写。失望ing……

回头再找,居然在Hooksys里看见了ravmond!看来下次要用Hex editer了……用BIEW虽然方便,但很容易看漏的。而且,还犯了轻信IDA的错误……

OK,再看Hooksys!有了刚才的经验,这次应该很简单了。

很快发现字符串'RAV.EXE'在11D70处。判断子程序是sub_11ED4。但是居然没有使用KeServiceDescriptorTable!而且驱动的Type是8300h,自定义。

下面就没有什么进展了。在网上搜了搜,发现有人问过类似的问题。不过他要知道的是如何完美地对文件系统Hook。

不过可以肯定的是,RAV没有使用常规的方法来Hook。有可能是通过FileSystem或自己直接计算内存地址来实现Hook的。

PS:在小四的站看了篇Hume的文章,讲通过SEH获取Ker32基址的。在IDA里搜了搜,发现有

.text:00012CD9                 mov     eax, large fs:4
.text:00012CDF                 mov     [ebp+VirtualAddress], eax

很可能就是这个了……暴力搜索,然后改cr0,直接修改物理地址,完美Hook……猜测而已……

TMD简直跟rootkit没什么区别了。隐蔽得一塌糊涂,拿来做rootkit连import也不要,想k的话就乖乖地从头做逆向工程吧……不过做一遍也有好处,现在起码对驱动有点了解了。以前?觉得象天书……
SiLan_EAP_AOI_Test_Case.xlsx 立即下载

相关推荐

SpringBoot和VueDevOps 发布审批与回滚管理系统源码

包含前后端源码、SQL初始化脚本和启动说明。JDK 17、Spring Boot、Vue;默认H2演示数据库。

C# Winform应用程序占用内存较大解决方法整理(转)-- SetProcessWorkingSetSize

一、C# Winform应用程序占用内存较大解决方法整理(转) 原文:  http://www.jb51.net/article/56682.htm 背景: 微软的 .NET FRAMEWORK 现在可谓如火如荼了。但是,.NET 一直所为人诟病的就是“胃口太大”,狂吃内存,虽然微软声称 GC 的功能和智能化都很高,但是内存的回收问题,一直存在困扰,尤其是 winform 程序,其主要原因

sinat_15155817的专栏 7977

制造业重点关注的17个Agent智能体落地场景方案.pptx

制造业重点关注的17个Agent智能体落地场景方案.pptx

Could not set process working directory to ‘ ‘: could not set current directory (errno 3)

Could not set process working directory to ‘’: could not set current directory (errno 3) 遇到这个问题:重新构建项目解决。Reload Gradle Project, 如果遇到这个问题: Execution failed for task ‘:app:clean’. Unable to delete directory: 参靠 这篇文章 最后在从头来一遍,但是好像不能彻底解决这两个问题,大家有彻底解决的办法麻烦评论

lilenglya的博客 7518

STM32 FreeRTOS 多任务实战手册:优先级反转、任务栈与 FromISR 坑位

任务莫名其妙卡死、优先级翻转、栈溢出查不到现场——RTOS 的问题几乎都不在 API 调用,而在调度时序和临界区边界。 【10 个专题,每个含复现步骤 / 测量数据 / 判据 / 落地代码】 1. STM32 NVIC中断优先级详解 2. STM32 FreeRTOS 软件定时器实测 3. STM32 FreeRTOS 消息队列 ISR 收发实测 4. STM32 FreeRTOS 优先级反转实测 5. STM32 FreeRTOS StreamBuffer 流缓冲区串口DMA不 6. STM32 FreeRTOS 事件组实测 7. STM32 FreeRTOS 任务栈溢出排查实测 8. STM32 FreeRTOS 堆内存管理实测 9. STM32 FreeRTOS CPU占用率统计实测 10. STM32 移植LwIP+FreeRTOS双任务协同 【这份教程解决什么】 · 每类问题都从「现象 → 可疑层 → 实测判据 → 根因 → 修复动作」走一遍,不停留在寄存器配置说明。 · 代码块与实测表格按专题编号,可直接对照自己的工程定位;目录按专题编号,方便对照查阅。 【适合谁】正在把裸机工程迁到 RTOS、或已经被优先级反转/栈溢出/中断里调 API 坑过的嵌入式工程师。 【形态】PDF 教程,10 个专题 + 速查目录,含代码块与实测数据表。

科技中介服务机构如何构建智能化服务平台以提升服务效率与专业度?.docx

科技中介服务机构如何构建智能化服务平台以提升服务效率与专业度?

对Rav2005中HOOK的初步分析

对Rav2005中HOOK的初步分析    MicrosoftCTO   昨天升级了一下RAV2004。本以为很快就完,但升级程序却拖了近一个小时。启动后发现,RAV已经被升级到了2005。这事本应该就这么完了,但恰巧我对各种软件的内存占用非常敏感,弄了个empty.exe放在bat里,定期清理一下内存。执行了一遍bat却发现empty报错,说无法清理ravmond.exe!于是本能地觉得有名

1957

政府科技管理者如何高效完成科技成果评价与价值挖掘?.docx

政府科技管理者如何高效完成科技成果评价与价值挖掘?

汇编–从数据类型看WORD与DWORD

刚接触汇编与逆向,记录一些学习笔记。 源代码: IDA汇编代码: 首先 1字=2字节  1字节=8位(8比特)=2位16进制 var_6=dword ptr -6: ptr-6表示指针上移6个单位处,这里的单位是指计算机的寻址单位,一般按字节寻址,[EBP+var_6]就表示EBP-6个字节的地址处。 DWORD 表示双字,是对存入数据的说明。双字=4字节,也就是8位16进制,也就...

超人学飞的日子 1万+

政府科技管理者在推动科技成果转化时,如何高效识别具有高转化潜力的科技成果?.docx

政府科技管理者在推动科技成果转化时,如何高效识别具有高转化潜力的科技成果?

政府科技管理者在推动科技成果落地过程中,如何高效识别和筛选具备高转化价值的科技成果?.docx

政府科技管理者在推动科技成果落地过程中,如何高效识别和筛选具备高转化价值的科技成果?

关于编译型语言函数的调用(二)

接上文: http://blog.youkuaiyun.com/prsniper/article/details/40652451 上文中提到的局部变量的地址,第一个是[ebp-4],由于32位内存对齐的原因,第二个是[ebp-8],对于VC7以上的版本,这个地址可能会不一样 比如第一个可能是[ebp-8],第二个飞到[ebp-14],这是VS.NET的VC编译器在每个局部变量前后都加一个DW

水木清华 1802

【人工智能工程】完结JEV 决策大模型实战,让 AI 从会聊天到能决策

内容概要:本文介绍了JEV决策大模型的核心理念与工程实践,强调将其作为“快判断”层从通用大模型中剥离使用。JEV不生成文本,而是针对明确的状态和问题,输出结构化、带概率的决策结果,适用于高频、原子化的判断任务。文章详细阐述了JEV的工作机制、与通用大模型的本质区别、典型应用场景(如Agent工具路由)、questions的设计方法、能力边界以及兜底机制的重要性,并指出其在成本、延迟和输出确定性方面的优势。; 适合人群:具备一定AI工程实践经验的研发人员、系统架构师,尤其是正在构建Agent、自动化决策系统或优化大模型调用链的技术团队;; 使用场景及目标:①优化高频、轻量级判断任务(如工单分类、内容初筛、RAG相关性判定)的效率与成本;②实现主模型与决策模块的职责分离,提升系统整体稳定性与可维护性;③学习如何设计高质量的判断问题与概率校准机制; 阅读建议:此资源聚焦于决策模型的工程化落地,建议结合实际业务中的判断流程进行POC验证,重点关注questions设计、阈值校准与兜底策略的构建,避免盲目神化JEV的能力。

科技中介服务机构如何借助智能工具提升服务的专业性与便捷性?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

塔式熔盐光热朗肯循环电站建模及Simulink仿真研究

内容概要:本文围绕塔式熔盐光热朗肯循环电站的建模与Simulink仿真展开系统性研究,重点构建了太阳能集热场、熔盐储热系统及朗肯循环发电单元的数学模型,并基于Simulink平台搭建了完整的集成化仿真系统。研究深入分析了系统的能量转换机制、热力循环特性与动态响应行为,通过设置不同太阳辐照强度、负载变化等工况进行仿真,验证了系统在变工况条件下的运行稳定性与调节能力。同时,系统探讨了熔盐流量、储热容量、换热器效率等关键参数对电站整体热效率与输出功率的影响规律,提出了优化运行策略与参数匹配方案,旨在提升光热电站的能量利用率、运行灵活性与供电可靠性。; 适合人群:具备一定电力系统、热力学或新能源工程背景,从事光热发电、综合能源系统建模与仿真的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于塔式光热电站的教学演示与原理讲解,帮助学生理解光-热-电转换全过程;②为光热系统的设计优化、动态性能评估、控制策略开发(如温度控制、功率调节)提供高保真仿真平台与数据支撑;③支持新型储热调度策略与系统集成方案的验证与测试。; 阅读建议:建议读者结合提供的Simulink模型文件同步操作,深入理解各子系统模块(如集热场、储罐、蒸汽发生器、汽轮机等)的建模逻辑与参数设置方法,重点关注能量流、质量流与控制信号的耦合机制,可进一步在此基础上开发先进控制算法或进行多能互补系统集成研究。

多目标粒子群算法求解综合能源系统最优容量配置研究(Matlab代码实现)

内容概要:本文研究了多目标粒子群算法在综合能源系统最优容量配置中的应用,通过Matlab代码实现求解多目标优化问题。文中系统构建了涵盖经济性、环保性和能源利用效率的多目标优化框架,详细阐述了综合能源系统中各类设备的数学模型,并采用改进的多目标粒子群算法进行高效求解,最终获得Pareto最优解集,为综合能源系统的科学规划与可持续发展提供了坚实的理论支撑与实用的技术路径。; 适合人群:具备一定电力系统、优化算法及Matlab编程基础的研究生、科研人员及相关工程技术人员。; 使用场景及目标:①掌握多目标优化问题在综合能源系统容量配置中的建模方法;②学习多目标粒子群算法的实现过程及其在能源系统规划中的具体应用;③通过Matlab代码实践提升算法编程与仿真分析能力。; 阅读建议:建议读者结合Matlab代码逐段理解算法实现细节,重点关注目标函数构建、约束条件处理及Pareto解集的生成过程,同时可尝试调整算法参数以观察优化结果的变化,深化对算法性能的理解。

港股十档行情tick数据,包含逐笔成交与买卖委托快照 逐笔记录含成交时间、价格、成交量、成交方向及委托单类型 十档委托快照提供买卖各十个价位的挂单价格与挂单数量,可观察盘口深度变化 分钟数据以一分钟为

港股十档行情tick数据,包含逐笔成交与买卖委托快照。逐笔记录含成交时间、价格、成交量、成交方向及委托单类型。十档委托快照提供买卖各十个价位的挂单价格与挂单数量,可观察盘口深度变化。分钟数据以一分钟为单位,包含开盘价、最高价、最低价、收盘价、成交量及成交额。历史行情覆盖近十五年,提供完整日线csv表格,字段包含日期、开盘价、最高价、最低价、收盘价、成交量、成交额,部分还包含调整因子或前收盘价。所有数据均为非实时历史数据。 数据源:CMES金融数据库

【Apollo学习笔记】——规划模块TASK之SPEED_HEURISTIC_OPTIMIZER

在Apollo星火计划学习笔记——Apollo路径规划算法原理与实践与【Apollo学习笔记】——Planning模块讲到……Stage::Process的函数会依次调用task_list中的TASK,本文将会继续以LaneFollow为例依次介绍其中的TASK部分究竟做了哪些工作。由于个人能力所限,文章可能有纰漏的地方,还请批评斧正。在配置文件中,我们可以看到LaneFollow所需要执行的所有task。本文将继续介绍LaneFollow的第10个TASK——动态规划规划目标加速度尽可能小。

sinat_52032317的博客 3426
上一篇: 关于Winnt/2k IDT的一些思考(续)
下一篇: 软件测试工程师有价无市 薪情差异大遇尴尬
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值