【原创】虚拟机检测技术剖析

VMware虚拟机隐藏技巧:5分钟搞定程序检测绕过(附.vmx参数大全) 本文深入解析VMware虚拟机隐匿技术,提供.vmx参数调优方案及实战对抗策略。通过调整关键参数如`monitor_control.restrict_backdoor`和`disable_acceleration`,有效绕过程序检测机制,同时平衡性能与隐匿性。适合开发者、安全研究人员优化虚拟化测试环境。 阅读详情
前言
在当今信息安全领域,特别是恶意软件分析中,经常需要利用到虚拟机技术,以提高病毒分析过程的安全性以及硬件资源的节约性,因此它在恶意软件领域中是应用越来越来广泛。这里我们所谓的虚拟机(Virtual Machine)是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。通过虚拟机软件(比如VMware,Virtual PC ,VirtualBox),你可以在一台物理计算机上模拟出一台或多台虚拟的计算机,这些虚拟机完全就像真正的计算机那样进行工作,例如你可以安装操作系统、安装应用程序、访问网络资源等等。攻击者为了提高恶意程序的隐蔽性以及破坏真实主机的成功率,他们都在恶意程序中加入检测虚拟机的代码,以判断程序所处的运行环境。当发现程序处于虚拟机(特别是蜜罐系统)中时,它就会改变操作行为或者中断执行,以此提高反病毒人员分析恶意软件行为的难度。本文主要针对基于Intel CPU的虚拟环境VMware中的Windows XP SP3系统进行检测分析,并列举出当前常见的几种虚拟机检测方法。

方法一:通过执行特权指令来检测虚拟机
Vmware为真主机与虚拟机之间提供了相互沟通的通讯机制,它使用“IN”指令来读取特定端口的数据以进行两机通讯,但由于IN指令属于特权指令,在处于保护模式下的真机上执行此指令时,除非权限允许,否则将会触发类型为“EXCEPTION_PRIV_INSTRUCTION”的异常,而在虚拟机中并不会发生异常,在指定功能号0A(获取VMware版本)的情况下,它会在EBX中返回其版本号“VMXH”;而当功能号为0x14时,可用于获取VMware内存大小,当大于0时则说明处于虚拟机中。VMDetect正是利用前一种方法来检测VMware的存在,其检测代码分析如下:
代码:
bool IsInsideVMWare()
{
  bool rc = true;

  __try
  {
    __asm
    {
      push   edx
      push   ecx
      push   ebx

      mov    eax, 'VMXh'
      mov    ebx, 0  // 将ebx设置为非幻数’VMXH’的其它值
      mov    ecx, 10 // 指定功能号,用于获取VMWare版本,当它为0x14时用于获取VMware内存大小
      mov    edx, 'VX' // 端口号
      in     eax, dx // 从端口dx读取VMware版本到eax
//若上面指定功能号为0x14时,可通过判断eax中的值是否大于0,若是则说明处于虚拟机中
      cmp    ebx, 'VMXh' // 判断ebx中是否包含VMware版本’VMXh’,若是则在虚拟机中
      setz   [rc] // 设置返回值

      pop    ebx
      pop    ecx
      pop    edx
    }
  }
  __except(EXCEPTION_EXECUTE_HANDLER)  //如果未处于VMware中,则触发此异常
  {
    rc = false;
  }

  return rc;
}
测试结果:
  名称:  1.jpg
查看次数: 3445
文件大小:  57.4 KB
                 图1
如图1所示,VMDetect成功检测出VMWare的存在。

方法二:利用IDT基址检测虚拟机
利用IDT基址检测虚拟机的方法是一种通用方式,对VMware和Virtual PC均适用。中断描述符表IDT(Interrupt Descriptor Table)用于查找处理中断时所用的软件函数,它是一个由256项组成的数据,其中每一中断对应一项函数。为了读取IDT基址,我们需要通过SIDT指令来读取IDTR(中断描述符表寄存器,用于IDT在内存中的基址),SIDT指令是以如下格式来存储IDTR的内容:
代码:
typedef struct
{
    WORD IDTLimit;    // IDT的大小
    WORD LowIDTbase;  // IDT的低位地址
    WORD HiIDTbase;  // IDT的高位地址
} IDTINFO;
由于只存在一个IDTR,但又存在两个操作系统,即虚拟机系统和真主机系统。为了防止发生冲突,VMM(虚拟机监控器)必须更改虚拟机中的IDT地址,利用真主机与虚拟机环境中执行sidt指令的差异即可用于检测虚拟机是否存在。著名的“红丸”(redpill)正是利用此原理来检测VMware的。Redpill作者在VMware上发现虚拟机系统上的IDT地址通常位于0xFFXXXXXX,而Virtual PC通常位于0xE8XXXXXX,而在真实主机上正如图2所示都位于0x80xxxxxx。Redpill仅仅是通过判断执行SIDT指令后返回的第一字节是否大于0xD0,若是则说明它处于虚拟机,否则处于真实主机中。Redpill的源码甚是精简,源码分析如下:
代码:
#include <stdio.h>
int main () {

  unsigned char m[2+4], rpill[] = "\x0f\x01\x0d\x00\x00\x00\x00\xc3";  //相当于SIDT[adrr],其中addr用于保存IDT地址
  *((unsigned*)&rpill[3]) = (unsigned)m;  //将sidt[addr]中的addr设为m的地址
  ((void(*)())&rpill)();  //执行SIDT指令,并将读取后IDT地址保存在数组m中

  printf ("idt base: %#x\n", *((unsigned*)&m[2]));   //由于前2字节为IDT大小,因此从m[2]开始即为IDT地址
  if (m[5]>0xd0) printf ("Inside Matrix!\n", m[5]); //当IDT基址大于0xd0xxxxxx时则说明程序处于VMware中
  else printf ("Not in Matrix.\n");
  return 0;
}
测试结果如图2所示:
  名称:  2.jpg
查看次数: 3442
文件大小:  54.6 KB
                                     图2
利用此IDT检测的方法存在一个缺陷,由于IDT的值只针对处于正在运行的处理器而言,在单CPU中它是个常量,但当它处于多CPU时就可能会受到影响了,因为每个CPU都有其自己的IDT,这样问题就自然而然的产生了。针对此问题,Offensive Computing组织成员提出了两种应对方法,其中一种方法就是利用Redpill反复地在系统上循环执行任务,以此构造出一张当前系统的IDT值变化统计图,但这会增加CPU负担;另一种方法就是windows API函数SetThreadAffinityMask()将线程限制在单处理器上执行,当执行此测试时只能准确地将线程执行环境限制在本地处理器,而对于将线程限制在VM处理器上就可能行不通了,因为VM是计划在各处理器上运行的,VM线程在不同的处理器上执行时,IDT值将会发生变化,因此此方法也是很少被使用的。为此,有人提出了使用LDT的检测方法,它在具有多个CPU的环境下检测虚拟机明显优于IDT检测方法,该方法具体内容参见下节内容。

方法三:利用LDT和GDT的检测方法
在 《Intel® 64 and IA-32  Architecture Software Developer’s Manual Volume 3A: System Programming Guide》第二章的Vol.3 2-5 一页(我的Intel开发手册是2008版的)中对于LDT和GDT的描述如下(以下内容为个人翻译):
在保护模式下,所有的内存访问都要通过全局描述符表(GDT)或者本地描述符表(LDT)才能进行。这些表包含有段描述符的调用入口。各个段描述符都包含有各段的基址,访问权限,类型和使用信息,而且每个段描述符都拥有一个与之相匹配的段选择子,各个段选择子都为软件程序提供一个GDT或LDT索引(与之相关联的段描述符偏移量),一个全局/本地标志(决定段选择子是指向GDT还是LDT),以及访问权限信息。
若想访问段中的某一字节,必须同时提供一个段选择子和一个偏移量。段选择子为段提供可访问的段描述符地址(在GDT 或者LDT 中)。通过段描述符,处理器从中获取段在线性地址空间里的基址,而偏移量用于确定字节地址相对基址的位置。假定处理器在当前权限级别(CPL)可访问这个段,那么通过这种机制就可以访问在GDT 或LDT 中的各种有效代码、数据或者堆栈段,这里的CPL是指当前可执行代码段的保护级别。
……
GDT的线性基址被保存在GDT寄存器(GDTR)中,而LDT的线性基址被保存在LDT寄存器(LDTR)中。 

由于虚拟机与真实主机中的GDT和LDT并不能相同,这与使用IDT的检测方法一样,因此虚拟机必须为它们提供一个“复制体”。关于GDT和LDT的基址可通过SGDT和SLDT指令获取。虚拟机检测工具Scoopy suite的作者Tobias Klein经测试发现,当LDT基址位于0x0000(只有两字节)时为真实主机,否则为虚拟机,而当GDT基址位于0xFFXXXXXX时说明处于虚拟机中,否则为真实主机。具体实现代码如下:
代码:
#include <stdio.h>

void LDTDetect(void)
{
    unsigned short ldt_addr = 0;
    unsigned char ldtr[2];

    _asm sldt ldtr
    ldt_addr = *((unsigned short *)&ldtr);
    printf("LDT BaseAddr: 0x%x\n", ldt_addr);

    if(ldt_addr == 0x0000)
    {
        printf("Native OS\n");
    }
    else
        printf("Inside VMware\n");
}

void GDTDetect(void)
{
    unsigned int gdt_addr = 0;
    unsigned char gdtr[4];

    _asm sgdt gdtr
    gdt_addr = *((unsigned int *)&gdtr[2]);
    printf("GDT BaseAddr:0x%x\n", gdt_addr);

    if((gdt_addr >> 24) == 0xff)
    {
        printf("Inside VMware\n");
    }
    else
        printf("Native OS\n");
}

int main(void)
{
    LDTDetect();
    GDTDetect();
    return 0;
}
测试结果如图3所示:
  名称:  3.jpg
查看次数: 3444
文件大小:  41.2 KB
                   图3

方法四:基于STR的检测方法
在保护模式下运行的所有程序在切换任务时,对于当前任务中指向TSS的段选择器将会被存储在任务寄存器中,TSS中包含有当前任务的可执行环境状态,包括通用寄存器状态,段寄存器状态,标志寄存器状态,EIP寄存器状态等等,当此项任务再次被执行时,处理器就会其原先保存的任务状态。每项任务均有其自己的TSS,而我们可以通过STR指令来获取指向当前任务中TSS的段选择器。这里STR(Store task register)指令是用于将任务寄存器 (TR) 中的段选择器存储到目标操作数,目标操作数可以是通用寄存器或内存位置,使用此指令存储的段选择器指向当前正在运行的任务的任务状态段 (TSS)。在虚拟机和真实主机之中,通过STR读取的地址是不同的,当地址等于0x0040xxxx时,说明处于虚拟机中,否则为真实主机。实现代码如下:
代码:
#include <stdio.h>
int main(void)
{
    unsigned char mem[4] = {0};
    int i;

    __asm str mem;
    printf (" STR base: 0x");
    for (i=0; i<4; i++)
    {
        printf("%02x",mem[i]);
    }

    if ( (mem[0]==0x00) && (mem[1]==0x40))
        printf("\n INSIDE MATRIX!!\n");
    else
        printf("\n Native OS!!\n");
    return 0;
}
测试结果如图4所示:
  名称:  4.jpg
查看次数: 3445
文件大小:  51.6 KB
                          图4

方法五:基于注册表检测虚拟机
在windows虚拟机中常常安装有VMware Tools以及其它的虚拟硬件(如网络适配器、虚拟打印机,USB集线器……),它们都会创建任何程序都可以读取的windows注册表项,因此我们可以通过检测注册表中的一些关键字符来判断程序是否处于虚拟机之中。关于这些注册表的位置我们可以通过在注册表中搜索关键词“vmware”来获取,下面是我在VMware下的WinXP中找到的一些注册表项:

项名:HKEY_CLASSES_ROOT\Applications\VMwareHostOpen.exe
项名:HKEY_CLASSES_ROOT\Installer\Products\C2A6F2EFE6910124C940B2B12CF170FE\ProductName
键值“VMware Tools”
项名:HKEY_CLASSES_ROOT\Installer\Products\C2A6F2EFE6910124C940B2B12CF170FE\SourceList\PackageName
键值:VMware Tools.msi
项名:HKEY_CURRENT_USER\Printers\DeviceOld
键值:_#VMwareVirtualPrinter,winspool,TPVM:
项名:HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\Scsi\Scsi Port 0\Scsi Bus 0\Target Id 0\Logical Unit Id 0\Identifier
键值:VMware Virtual IDE Hard Drive
项名:HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\Scsi\Scsi Port 1\Scsi Bus 0\Target Id 0\Logical Unit Id 0\Identifier
键值:NECVMWar VMware IDE CDR10
项名:HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Products\C2A6F2EFE6910124C940B2B12CF170FE\ProductName
键值:VMware Tools
项名:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\C2A6F2EFE6910124C940B2B12CF170FE\InstallProperties\DisplayName
键值:VMware Tools
项名:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Reinstall\0002\DeviceDesc
键值:VMware SVGA II
项名:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\2\Description
键值:VMware Accelerated AMD PCNet Adapter
项名:HKEY_LOCAL_MACHINE\SOFTWARE\VMware, Inc.\VMware Tools
项名:HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0000\DriverDesc
键值:VMware SVGA II
项名:HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-
08002BE10318}\0000\ProviderName
键值:VMware, Inc.
项名:HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}\0001\DriverDesc
键值:VMware Accelerated AMD PCNet Adapter
项名:HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4D36E97B-E325-11CE-BFC1-08002BE10318}\0000\DriverDesc
键值:VMware SCSI Controller
项名:HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Print\Monitors\ThinPrint Print Port Monitor for VMWare

除以上这些表项之外,还有很多地方可以检测,特别是虚拟机提供的虚拟化软硬件、服务之类,比如文件共享服务,VMware 物理磁盘助手服务,VMware Ethernet Adapter Driver,VMware SCSI Controller等等的这些信息都可作为检测虚拟机的手段。这里我们就以其中某表项为例编程举例一下,其它表项检测方法同理,具体代码如下:
代码:
.386
.model flat, stdcall
option casemap:none

   include  windows.inc
   include  user32.inc
   include  kernel32.inc
   include  advapi32.inc

   includelib  user32.lib
   includelib  kernel32.lib
   includelib  advapi32.lib

.data
szCaption     db "VMware Detector ",0
szInside         db "Inside VMware!",0
szOutside              db "Native OS!",0
szSubKey      db "software\VMWare, Inc.\VMware tools",0
hKey              dd    ?

.code
start:
  invoke RegOpenKeyEx, HKEY_LOCAL_MACHINE, addr szSubKey, 0,\
                 KEY_WRITE or KEY_READ, addr hKey
  .if eax == ERROR_SUCCESS
  invoke MessageBox, NULL,addr szInside, addr szCaption, MB_OK
  .else
  invoke MessageBox, NULL,addr szOutside, addr szCaption, MB_OK
  .endif
  invoke RegCloseKey,hKey
  invoke ExitProcess,NULL
end start
测试结果如图5所示:
  名称:  5.jpg
查看次数: 3421
文件大小:  33.5 KB
            图5

方法六:基于时间差的检测方式
本方法通过运行一段特定代码,然后比较这段代码在虚拟机和真实主机之中的相对运行时间,以此来判断是否处于虚拟机之中。这段代码我们可以通过RDTSC指令来实现,RDTSC指令是用于将计算机启动以来的CPU运行周期数存放到EDX:EAX里面,其中EDX是高位,而EAX是低位。下面我们以xchg    ecx,  eax 一句指令的运行时间为例,这段指令在我的真实主机windows 7系统上的运行时间为0000001E,如图6所示:
  名称:  6.jpg
查看次数: 3416
文件大小:  24.0 KB
              图6
而该指令在虚拟机WinXP下的运行时间为00000442,如图7所示:
  名称:  7.jpg
查看次数: 3440
文件大小:  29.0 KB
               图7
两者之间的运行时间明显差别很多,在虚拟机中的运行速度远不如真实主机的,一般情况下,当它的运行时间大于0xFF时,就可以确定它处于虚拟机之中了,因此不难写出检测程序,具体实现代码如下:
代码:
.586p
.model flat, stdcall
option casemap:none

include      windows.inc
include       kernel32.inc
include      user32.inc

includelib    kernel32.lib
includelib    user32.lib

      
.data
szTitle      db  "VMDetect With RDTSC", 0h
szInsideVM    db  "Inside VMware!", 0h
szOutsideVM    db  "Native OS!", 0h

.code

start:
  RDTSC
  xchg     ecx, eax
  RDTSC  
  sub    eax, ecx
  cmp    eax, 0FFh
  jg    Detected
  
  invoke  MessageBox, 0, offset szOutsideVM, offset szTitle, 0
  ret
  
Detected:
  invoke   MessageBox, 0, offset szInsideVM, offset szTitle, 0
  ret
end start
测试结果如图8所示:
  名称:  8.jpg
查看次数: 3427
文件大小:  29.5 KB
              图8

方法七:利用虚拟硬件指纹检测虚拟机
利用虚拟硬件指纹也可用于检测虚拟机的存在,比如VMware默认的网卡MAC地址前缀为“00-05-69,00-0C-29或者00-50-56”,这前3节是由VMware分配的唯一标识符OUI,以供它的虚拟化适配器使用。在我的VMWare WinXP下的MAC地址为00-0C-29-5B-D7-67,如图9所示:
  名称:  9.jpg
查看次数: 3455
文件大小:  51.3 KB
                                 图9
但由于这些可经过修改配置文件来绕过检测。另外,还可通过检测特定的硬件控制器,BIOS,USB控制器,显卡,网卡等特征字符串进行检测,这些在前面使用注册表检测方法中已有所涉及。另外之前在看雪论坛上也有朋友提到通过检测硬盘Model Number是否含有“vmware”或“virtual”等字样来实现检测虚拟机的功能,网址见这(附源码): http://bbs.pediy.com/showthread.php?t=110046。

总结
国外SANS安全组织的研究人员总结出当前各种虚拟机检测手段不外乎以下四类:
●  搜索虚拟环境中的进程,文件系统,注册表;
●  搜索虚拟环境中的内存
●  搜索虚拟环境中的特定虚拟硬件
●  搜索虚拟环境中的特定处理器指令和功能
因为现代计算系统大多是由文件系统,内存,处理器及各种硬件组件构成的,上面提到的四种检测手段均包含了这些因素。纵观前面各种检测方法,也均在此四类当中。除此之外,也有人提出通过网络来检测虚拟机,比如搜索ICMP和TCP数据通讯的时间差异,IP ID数据包差异以及数据包中的异常头信息等等。随着技术研究的深入,相信会有更多的检测手段出现,与此同时,虚拟机厂商也会不断进化它们的产品,以增加anti-vmware的难度,这不也正是一场永无休止的无烟战争!

恶意样本分析手册-虚拟机检测篇(下) 在当今信息安全领域,特别是恶意软件分析中,经常需要利用到虚拟机技术,以提高病毒分析过程的安全性以及硬件资源的节约性,因此它在恶意软件领域中是应用越来越来广泛。这里我们所谓的虚拟机(Virtual Machine)是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。 虚拟机检测 一、VMWare 1.1查找注册表 通过检测注册表“HARDWARE\DEVICE 阅读详情

相关推荐

【原创】ESXi7克隆虚拟机加入VCSA时数据存储UUID冲突的排查与修复

本文详细解析了ESXi7克隆虚拟机加入VCSA时数据存储UUID冲突的问题,提供了Web界面和命令行两种解决方案,并分享了预防措施与最佳实践。通过深入分析VMFS存储的UUID生成机制和VCSA的校验逻辑,帮助管理员有效解决数据存储冲突问题,确保虚拟化环境稳定运行。

weixin_29306317的博客 350

虚拟机检测技术

第一次尝试恶意代码分析就遇到了虚拟机检测,于是就想着先学习一下检测的技术然后再尝试绕过。学习后最终发现,似乎最好的方法不应该是去patch所有检测方法,而是直接调试并定位检测函数再绕过。但既然已经研究了两天,索性将收集到的资料整理一下,方便后人查找。

全粘工程师 4733

Volitale关键字剖析

文章目录volitale关键字内存语义写内存语义读内存语义如何保证可见性和禁止指令重排序?为什么不能保证原子性原理:内存屏障使用例子 volitale关键字 内存语义 如果不使用volitale申明变量,那么这个变量被修改后,其他线程可能并不会被通知到,甚至在别的线程中,看到变量的修改顺序都会是反的,但一旦使用volitale,虚拟机就会特别小心的处理这种情况 写内存语义 当写一个volitale变量时,JMM会把线程对应的本地内存中的共享变量值刷新到主内存中 读内存语义 当读一个volitale

ZHOUJIAN_TANK的博客 1538

虚拟机基础篇-过鲁大师检测

可以看到很多个vmware的标志,这就是最基础的虚拟机检测了,这里也就是比较浅的过鲁大师,过鲁大师应该是选中那个生成报表,文本中没有vm标志才算过鲁大师基础第一步,还不算细节的硬件仿真(硬件仿真的意思不是vm改了就是仿真了,是参照真实的硬件进行修改,和物理主机有一样的参数,才算是硬件仿真)打开虚拟机安装目录的x64目录的vmware-vmx.exe文件,这就是业内说的虚拟机底层,虚拟机的硬件信息就在这文件中,修改其中的硬件信息以达到欺骗软件的目的,话不多说,开干。可以看到,显示器是没有的,现在打开虚拟机,

qq_54001206的博客 5605

VM虚拟机检测全套工具

工具包含Se VMP TMD等等..

IDEA 2023.2最新破解安装教程(含详细配置步骤及常见问题解决)

本文详细介绍了IDEA 2023.2的安装流程及高效开发环境搭建指南,涵盖基础配置、项目结构优化、核心功能使用、插件推荐、性能优化等全方位内容,帮助开发者快速掌握这一强大的Java开发工具。

x2y3z4a5b的博客 1744

[原创]虚拟机检测技术剖析

标题:【原创】虚拟机检测技术剖析 作者:riusksk (泉哥) 主页:http://riusksk.blogbus.com前言 在当今信息安全领域,特别是恶意软件分析中,经常需要利用到虚拟机技术,以提高病毒分析过程的安全性以及硬件资源的节约性,因此它在恶意软件领域中是应用越来越来广泛。这里我们所谓的虚拟机(Virtual Machine)是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔...

lengye7的博客 3445

C++ muduo网络库知识分享01 - Linux平台下muduo网络库源码编译安装

Muduo is a multithreaded C++ network library based on the reactor pattern. muduo库的介绍就是:一个基于reactor反应堆模型的多线程C++网络库。 muduo网络库是C++语言开发的一个非常优秀的网络库,作者陈硕,muduo网络库在多线程环境下性能非常高,该系列文章会分享一些muduo库源码的知识,包括它的线程池源码...

大秦坑王的专栏 3万+

虚拟机检测技术剖析

来自:http://hi.baidu.com/pythond/blog/item/ad2e441714ec9316962b4344.html 虚拟机检测技术剖析 2010-09-08 9:15 标 题: 【原创】虚拟机检测技术剖析 作 者: riusksk 时 间: 2010-09-06,23:36:05 链 接: http://bbs.pediy.com/sh

anhkgg的专栏 1135

Xilinx GTY Transceiver时钟方案与功耗优化实践

本文详细解析了Xilinx GTY Transceiver的时钟方案设计与功耗优化实践,涵盖从基础配置到高速24.33024Gbps和中速10.1376Gbps的实战案例。通过Transceivers Wizard的IP设计技巧和动态功耗优化方法,帮助工程师有效降低FPGA系统功耗,提升高速串行通信的稳定性与效率。

weixin_28736355的博客 228

Hodgkin-Huxley Model

介绍了经典的动力学模型:HH Model

weixin_73557167的博客 2473

HOOK函数的基本含义,游戏中如何进行反外挂?

钩子函数是如何访问其他进程中的事件的? 钩子hook其实是一种编程思想; 体现了博弈和对抗; 作弊者: 反作弊者: 为什么访问游戏内存会被检测到, 因为是被外挂调用的,导致外层变量和预期不止一次,从而检测出外挂; --- 自己写的dll注入到游戏的进程中为什么也会被检测出来? -- https://github.com/TonyChen56/GameReverseNote...

Kp0fS的草稿纸 2283

SAPIEN ManiSkill3 入门教程(一)

请注意,table.set_pose(pose) 设置的是演员在世界帧中的坐标系姿势。移除的实体可以再次添加到场景中,但已在场景中的实体则不能再次添加。显示器可以是物理的(如显示器),也可以是虚拟的(如 VNC)。我们可以通过 get_pose()、get_linear_velocity() 和 get_angular_velocity()获取演员的运动量(姿势、线速度、角速度)。现在,让我们创建一个斜坡。例如,您可能需要一个简单的碰撞形状来进行快速模拟,但却需要一个复杂的视觉形状来进行逼真的渲染。

机器人控制与仿真应用 3069

第4章2节《MonkeyRunner源码剖析》ADB协议及服务: ADB服务SERVICES.TXT翻译参考(原创)

ADB服务器端在接受到ADB客户端发送过来的命令后会进行相应的处理,如果是主机服务就在ADB服务器内部进行处理,如果是本地服务就会发送给Android目标机器端的adbd守护进程进行处理。 因为ADB相关的源代码不在我们源码分析的范围之内,所以我们很有必要把官方提供的ADB服务器支持的所有服务在这里描述下。虽然本人对自己的英语水平相当有信心,但总担心有词不达意的时候,所以翻译的过程中把英文也保留了下来以供大家参考。

天地会珠海分舵 1985

数字图像处理 基于OpenCV的景深融合算法

还有的思路是对图像序列中的每一张图像分别进行拉普拉斯金字塔拆分,提取出每一张图像的高频信息和低频信息,得到所述图像序列对应的高频信息集合和低频信息集合。然后根据所述高频信息集合得到合成后的高频信息,对所述低频信息集合进行导向滤波处理得到合成后的低频信息,根据所述合成后的高频信息和低频信息做拉普拉斯金字塔重构,得到一张超景深图像。这里声明了几个变量,ImMer是最终合成的图像,coll是中间处理的变量,Coll_Ori是保存原图像数据的变量,dstWidth目标图像宽度(一般都是与原始图像大小一致)。

学以致用 知行合一 3899

KEPServerEX作为MQTT客户端

打开软件: 测试没有连接上MQTT代理。

低码开发 1681

Java核心技术深度解析与行业应用趋势探究

本文将通过技术解剖+行业穿透的双重视角,揭示Java如何成为企业数字化转型的隐形引擎。Java在JDK17中引入的Foreign Language API,允许在医疗设备软件中安全调用RTOS底层驱动,当强生公司将其血糖监测装置Java应用层通过该接口与嵌入式Linux系统对接时,内存泄漏率从2.3%降至0.07%,获得FDA罕见的五星级安全认证。OpenTelemetry的内置支持让分布式系统追踪精度提升至毫秒级,这在全球支付系统Visa的案例中,将每秒交易处理能力提升63%的同时,延迟率下降41%。

jvuTYbSq的博客 272

从零到一:ESP32与豆包大模型的RTC连续对话实现指南

文本实现ESP32S3 SparkBot与豆包大模型的RTC连续对话

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 4363

Android软件安全与逆向分析

《Android软件安全与逆向分析》基本信息作者: 丰生强 [作译者介绍]丛书名: 图灵原创出版社:人民邮电出版社ISBN:9787115308153上架时间:2013-2-7出版日期:2013 年2月开本:16开页码:1版次:1-1所属分类:计算机 > 软件与程序设计 > 移动开发 > Android 更多关于 》》》《Android软件安全与逆向分析》内容简介书籍计算机...

weixin_30443747的博客 139

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

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

[特殊字符] 深入理解 JIT 优化技术与方法内联机制

本文深入解析JIT(即时编译器)工作原理,重点探讨方法内联优化技术。JIT通过将热点代码编译为机器码提升性能,其中方法内联通过消除调用开销来显著加速高频执行的代码。文章详细介绍了内联的条件、优化效果及潜在风险,如代码膨胀和去优化问题。为充分发挥JIT优势,建议编写短小方法、避免复杂多态。理解这些底层机制有助于开发高效Java代码。JIT及其优化技术是JVM性能的关键,值得中高级开发者深入研究。

持续分享有趣的技术干货 975

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

移动安全入门指南

声明:原创文章,转载请备注来源:https://shuwoom.com/?p=893 以前花了将近一年多的时间学习移动安全,期间也遇到了各种坑,特别是学习Android加固的知识,由于Android加固技术门槛比较高,在网上想要找到系统的资料还是很困难的,一些相关的入门资料也比较少。在这里,我也把自己以前学习的经历和遇到的坑做一些总结,希望能给一些刚入门移动安全行业的同学一些参考,避免入坑。 ...

ruglcc's blog 1872

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

第4章2节《MonkeyRunner源码剖析》ADB协议及服务: ADB服务SERVICES.TXT翻译参考(原创)...

天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写《深入理解 MonkeyRunner》书籍“。但因为诸多原因,没有如愿。所以这里把草稿分享出来,所以错误在所难免。有需要的就参考下吧,转发的话还请保留每篇文章结尾的出处等信息。 ADB服务器端在接受到ADB客户端发送过来的命令后会进行相应的处理,如果是主机服务就在ADB服务器内部进行处理,如果是本地服务就会...

weixin_30888707的博客 117

《文明6》DLC解锁补丁技术解析:原理、安装与问题排查

在软件授权与资源管理领域,DLC(可下载内容)验证机制是理解现代软件保护与资源加载的关键技术点。其核心原理通常涉及平台API校验、本地许可文件读取和资源存在性检查等环节。从技术价值看,分析这类机制有助于深入理解软件安全、逆向工程及程序行为修改,是学习计算机系统运行原理的经典案例。在实际应用场景中,游戏模组社区常通过API Hook、清单修改等技术手段,实现对特定软件功能的访问模拟。本文以《文明6》为例,具体探讨了DLC解锁补丁的典型文件结构、安装逻辑及常见问题排查方法,为相关技术学习与实践提供参考。

weixin_30652491的博客 396

《Java深度精髓核心技术解析与高性能编程实践》

本文系统论证了Java核心技术在工程实践中的应用路径,通过JVM底层优化、并发模型设计、监控工具链构建和编程范式革新四个维度的实证研究,验证了理论模型驱动的优化策略在真实场景中的有效性。- 锁竞争优化:通过CAS(Compare and Swap)无锁算法实现`ConcurrentHashMap`的高并发性能,其分段锁(Segment)设计将rehash操作的锁粒度从全局降低至单分段,吞吐量提升300%。如需补充具体章节或数据细节,可进一步扩展。在此模型中,堆内存的垃圾回收机制是程序性能的核心控制点。

DrlBdXeU的博客 335

《艾尔登法环》低技术 AI 揭秘:下推自动机如何实现高效战斗决策?

FromSoftware 在魂系列游戏中以多样且具挑战性的 NPC 战斗闻名,但其 AI 决策机制或许是“低技术”的。大部分代码用 Havok Script 编写,便于了解背后原理。需注意,以下内容非原创研究,是阅读他人提取、反编译和逆向工程的代码所得。

IT界那些事儿 35

3分钟定位Windows热键冲突:从症状到解决方案的完整指南

在日常电脑使用中,你是否遇到过这样的情况:按下Ctrl+S想保存文档却毫无反应,按F5刷新页面时却意外打开了某个应用?这些令人沮丧的问题往往源于Windows系统中的热键冲突。本文将系统介绍如何使用专业开源工具Hotkey Detective,快速诊断并解决各类热键冲突问题,让你重新掌控键盘快捷键。 ## 一、问题诊断:热键冲突的症状与根源 ### 1.1 识别热键冲突的典型症状 热键冲突最常

gitblog_00286的博客 471
上一篇: 【原创】Win 7下定位kernel32.dll基址及shellcode编写
下一篇: 【原创】wingdb开发过程中遇到一个比较“头疼”的bug
OSReact
博客等级 码龄14年 34粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值