首页 > 编程语言 >恶意代码分析实战 IDA lab 6 c2程序分析很有用!

恶意代码分析实战 IDA lab 6 c2程序分析很有用!

时间:2023-08-02 19:36:50浏览次数:44  
标签:exe 函数 恶意代码 lab 这个 字符串 c2 main

第6章 识别汇编中的C代码结构(实验)

    Lab 6-1:在这个实验中,你将分析在文件Lab06-01.exe中发现的恶意代码
        1.1 由main函数调用的唯一子过程中发现的主要代码结构是什么?
        1.2 位于0x40105F的子过程是什么?
        1.3 这个程序的目的是什么?
    Lab 6-2:分析在文件Lab06-02.exe中发现的恶意代码。
        2.1 main函数调用的第一个子过程执行了什么操作?
        2.2 位于0x40117F的子过程是什么?
        2.3 被main函数调用的第二个子过程做了什么?
        2.4 在这个子过程中使用了什么类型的代码结构?
        2.5 在这个程序中有任何基于网络的指示吗?
        2.6 这个恶意代码的目的是什么?
    Lab 6-3:在这个实验中,我们会分析在文件Lab06-03.exe中发现的恶意代码。
        3.1 比较在main函数与实验6-2的main函数的调用。从main中调用的新的函数是什么?
        3.2 这个新的函数使用的参数是什么?
        3.3 这个函数包含的主要代码结构是什么?
        3.4 这个函数能够做什么?
        3.5 在这个恶意代码中有什么本地特征吗?
        3.6 这个恶意代码的目的是什么?
    Lab 6-4:在这个实验中,我们会分析在文件Lab06-04.exe中发现的恶意代码。
        4.1 在实验6-3和6-4的main函数中的调用之间的区别是什么?
        4.2 什么新的代码结构已经被添加到main中?
        4.3 这个实验的解析HTML的函数和前面实验中的哪些有什么区别?
        4.4 这个程序会运行多久?(假设它已经连接到互联网。)
        4.5 在这个恶意代码中有什么新的基于网络的迹象吗?
        4.6 这个恶意代码的目的是什么?

 

在这个实验中,你将分析在文件Lab06-01.exe中发现的恶意代码;

  • 习惯吧,拿到文件先用ExeInfo PE查壳;

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_字符串

 

结果无壳;

 

问题

1、由main函数调用的唯一子过程中发现的主要代码结构是什么?

  • 使IDA打开程序;

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_main函数_02

 

 

 

 

main函数开始找第一个调用sub_401000,双击进函数一探究竟;

  • 进入Graph View宏观查看,很显然是一个if结构;

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_字符串_03

 

 

 

  • 仔细查看一下具体结构,使用了IneternetGetConnectedState函数以及两个成功与失败的字符串;

 

  • 如果IneternetGetConnectedState函数如果有连接,返回1,否则返回0;
  • 返回值与0比较:
  • 如果函数返回为1ZF0,CF置0,PF置1,OF置0;
  • 运行00401017处,显示Scuess字符串的程序块;
  • 如果函数返回为0ZF1,CF置0,PF置0,OF置0;
  • 跳转到loc_40102B,显示Error字符串的程序块;

2、位于0x40105F的子过程是什么?

  • 双击跳转到0x40105F处;

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_字符串_04

 

 

 

 

看这个函数传递的参数是一个字符串;

 

这里我盲猜是一个printf函数,为了验证,我们可以写一个例程进行反汇编;

#include <stdio.h>
int main()
{
printf("hello World\n");
return 0;
}

再使用IDA反汇编找到printf函数一直看下去,找到如下页面;

 

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_main函数_05

 

 

 

 

看眼熟不。所以基本上可以判断,是一个printf函数。

 

要说一句的是,我是编译成Realeass版本,而不是Debug版本,后者调试信息太多了,不适用对比

3、这个程序的目的是什么?

  • 综上所述,这个程序是检查是否有一个可用Internet连接;
  • 如果找到,就打印Success:……
  • 否则打印Error 1.1: ……;
  • ==》其实从整个调用图看,如果成功以后,感觉是做了进程注入。。。

Lab6-2

分析在文件Lab06-02.exe中发现的恶意代码;

  • 同上,拿到文件先用ExeInfo PE查壳;

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_字符串_06

 

 

 

 

结果无壳;

 

问题:

1、main函数调用的第一个子过程执行了什么操作?

  • 使用IDA打开程序;

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_main函数_07

 

 

 

  • 双击进程序;

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_安全分析_08

 

 

 

  • 依旧是一个if语句,而且仍然使用的是InternetGetConnectedState函数,进入Graph View视图看的更清晰;

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_安全分析_09

 

 

 

 

返回值与0比较:

  • 如果函数返回为1ZF0,CF置0,PF置1,OF置0;
  • 运行00401017处,显示Scuess字符串的程序块;
  • 如果函数返回为0ZF1,CF置0,PF置0,OF置0;
  • 跳转到loc_40102B,显示Error字符串的程序块;

2、位于0x40117F的子过程是什么?

  • 双击sub_40117F进入函数;

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_main函数_10

 

 

 

  • 又看到一个亲切的

 

不解释了,又是一个printf函数(如有问题看Lab06-1);

3、被main函数调用的第二个子过程做了什么?

  • 回到main函数;

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_代码结构_11

 

 

 

  • 双击第二个函数,sub_401040;

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_安全分析_12

 

 

 

 

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_代码结构_13

 

 

 

  • 查询MSDN看看这些函数的功能;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25


// 初始化应用程序对Win32 Internet函数的使用。

HINTERNET InternetOpen(

    IN LPCSTR lpszAgent,

    IN DWORD dwAccessType,

    IN LPCSTR lpszProxyName,

    IN LPCSTR lpszProxyBypass,

    IN DWORD dwFlags

);

// 开始读取完整的FTP、Gopher或HTTP URL。如果使用的URL包含由空格分隔的相对URL和基URL,则首先使用InternetCanonicalizeUrl。

HINTERNET InternetOpenUrl(

    IN HINTERNET hInternetSession,

    IN LPCSTR lpszUrl,

    IN LPCSTR lpszHeaders,

    IN DWORD dwHeadersLength,

    IN DWORD dwFlags,

    IN DWORD dwContext

);

// 从InternetOpenUrl、FtpOpenFile、GopherOpenFile或HttpOpenRequest函数打开的句柄读取数据。

BOOL InternetReadFile(

    IN HINTERNET hFile,

    IN LPVOID lpBuffer,

    IN DWORD dwNumberOfBytesToRead,

    OUT LPDWORD lpNumberOfBytesRead

);

// internetCloseHeadle很显然就是关闭句柄,我就不再赘述了,有兴趣可以查一下MSDN;


  • 理一下程序过程;
  • 恶意代码分析实战 IDA lab 6 c2程序分析很有用!_代码结构_14

     

     

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_字符串_15

 

 

 

 

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_安全分析_16

 

 

 

  • 先打开网络;
  • 然后通过URL下载文件;
  • 再对下载的文件通过loc_4010E5处的函数进行解析;

我们重点来看看loc_4010E5处的解析规则;

 

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_字符串_17

 

 

 

 

选定字符使用r键进行转换后;

 

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_字符串_18

 

 

 

  • <!--是标准的HTML的注释开始的部分;(在网页中,注释只有在源码处能看到);
  • 在这个子程序中有一个贯彻始终的Buffer的数组,选定后,摁ctl+k,查看定义大小;

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_字符串_19

 

 


 

选择拉取后发现,共0x200也就是512个字节;

 

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_main函数_20

==》这个代码就是if c=='<' { if c == '!' .. {if c == '-'  { if ... }}}

 

 

 

 

回到这个函数,我们发现,如果前面四个字符都匹配的话,会将第五个字符传给al,也就是函数的返回值;

  • 所以我们可以判断此函数的功能就是找到注释正文开始的地方将字符串首地址返回;

  • 由标注出的被调用函数来看,这个函数的功能是从www.practicalmalwarenalysis.com下载了网页,并且解析;

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_代码结构_21

 

 

 

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_字符串_22

 

 

看这个调用图,还是能够发现问题的!



2.4,2.5,2.6的具体分析过程上面已经体现

2.4 使用了if结构 多重比较

2.5 该恶意代码使用Internet Explorer 7.5/pma作为代理(作为HTTP的User-Agent字段)、对http://www.practicalmalwareanalysis.com/cc.htm进行了数据访问(下载了该页面)。

2.6、访问指定url的页面,访问注释中的内容(<!-*-)从注释中获取命令,属于一种C2的隐藏手段。然后调用休眠指令休眠60s。



至于后续的c2分析,初步看了下,还是非常复杂的:

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_main函数_23

 

 后面这本书会不会继续深入吧。见下!


 

 

有一个细节:见:https://www.jianshu.com/p/5e5a80cbcc45 里的说明!

这里IDA识别有些混乱,按照书上介绍的逻辑,应该是比较buf的前四个字节是不是`<!-*- 但是IDA好像都识别成了局部变量,我们需要修改这个函数的栈。
8.png

其实这里将这几个局部变量换成buf的偏移看起来就比较明确了,实际上就是比较前四个字符,全部匹配之后将第五个字符放在al,并返回;执行失败返回0.
9.png

下面是修改过的版本,看起来更舒服
10.png

修改方式是定义一个512大小的Array,每个元素1字节宽。
11.png
12.png

 

 

4、在这个子过程中使用了什么类型的代码结构?

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_main函数_24

 

 


 

很显然,这是一个多层if的结构;

5、在这个程序中有任何基于网络的指示吗?

  • 根据查看字符串窗口;

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_代码结构_25

 

 

6、这个恶意代码的目的是什么?

 

综上所述:

  • 首先判断是否有可用的Internet连接:
    • 如果不存在就停止运行;
    • 否则程序会使用一个用户代理下载网页:
      • 该网页包含了<!--开始的注释;
      • 程序解析其后的字符;
        • 将解析出来的字符串格式输出到屏幕,格式为Success : Parsed command is X
          • 其中X`就是解析出来的字符;
        • 如果解析成功,程序会休眠60秒,然后终止运行;

Lab6-3

在这个实验中,我们会分析在文件Lab06-03.exe中发现的恶意代码;

 

问题:

1、比较在main函数与实验6-2的main函数的调用。从main中调用的新的函数是什么?

  • 经过对比,sub_401130处的函数是新出现的;

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_字符串_26

 

 

1

2

3


0x401000();        // 检查Internet连接;

0x401040();        // 下载网页并解析HTML注释;

0x401271();        // printf;


2、这个新的函数使用的参数是什么?

 

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_安全分析_27

 

 

  • call上方是两个push,所以是有两个参数;

  • 因为函数传参是从右往左进行压栈;

    • 所以函数可以看作sub_401130(ecx,eax)

      恶意代码分析实战 IDA lab 6 c2程序分析很有用!_main函数_28

       

       

1

2


+ `ecx`中存放的是`byte`的`var_8(是IDA给命名的)`;

+ `eax`中存放的是dword的`argv`;


仅仅到这里就够了吗?真的是逼死强迫症,我们还是试着找一下var_8argv[0]两个具体是啥;

 

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_安全分析_29

 

 

  • jnz指令如果是ZF=0,就进行跳转;
  • 继续向上看,test指令;
    • 两个操作数按位and操作;
      • 结果为0,ZF=1
        • 结果不为0,ZF=0
      • SF为结果的最高位;
      • 结果的低八位中,1的个数是偶数,PF=1
        • 否则,PF=0;

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_安全分析_30

 

 

  • 可以看见,eax是符号位扩展后的sub_401040()的返回值;

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_代码结构_31

 

 

 

还记得var_20C是啥么?没错,就是从HTML注释中解析出的字符串首字符;

 

所以var_8就是HTML注释中解析出的字符串首字符

 

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_字符串_32

 

 

 

再看argv是入口函数的参数,所以应该是用户输入;

  • 上面没有,那我们就往下找找,双击进入sub_401130

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_字符串_33

 

 

  • 点击lpExistingFileName查看引用关系;

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_安全分析_34

 

 

 

又传给了CopyFileA()函数,上神器MSDN瞅瞅;

1

2

3

4

5

6

7

8


CopyFile函数的作用是将一个现有文件复制到一个新的文件中。

 

BOOL CopyFile(

  LPCTSTR lpExistingFileName,

                          // pointer to name of an existing file

  LPCTSTR lpNewFileName,  // pointer to filename to copy to

  BOOL bFailIfExists      // flag for operation if file exists

);


  • 看传参是(从左往右数第一个)lpExistingFileName
  • 要不咱再看看这个是啥类型吧;

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_main函数_35

 

 

 

原来是个指向字符串的指针;

 

至于书上答案说:argv就是Argv[0],是一个对当前运行程序名字,也就是Lab06-03.exe的字符串引用。可惜的是,我并没有搜到Lab06-03.exe这个字符串。所以我还是坚信是入口函数人为输入的字符串。如果有哪个大佬能指出问题所在,感激不尽;

3、这个函数包含的主要代码结构是什么?

 

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_安全分析_36

 

 

  • 很显然,这是一个典型的switch结构;

4、这个函数能够做什么?

 

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_安全分析_37

 

 

 

看到一个很亲切的数字61h,这就是ASCll码中的a

  • 再点进跳转表0ff_4011F2看看情况;

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_安全分析_38

 

 

 

紧凑的,由此可见,switch判断的就是指令字符arg_0是否为abcde

 

然后根据选择的不同,执行不同的功能;

 

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_main函数_39

 

 

 

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_main函数_40

 

 

 

switch功能列表如下所示除了b的参数字符串没找到

 

(a):调用CreateDirectory,参数是C:\\Temp,如果目录不存在,就创建一个;

 

(b):调用CopyFile,两个参数,一个源文件,一个目的文件。此处功能将Lab06-03.exe(没找到这个字符串)复制为C:\Temp\cc.exe;

 

(c):调用DeleteFile,参数是C:\\Temp\\cc.exe,如果该文件存在就删除;

 

(d):在windows注册表中设置一个值,获得持久性运行。此处是将注册表键Software\Microsoft\Windows\CurrentVersion\Run\Malware的值设置为C:\Temp\cc.exe

 

(e):休眠100秒;

 

(default):打印Error 3.2:Not a valid command provided

5、在这个恶意代码中有什么本地特征吗?

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_字符串_41

 

 


 

可以将这些作为本地特征;

6、这个恶意代码的目的是什么?

  • 使用if结构,检查是否是存在一个可用的Internet连接。
    • 不存在,程序终止;
  • 下载一个网页,解析出注释后面的第一个字符,根据这个字符操作;
    • (a);
    • (b);
    • (c);
    • (d);
    • (e);

Lab6-4

在这个实验中,我们会分析在文件Lab06-04.exe中发现的恶意代码;

 

问题:

1、在实验6-3和6-4的main函数中的调用之间的区别是什么?

 

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_main函数_42

 

 

 

很明显看流程图可以看出结构成了循环了不再是之前的if了!

之前的:

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_字符串_43

 

 

新的:

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_代码结构_44

 

 

2、什么新的代码结构已经被添加到main中?==》就是循环1440次,每次sleep 60s,也就是程序会执行一天!之前是一次性退出。

 

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_安全分析_45

 

 

 

加了循环操作;

  • 书上说是for循环,这个我个人觉得并不绝对。众所周知,forwhiledo{}while以及goto结构都是互通的。因为编译器会经过优化,将原本的for语句换成上面的任何一个形式;==》NO!就是一个for循环!见下图:
  • 恶意代码分析实战 IDA lab 6 c2程序分析很有用!_代码结构_46

     

     

  • for varc 0~1440 而已!

3、这个实验的解析HTML的函数和前面实验中的那些有什么区别?

  • 找到解析HTML函数0x401040;

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_字符串_47

 

 

 

这里出现了一个之前没用遇见的字符串Internet Explorer 7.50/pma%d;==》for循环里的计数值写到这里面而已!下图:

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_字符串_48

 


 var_c 就是传进去打印的!

 

调用了下方是_sprintf函数;

 

sprintf返回存储在缓冲区中的字节数,不包括结束的null字符。swprintf返回存储在缓冲区中的宽字符数,不包括结束的null宽字符;

 

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_安全分析_49

 

 

 

传入字符串参数经过sprintf–>InternetOpenA最终赋值给了InternetOpenUrlAhInternet字段;

4、这个程序会运行多久?(假设它已经链接到互联网)

  • 回到main循环,进行查看;

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_安全分析_50

  • 首先sub_401000是个联网检测,既然假设连接上了,那就直接向下跳转;

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_安全分析_51

  • 判断通过后,开始了循环;

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_字符串_52

  • jge是带符号内容前者大于后者,则跳转结束,否则向下执行;
  • 5A0h等于十进制的1440
  • 继续向下走,就是sub_401040函数,解析HTML函数,没啥好说的,继续向下;

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_字符串_53

  • 因为sub_4012B5printf函数、sub_401150switch,都可以直接跳过,直到我们要找的Sleep时间函数;
  • 看一看call上面的值,0EA60h也就是十进制60000,单位毫秒,等于1分钟;
  • 所以每次循环是睡眠一分钟,共循环1440次,共计24小时;

5、在这个恶意代码中有什么新的基于网络的迹象吗?

 

恶意代码分析实战 IDA lab 6 c2程序分析很有用!_字符串_54

 

 

 

此字符串是一个User-Agent,包含了一个计数器,记录了该程序运行了多久;

6、这个恶意代码的目的是什么?

  • 首先判断是否有可用的Internet连接:
    • 如果不存在就停止运行;
  • 设置循环终点,1440;
    • 否则程序会使用一个独特用户代理下载网页:
      • 该网页包含了<!--开始的注释;
        • 程序解析其后的字符;
        • 将解析出来的字符根据switch进行操作:
          • (a);
          • (b);
          • (c);
          • (d);
          • (e)

 


标签:exe,函数,恶意代码,lab,这个,字符串,c2,main
From: https://blog.51cto.com/u_11908275/6941781

相关文章

  • 恶意代码分析 动态行为分析 Lab3-1 Lab3-2 Lab3-3 Lab3-4
    笔记动态分析基础,这部分还没涉及到看反汇编进行分析,主要是运行程序,然后通过监控软件检测程序运行的内容使用沙箱查看运行报告,可以获取一部分信息首先要在虚拟机上运行恶意代码:如果是DLL,可以通过rundll32.exeDLLName,ExportFun来进行执行如果是服务DLL,则需要运行其中导出的安装服......
  • IDA使用 恶意代码分析实战 Lab 05 01
    恶意代码分析实战Lab05011.DllMain的地址是什么?2.使用Imports窗口并浏览到gethostbyname,导入函数定位到什么地址?3.有多少函数调用了gethostbyname?4.将精力集中在位于0x1000757处的对gethostbyname的调用,你能找出哪个DNS请求将被触发吗?5.IDAPro识别了在0x16001656处的子过程......
  • 如何查看加壳的恶意软件 Lab1-2 Lab1-3 恶意代码分析
    Lab1-2分析Lab1.2.exe文件目录Lab1-22.是否有这个文件被加壳或混淆的任何迹象?3.有没有任何导入函数能够暗示出这个程序的功能?4.哪些基于主机或基于网络的迹象可以被用来确定被这个恶意代码所感染的机器? 2.是否有这个文件被加壳或混淆的任何迹象?利用PEID进行查看普通扫描如下:普......
  • Xv6 Lab10: file system
    Largefiles这个作业需要我们将xv6的最大文件大小从12+256Bytes修改为11+256+256*256Bytes。为了达成这个目标,我们需要使用二级索引块,对inode的addrs字段,首先将NDIRECT从$12$修改为$11$,即前$11$个block是directblock,addrs[NDIRECT]对应的块是一......
  • 恶意代码分析实战 lab 20-1 20-2 20-3 C++恶意代码分析,难度提升
    本次实验我们将会分析lab20-1,lab20-2文件。先来看看要求解答的问题Lab20-1需要回答的问题如下Q1.在0x401040处的函数采用了什么参数?Q2.哪个URL被用来调用URLDownloadToFile?Q3.这个程序做了什么事情?在实验任务一当中我们来分析lab20-1首先载入IDA第一个call是在401008,是一个......
  • FPGA学习笔记 Label: Research
    [Synth8-9486]formalport'addr'hasnoactualordefaultvalue[D:/FPGA/TEST_CARD_HIT/top.vhd:492]有端口没有连接,在top文件中把端口加上 [Opt31-67]Problem:ALUT2cellinthedesignismissingaconnectiononinputpinI1,whichisusedbytheLUTequat......
  • 基于ResNet-101深度学习网络的图像目标识别算法matlab仿真
    1.算法理论概述       介绍ResNet-101的基本原理和数学模型,并解释其在图像识别中的优势。然后,我们将详细介绍如何使用深度学习框架实现ResNet-101,并在图像数据集上进行训练和测试。最后,我们将总结本文的主要内容并提出进一步的研究方向。 1.1、ResNet-101的基本原理......
  • Sonarqube+Gitlab+ALM集成
    Sonarqube+Gitlab+ALM集成配置sonarqube使用gitlab账户登录1.Gitlab配置1.1使用管理员用户登录gitlab,生成一个apitoken,记录该值1.2使用管理员用户配置gitlab应用,添加一个sonarqube应用,回调URL输入{sonarqubaddress}/oauth2/callback/gitlab1.3保存生成的应......
  • vs编译 error C2001: 常量中有换行符(XTHS实测有效)
    出现该错误的其中一种可能:编码问题,其中一个解决办法是:找到这个文件位置,选择用Notepad++方式打开,选择菜单项中的"编码"---》“使用UTF-8-BOM编码”,然后保存,再回到VS将会收到重新加载文件的提示。 转自:vs编译errorC2001:常量中有换行符_简单前行的博客-CSDN博客......
  • TDengine连接数满了报错:Connection is not available, request timed out after 3000
    背景使用tdengine时遇到一个情况,应用程序使用连接池将接收到的实时数据插入TD时,会出现获取不到连接的报错.重现起一个模拟程序,发送100条数据到应用程序,应用程序从批量插入改为逐条插入td,重现出报错:org.springframework.jdbc.support.MetaDataAccessException:Could......