search
HomeBackend DevelopmentPHP Tutorial优化NFR之一--MSSQLHelloBufferOverflow_PHP
优化NFR之一--MSSQLHelloBufferOverflow_PHPJun 01, 2016 pm 12:38 PM
optimizationattackloopholesillustratethislength


1.  前言  3
2.  报警信息  3
3.  NFR的检测  4
4.  协议分析  8
5.  漏洞说明  15
6.  漏洞分析  18
7.  小结  20


1.  前言
NFR(Network Flight Recorder)是一个老牌的商业网络IDS产品,最初由Firewall的牛人Marcus J. Ranum创建,是作为一个通用的网络流量分析和记录软件来实现的,为了最大限度地发挥分析工具的灵活性,NFR提供了完善强大的N-Code脚本语言,在很多的评测中表现出色。虽然L0pht为NFR提供过数百个签名库,但是缺乏一个可靠的签名集一直是他的软肋。

使用NFR有一段时间后,发现NFR存在着不少问题。且不说AI对中文的兼容性差而经常退出,也不说NFR版本升级而攻击事件说明却一直用旧版本的说明,单是IDS中最关键的攻击签名库,却让我大跌眼镜。除了升级缓慢以外,甚至还存在不少错误的签名。本系列文章针对其中我发现的部分问题进行分析和阐述,以便各位更好地利用NFR产品,同时也想和各位同仁讨论IDS中攻击签名库的编写。由于知识和时间的限制,错误之处在所难免,还希望得到各位的指教,任何意见或建议请发至:benjurry@xfocus.org

SQL Server是微软为对抗Oracle推出的数据库, 占领的市场份额已经仅次于Oracle,居世界第二,但是其安全性也一直受到用户的置疑。从1996年,Microsoft公司推出的SQL Server 6.5版本到1998年推出的SQL Server 7.0,以及到2000年8月推出了SQL Server 2000,在版本和功能不断升级的情况下,安全问题却没有得到很好地改善,不断发布针对SQL Server的安全公告和补丁。在2003年1月24日,针对SQL Server的“Slammer”蠕虫在Internet上肆虐,导致网络流量激增,严重影响了世界范围内的计算机和网络系统。SQL Server的漏洞引起了各大安全公司和厂商的重视,因此NFR也立即发布了多个针对SQL Server的攻击签名,其中包括了2002年8月7日Immunity公司Dave Aitel发现的Hello Buffer Overflow漏洞。但是在使用过程中,我发现NFR针对该漏洞的报警非常多,于是我对此进行了分析,于是写成了这个文章,以做记录。


2.  报警信息
下面是NFR针对MS SQL Hello Buffer Overflow的报警信息:

Severity:      Attack
Time:        13:54:21 15-Jul-2003
Source File:    packages/mssql/sql2k.nfr
Line:        226
Host:        benjurry-xfocus
Alert ID:      mssql_sql2k:buffered_hello
Source ID:     mssql_sql2k:source_me
Source:       mssql_sql2k:source_me
Source Description: Sqlserver 2k overflow detector
Source PID:     36531
Alert Message:   Saw 8 Mssql HELLO overflows from 192.168
          0.110 in 900 seconds
:          3
Source IP:     192.168.0.110
Destination IP:       --

其中包括了事件的严重等级、时间、NFR Sensor名字、攻击源IP、目的IP和一些其他报警信息。
在实际的使用中,一天产生了几百条这种报警,看来这是个误报,我们可以好好的分析一下了。


3.  NFR的检测
我们首先打开NFR发布的签名库 MSSQL.fp(或者也可以在AI的package中查看) 看一下NFR的针对这个漏洞的攻击签名:


…..

变量定义等…



sqlserv_schema = library_schema:new(1, ["time","ip","int","ip","int", "str"],
  scope());
sqlserv_rec = recorder("bin/list %c", "sqlserv_schema");

HELLO_SIG = "\x12\x01\x00\x34\x00\x00\x00\x00\x00\x00\x15";
MIN_LEN = strlen(HELLO_SIG);


…….

filter hello tcp (client, dport: 1433) {
  declare $Blob inside tcp.connsym;
  if ($Blob == NULL) {
    $Blob = tcp.blob;
  } else {
    $Blob = cat($Blob, tcp.blob);
  }

  if (strlen($Blob)     return;

  if (prefix($Blob, HELLO_SIG)) {
    if (COUNTHELLO[tcp.connsrc]) {
      COUNTHELLO[tcp.connsrc] = COUNTHELLO[tcp.connsrc] + 1;
    } else {
      COUNTHELLO[tcp.connsrc] = 1;
    }
    if (do_alert(hello_overflow_alert, tcp.connsrc)) {
      alert(source_me, hello_overflow_alert, tcp.connsrc,
        tcp.connsport, tcp.conndst, tcp.conndport,
        "--AlertDetails",
        "ALERT_ID", "40-8",
        "ALERT_CONFIDENCE", 60,
        "ALERT_SEVERITY", "medium",
        "ALERT_IMPACT", "unknown",
        "ALERT_EVENT_TYPE", "attack",
        "ALERT_ASSESSMENT", "unknown",
        "IP_ADDR_SRC", tcp.connsrc,
        "PORT_SRC", tcp.connsport,
        "IP_ADDR_DST", tcp.conndst,
        "PORT_DST", tcp.conndport,
        "IP_PROTO_NUM", 6);
    }
    record packet.sec, tcp.conndst, tcp.conndport, tcp.connsrc,
      tcp.connsport, $Blob to sqlserv_rec;
    misc_attacks:rec(packet.sec, scope(),
            "Mssql HELLO overflow!", tcp.connsrc, tcp.conndst);
  }
}

从上面的N-CODE中我们可以看到,NFR在做这个检测的时候步骤如下:

1、定义了一个攻击特征码:
HELLO_SIG = "\x12\x01\x00\x34\x00\x00\x00\x00\x00\x00\x15";
和攻击特征码的长度:
MIN_LEN = strlen(HELLO_SIG);

2、从TCP的载荷数据中取出数据,把这个数据的长度和特征码长度比较,如果这个数据长度小于攻击特征码的长度,那么就不再进行下一步的检测;

3、否则,把这个数据和特征码进行字符串匹配,如果一致则认为是攻击行为,然后进行阻止或者报警。
接下来我们分析一下NFR IDS Record的数据,在AI中选择package->Query->MSSQL->MSSQL Server 200,定好条件,按Table查到数据,随便选取一条,copy出来得到如下内容:

Time:        15-Jul-2003 13:54:21
NFR:        benjurry-xfocus
Destination Address:192.168.0.135
Destination Port:  1433
Source Address:   192.168.0.110
Source Port:    1391
Payload:      
          \x12\x01\x004\x00\x00\x00\x00\x00\x00\x15\x00\x06\x01\x00\x1b\x00
          \x01\x02\x00\x1c\x00\x0c\x03\x00(\x00\x04\xff\x08\x00\x00\xc2\x00
          \x00\x00MSSQLServer\x00x\x03\x00\x00

上面这条记录包含了攻击的时间,报告攻击行为的NIDS sessor名字,目的IP、目的端口、源ip和源端口,而我们关心的是有效载荷Payload,因为它是NIDS用来和攻击签名库比较的数据。但是NFR在这里有几个小问题:

1.  会把payload中的能转换成ASCII字符的16进制数转换成ASCII码;

2.  不能处理Unicode的字符,这个将在以后的分析中可以看到。

在这个例子中为了分析方便,我们把上面的payload中的字符特征码部分转换成16进制数:
\x12\x01\x00\x34\x00\x00\x00\x00\x00\x00\x15\x00\x06\x01\x00\x1b
\x00\x01\x02\x00\x1c\x00\x0c\x03\x00\x28\x00\x04\xff\x08\x00\x00
\xc2\x00\x00\x00MSSQLServer\x00x\x03\x00\x00


NFR抓到数据组包后,发现是SQL Server包,便把里面的内容和SQL Server的攻击库进行比较,很明显,上面所列的数据和攻击库是相符合的,因此一个报警便产生了,但是这真是一个攻击行为吗?我们继续看下面的分析。


4.  协议分析

根据Xfocus的协议分析项目(将会在近期公布项目成果),MS SQL 2000用的是TDS8.0,它的格式如下:
-------------------------------------------------
| TDS包头(8字节) |  TDS负载数据       |
-------------------------------------------------
其中MS SQL SERVER 2000 TDS的包头结构如下:
-------------------------------------------------------------------
| TOKEN | STATUS | LENGTH | SIGNED NUM | PACKET NUM | WINDOW SIZE |
-------------------------------------------------------------------
其中TOKEN字段域1个字节,用来表示TDS操作请求种类。在这个漏洞中是0x12,也就是NFR记录中的有效负载中的第一个字节0x12, 0x12是预登录验证命令请求。其目的是获得当前MS SQL SERVER2000的一些设置值,比如SQL SERVER版本,是否支持加密等信息,作为客户端在构造TDS包的一个依据。SQL Server在接受到该类型的包的时候,将会由SSlibnet.dll中的相应函数做处理,在我的系统SQL Server 2000(没有SP)的情况下,相应函数如下:


.text:42CF6DDD ; Attributes: bp-based frame
.text:42CF6DDD
.text:42CF6DDD         public ConnectionPreLogin
.text:42CF6DDD ConnectionPreLogin proc near
.text:42CF6DDD
.text:42CF6DDD var_4      = dword ptr -4
.text:42CF6DDD arg_0      = dword ptr 8
.text:42CF6DDD arg_4      = dword ptr 0Ch
.text:42CF6DDD arg_8      = dword ptr 10h
.text:42CF6DDD arg_C      = dword ptr 14h
.text:42CF6DDD arg_10     = dword ptr 18h
.text:42CF6DDD
.text:42CF6DDD         push  ebp
.text:42CF6DDE         mov   ebp, esp
.text:42CF6DE0         push  ecx
.text:42CF6DE1         mov   eax, [ebp+arg_0]
.text:42CF6DE4         mov   ecx, [eax+94h]
.text:42CF6DEA         mov   [ebp+var_4], ecx
.text:42CF6DED         cmp   [ebp+var_4], 1
.text:42CF6DF1         jz   short loc_42CF6E01
.text:42CF6DF3         cmp   [ebp+var_4], 1
.text:42CF6DF7         jle   short loc_42CF6E3D
.text:42CF6DF9         cmp   [ebp+var_4], 3
……


STATUS字段域1个字节,当它为0x01的时候表示此包为当前TDS会话中的最后一个TDS包。
LENGTH字段域2个字节,表示TDS包的总长度,包括TDS包头的长度。
SIGNED NUM字段域2个字节,目前保留未用。
PACKET NUM字段域1个字节,表示此TDS包在当前TDS操作请求中的序号
WINDOW SIZE字段域1个字节,目前保留未用。
MS SQL SERVER 0X12 TDS的包主要包格式如下:
------------------------------------------------------
| TDS包头(8字节)| 字段指示头 |    信息      |
------------------------------------------------------
其中字段指示头是一个可以变长的表,表的每一项代表了在一个字段在信息中的偏移地址和长度信息,在SQL2000中主要是4个字段,其对应的字段指示头的结构如下:
{
  BYTE CNETLIBVERNO;
  WORD CNETLIBVEROFFSET;
  WORD CNETLIBVERLEN;
  BYTE CENYFLAGNO;
  WORD CENYFLAGOFFSET;
  WORD CENYFLAGLEN;
  BYTE SINSTNAMENO;
  WORD SINSTNAMEOFFSET;
  WORD SINSTNAMELEN;
  BYTE CTHREADIDNO;
  WORD CTHREADIDOFFSET;
  WORD CTHREADIDLEN;
  BYTE FILEDEND;
}
信息内容的结构如下:
{
  BYTE CNETLIBVER[CNETLIBVERLEN]
  BYTE CENYFLAG[CENYFLAGLEN];
  BYTE SINSTNAME[SINSTNAMELEN]
  DWORD CTHREADID[CTHREADIDLEN];
}
其中:
CNETLIBVERNO字段域
偏移:0
长度:1
含义:客户端使用的网络连接库(NETLIB)的版本号信息的字段编号。
说明:
备注:该值固定为0

CNETLIBVEROFFSET字段域
偏移:1
长度:2
含义:客户端使用的网络连接库(NETLIB)的版本号信息的字段偏移。
说明:字段格式是网络字节顺序
备注:

CNETLIBVERLEN字段域
偏移:3
长度:2
含义:客户端使用的网络连接库(NETLIB)的版本号信息的字段长度。
说明:字段格式是网络字节顺序
备注:该值固定为6

CENYFLAGNO字段域
偏移:5
长度:1
含义:客户端使用强制加密标记字段的字段号。
说明:
备注:该值固定为1

CENYFLAGOFFSET字段域
偏移:6
长度:2
含义:客户端使用强制加密标记字段的偏移。
说明:字段格式是网络字节顺序
备注:

CENYFLAGLEN字段域
偏移:8
长度:2
含义:客户端使用强制加密标记字段的长度。
说明:字段格式是网络字节顺序
备注:该值固定为1

SINSTNAMENO字段域
偏移:0XA
长度:1
含义:客户端要求使用服务器的实例名字段的字段号。
说明:
备注:该值固定为2

SINSTNAMEOFFSET字段域
偏移:0XB
长度:2
含义:客户端要求使用服务器的实例名字段的偏移。
说明:字段格式是网络字节顺序
备注:

SINSTNAMELEN字段域
偏移:0XD
长度:2
含义:客户端要求使用服务器的实例名字段的长度。
说明:字段格式是网络字节顺序
备注:

CTHREADIDNO字段域
偏移:0XF
长度:1
含义:客户端进程的线程ID字段的字段号。
说明:
备注:该值固定为3

CTHREADIDOFFSET字段域
偏移:0X10
长度:2
含义:客户端进程的线程ID字段的的偏移。
说明:字段格式是网络字节顺序
备注:

CTHREADIDLEN字段域
偏移:0X12
长度:2
含义:客户端进程的线程ID字段的长度。
说明:字段格式是网络字节顺序
备注:该值固定为4

FILEDEND字段域
偏移:0X14
长度:1
含义:此字段标记字段指示头已经结实,下面的就是字段的信息。
说明:结束标记是0XFF
备注:

CNETLIBVER字段域
偏移:0X15
长度:6
含义:客户端使用的网络连接库(NETLIB)的版本号。
说明:其版本号取的是DBNETLIB.DLL的版本
备注:其格式是网络字节格式,如版本号为80.528.00,则为
  08 00 02 10 00 00

CENYFLAG字段域
偏移:0X1B
长度:1
含义:客户端强制加密标志。
说明:0代表客户端不强制加密,1代表客户端使用强制加密
备注:

SINSTNAME字段域
偏移:0X1C
长度:SINSTNAMELEN
含义:客户端要求使用的实例名。
说明:单字节格式
备注:默认实例使用MSSQLserver这个名字

CTHREADID字段域
偏移:0X1C+SINSTNAMELEN
长度:4
含义:客户端进程的线程ID。
说明:字段格式是主机字节顺序
备注:

由上面的格式可以看出,一个用默认实例名MSSQLserver连接的SQL TDS包格式将是如下的格式:
\x12\x01\x00\x34\x00\x00\x00\x00
\x00\x00\x15\x00\x06\x01\x00\x1b
\x00\x01\x02\x00\x1c\x00\x0c\x03
\x00\x28\x00\x04\xff\x08\x00\x00
\xc2\x00\x00\x00MSSQ
LServer\x00
\x78\x03\x00\x00

而NFR的攻击签名库却是
HELLO_SIG = "\x12\x01\x00\x34\x00\x00\x00\x00\x00\x00\x15";
明显是正常TDS 0x12预登陆包的一部分,这就难怪会有这么多报警了,那NFR的这个攻击签名是如何得到的呢?
我们还是从它的漏洞说明入手吧!


5.  漏洞说明
下面是NFR N-CODE中对这个漏洞的说明:
FALSE POSITIVES

False positives are unlikely due to the nature of the attack

REFERENCES
Bugtraq Post
  http://cert.uni-stuttgart.de/archive/bugtraq/2002/08/msg00125.html
Exploit
http://www.scan-associates.net/papers/sql2kx2.txt
我们可以看到这个漏洞来自于http://www.immunitysec.com/ 的Dave Aitel,而从http://cert.uni-stuttgart.de/archive/bugtraq/2002/08/msg00125.html所列的MS SQL Server Hello Overflow NASL script中我们可以看到这个漏洞的关键就在于以下几个语句:


pkt_hdr = raw_string(
0x12 ,0x01 ,0x00 ,0x34 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x15 ,0x00 ,0x06 ,0x01 ,0x00 ,0x1b,
0x00 ,0x01 ,0x02 ,0x00 ,0x1c ,0x00 ,0x0c ,0x03 ,0x00 ,0x28 ,0x00 ,0x04 ,0xff ,0x08 ,0x00 ,0x02,
0x10 ,0x00 ,0x00 ,0x00
);

pkt_tail = raw_string (
0x00 ,0x24 ,0x01 ,0x00 ,0x00
);



…..
if(get_port_state(port))
{
  soc = open_sock_tcp(port);

  if(soc)
  {
    
  attack_string=crap(560);
     sql_packet = pkt_hdr+attack_string+pkt_tail;
  send(socket:soc, data:sql_packet);

    r = recv(socket:soc, length:4096);
    close(soc);
  display ("Result:",r,"\n");
    if(!r)
    {
     display("Security Hole in MSSQL\n");
      security_hole(port:port, data:report);
    }
  }

其中pkt_hdr是根据TDS协议构造的包,中间加了560个字符X,pkt_tail是构造的TDS包尾。

从这里我们可以看到,可怜的NFR居然不负责任地把MS SQL Server Hello Overflow NASL script中的pkt_hdr取出11个字符,毅然决然地把它们作为其签名。更为可笑的是居然还写着“False positives are unlikely due to the nature of the attack ”。
这就是在许多评测中遥遥领先的NFR?后来和stardust聊起这个事情的时候,认为这个现象和很多评测机构在评测IDS产品的时候,重视对产品漏报的检测而忽视对误报的评测有关。因为在评测产品时,基本上都是大部分都是黑箱评测,要检测漏报只要收集几个Exploits就可以进行,但要检测漏报却要产生正常的包,有些系统比如这里的Sql Server,如果不了解它的协议包格式,是很难产生的。因此一些IDS产生便钻了这样的空子,只要收集一些Exploits,把其中的攻击代码作为攻击签名直接发布,而不去分析漏洞产生的真正原因。

下面我们来分析一下这个漏洞产生的原因,然后我们就可以根据这个分析,写出比较完善的攻击签名。


6.  漏洞分析
用IDA对SSlibnet.dll反汇编,我们可以看到:


.text:42CF6F49 loc_42CF6F49:     ; CODE XREF: sub_42CF6E4F+EA j
.text:42CF6F49         mov   eax, [ebp+0xc]
.text:42CF6F4C         add   eax, [ebp-0x218]
.text:42CF6F52         push  eax
.text:42CF6F53         lea   ecx, [ebp-0x214]
.text:42CF6F59         push  ecx
.text:42CF6F5A         call  strcpy
.text:42CF6F5F         add   esp, 8
.text:42CF6F62         push  offset unk_42D01104
.text:42CF6F67         lea   edx, [ebp-0x214]
.text:42CF6F6D         push  edx
.text:42CF6F6E         call  strcmp
.text:42CF6F73         add   esp, 8


这个漏洞的原因就在这里,当程序用strcpy拷贝的时候,如果源字符串超出0x214(也就是532)后,目标地址后的环境变量就会被覆盖导致溢出。由于这个漏洞很早,经历了“Slammer”蠕虫后,基本上所有的系统都补掉了这个漏洞,因此这里就不在提供攻击代码了,有兴趣的朋友可以自己分析和编写一下。


另外需要在这里说明的是,如果分析了TDS协议和这个漏洞的成因,完善的攻击程序中的TDS包的长度是根据计算生成的,明显不会是”\x00\x34”,以避过SQL Server中针对TDS包长度的校验(当然在这个版本的SQL Server中还不包含这个校验),或者攻击程序把这攻击代码分成多个包,因此TDS格式中的status就不会是0x01,因此NFR是检测不出完善的攻击程序的的,也就是说针对这个漏洞,NFR 同时存在误报和漏洞的情况。

在分析了这个漏洞的成因后,我们就可以针对这个问题写出自己的NFR检测代码:


sqlserv_schema = library_schema:new(1, ["time","ip","int","ip","int", "str"],
  scope());
sqlserv_rec = recorder("bin/list %c", "sqlserv_schema");

HELLO_SIG = "\x12 ";
#考虑了分包和长度不固定的因素,去除了后面不可靠的特征串
MIN_LEN =29;
#包括TDS包头和字段指示头的总长度

…….

filter hello tcp (client, dport: 1433) {
  declare $Blob inside tcp.connsym;
  if ($Blob == NULL) {
    $Blob = tcp.blob;
  } else {
    $Blob = cat($Blob, tcp.blob);
  }

  if (strlen($Blob)     return;

  if (prefix($Blob, HELLO_SIG) && strlen($Blob) > 295) {
    #考虑到实例名不可能超过255,因此这里长度选择了40(包头)+255=295
#也可以增加一个Value,以便用户自己根据事件情况进行调节
#报警
….

}


7.  小结
通过对NFR这个攻击签名的分析可以看出,发布完善的IDS攻击签名不是一个简单的事情,它需要了解应用的协议格式和漏洞的成因。而不是简单地收集网络上存在地exploits,然后截取其中的特征码。
目前很多人包括IDS开发人月都在讨论IDS有没有前途,需不需要。我想与其在那里讨论,不如静下来好好分析漏洞,完善攻击签名,使IDS做的更准确。
与其坐而论不如起而行!!(出处:www.xfocus.net)
Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
修复:Windows 11 无法优化游戏的问题修复:Windows 11 无法优化游戏的问题Apr 30, 2023 pm 01:28 PM

GeforceExperience不仅为您下载最新版本的游戏驱动程序,它还提供更多!最酷的事情之一是它可以根据您的系统规格优化您安装的所有游戏,为您提供最佳的游戏体验。但是一些游戏玩家报告了一个问题,即GeForceExperience没有优化他们系统上的游戏。只需执行这些简单的步骤即可在您的系统上解决此问题。修复1–为所有游戏使用最佳设置您可以设置为所有游戏使用最佳设置。1.在您的系统上打开GeForceExperience应用程序。2.GeForceExperience面

Nginx性能优化与安全设置Nginx性能优化与安全设置Jun 10, 2023 am 09:18 AM

Nginx是一种常用的Web服务器,代理服务器和负载均衡器,性能优越,安全可靠,可以用于高负载的Web应用程序。在本文中,我们将探讨Nginx的性能优化和安全设置。一、性能优化调整worker_processes参数worker_processes是Nginx的一个重要参数。它指定了可以使用的worker进程数。这个值需要根据服务器硬件、网络带宽、负载类型等

Windows 11 Insiders 现在对在窗口模式下运行的传统游戏进行了优化Windows 11 Insiders 现在对在窗口模式下运行的传统游戏进行了优化Apr 25, 2023 pm 04:28 PM

如果您在Windows机器上玩旧版游戏,您会很高兴知道Microsoft为它们计划了某些优化,特别是如果您在窗口模式下运行它们。该公司宣布,最近开发频道版本的内部人员现在可以利用这些功能。本质上,许多旧游戏使用“legacy-blt”演示模型在您的显示器上渲染帧。尽管DirectX12(DX12)已经利用了一种称为“翻转模型”的新演示模式,但Microsoft现在也正在向DX10和DX11游戏推出这一增强功能。迁移将改善延迟,还将为自动HDR和可变刷新率(VRR)等进一步增强打

如何使用缓存优化PHP和MySQL如何使用缓存优化PHP和MySQLMay 11, 2023 am 08:52 AM

随着互联网的不断发展和应用的扩展,越来越多的网站和应用需要处理海量的数据和实现高流量的访问。在这种背景下,对于PHP和MySQL这样的常用技术,缓存优化成为了非常必要的优化手段。本文将在介绍缓存的概念及作用的基础上,从两个方面的PHP和MySQL进行缓存优化的实现,希望能够为广大开发者提供一些帮助。一、缓存的概念及作用缓存是指将计算结果或读取数据的结果缓存到

如何通过优化查询中的LIKE操作来提高MySQL性能如何通过优化查询中的LIKE操作来提高MySQL性能May 11, 2023 am 08:11 AM

MySQL是目前最流行的关系型数据库之一,但是在处理大量数据时,MySQL的性能可能会受到影响。其中,一种常见的性能瓶颈是查询中的LIKE操作。在MySQL中,LIKE操作是用来模糊匹配字符串的,它可以在查询数据表时用来查找包含指定字符或者模式的数据记录。但是,在大型数据表中,如果使用LIKE操作,它会对数据库的性能造成影响。为了解决这个问题,我们可

Go语言中的优化和重构的方法Go语言中的优化和重构的方法Jun 02, 2023 am 10:40 AM

Go语言是一门相对年轻的编程语言,虽然从语言本身的设计来看,其已经考虑到了很多优化点,使得其具备高效的性能和良好的可维护性,但是这并不代表着我们在开发Go应用时不需要优化和重构,特别是在长期的代码积累过程中,原来的代码架构可能已经开始失去优势,需要通过优化和重构来提高系统的性能和可维护性。本文将分享一些在Go语言中优化和重构的方法,希望能够对Go开发者有所帮

Snapchat优化指甲追踪效果,与OPI合推AR指甲油滤镜Snapchat优化指甲追踪效果,与OPI合推AR指甲油滤镜May 30, 2023 am 09:19 AM

5月26日消息,SnapchatAR试穿滤镜技术升级,并与OPI品牌合作,推出指甲油AR试用滤镜。据悉,为了优化AR滤镜对手指甲的追踪定位,Snap在LensStudio中推出手部和指甲分割功能,允许开发者将AR图像叠加在指甲这种细节部分。据青亭网了解,指甲分割功能在识别到人手后,会给手部和指甲分别设置掩膜,用于渲染2D纹理。此外,还会识别用户个人指甲的底色,来模拟指甲油真实上手的效果。从演示效果来看,新的AR指甲油滤镜可以很好的模拟浅蓝磨砂质地。实际上,此前Snapchat曾推出AR指甲油试用

一篇学会本地知识库对LLM的性能优化一篇学会本地知识库对LLM的性能优化Jun 12, 2023 am 09:23 AM

昨天一个跑了220个小时的微调训练完成了,主要任务是想在CHATGLM-6B上微调出一个能够较为精确的诊断数据库错误信息的对话模型来。不过这个等了将近十天的训练最后的结果令人失望,比起我之前做的一个样本覆盖更小的训练来,差的还是挺大的。这样的结果还是有点令人失望的,这个模型基本上是没有实用价值的。看样子需要重新调整参数与训练集,再做一次训练。大语言模型的训练是一场军备竞赛,没有好的装备是玩不起来的。看样子我们也必须要升级一下实验室的装备了,否则没有几个十天可以浪费。从最近的几次失败的微调训练来看

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Tools

mPDF

mPDF

mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Powerful PHP integrated development environment

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.