首页
社区
课程
招聘
[原创]incaseformat样本详细分析(附样本下载)
发表于: 2021-1-16 08:39 6451

[原创]incaseformat样本详细分析(附样本下载)

2021-1-16 08:39
6451

incaseformat样本详细分析(附样本下载)

incaseformat病毒近日爆发,影响了不少主机。这么一个古老的病毒能够造成这么大的影响,令人感到意外。我从微步在线上下载了样本进行分析。需要注意的是,incaseformat有两个在野版本,详见https://www.52pojie.cn/thread-1351233-1-1.html。我分析的应该是原始版本,但是两个版本除了Sysutils::DateTimeToTimeStamp库函数所使用的全局变量IMSecsPerDay不同,其他没有什么区别。在文章的最后有样本相关资源的链接。

基本信息

名称
样本类型PE32 executable (GUI) Intel 80386, for MS Windows
MD5915178156c8caa25b548484c97dd19c1
SHA1f1ca17a3f0b51952de959212b71f3d38d13b0b50
SHA25675ee468476e300c5fddda280a2c0570b1c11a0f7c44acad2b257428cf404e5da

详细分析

首先使用PEiD查壳,可以看到并没有加壳,并且样本使用Delphi编写。

分析Delphi程序与分析VC程序不同,常见的VC样本往往是过程式的,找到WinMain函数接着向下分析即可;而Delphi程序的功能代码往往和UI组件关联,直接从入口分析面临的是一堆固定的初始化代码。因此,可以首先使用DeDe查看Delphi样本中的功能函数。

该样本中有一个Form,包括一个FormCreate和4个被定时器触发的函数,下面开始对它们的分析。

  1. 在分析中很多函数调用的参数我直接通过动态分析获得,本文中不详细提及,重点展示静态分析的过程。

  2. 使用ida分析Delphi程序有很多库函数无法识别,但是DeDe能够很好的识别。因此,可以从DeDe导出map文件,然后使用ida的loadmap插件导入。

  3. 一般来说,样本分析首先要进行动态分析,通过沙箱或监控工具查看样本行为,进行初步分析,此处不再详述。

  4. 直接使用当前样本进行动态调试可能有一些断点运行不到,这是因为程序中有一些行为只有tsay.exe和ttry.exe会执行。因此,可以使用样本复制产生的C:\windows\tsay.exe和C:\windows\ttry.exe试一试。

分析FormCreate

FormCreate函数的第一部分,如下图,包括第一个ShellExecuteA调用之前的代码。这部分是在判断文件所在文件夹是否存在,如果不存在,则构造文件夹路径,并调用ShellExecuteA(0, 0, "/path/to/dir")。这一部分对样本分析影响不大。

该函数的第二部分,如下图。

首先,判断文件C:\windows\tsay.exe是否存在,如果不存在,则复制当前正在运行的文件至C:\windows\tsay.exe(通过图中的CopyFileA调用)。复制结束后,再对注册表进行修改。

在图中的SetRootKey调用之前,将 80000002h作为参数传入了edx。SetRootKey作用是设置进行注册表操作的根键,值与根键的对应关系如下:

根键
80000000hHKEY_CLASSES_ROOT
80000001hHKEY_CURRENT_USER
80000002hHKEY_LOCAL_MACHINE
80000003hHKEY_USERS
80000004hHKEY_PERFORMANCE_DATA
80000005hHKEY_CURRENT_CONFIG
80000006hHKEY_DYN_DATA

此处的注册表操作是将msfsa = C:\windows\tsay.exe写入注册表HKEY_LOCAL_MACHINE/SOFTWARE\Microsoft\Win-dows\CurrentVersion\RunOnce,以实现下一次的开机自启。

然后,该函数对当前正在运行的程序进行判断,如果是C:\windows\tsay.exe跳转至loc_44F28E,如果是C:\windows\ttry.exe跳转至loc_44F2F4。下图黄色高亮是进行比较的函数调用。

在loc_44F28E处,即当前程序为tsay.exe时,复制到C:\windows\ttry.exe,然后启动ttry.exe。在loc_44F2F4处,FormCreate函数基本就结束了。

可见,FormCreate函数主要完成了将初次运行的样本复制到C:\windows\tsay.exe,并修改注册表使tsay.exe在下次重启时自启动。如果运行的是tsay.exe,则将tsay.exe复制到C:\windows\ttry.exe,并启动ttry.exe。

分析Timer1Timer

Timer1Timer作为定时器定时触发的函数,有很多固定的无用代码影响我们分析;我们着重分析0044EBEB的函数调用。0044EC14处也是一个自定义函数的调用,但我并没有发现什么和样本功能有关的调用,不再分析。

0044EBEB处的函数(我在ida命名为hpw_disk_type了)调用在其它定时器触发函数中也用到了,此函数如下图。

首先,在0044E5ED处的hpw_getdisksize也是自定义函数,它的功能是调用Sysutils@DiskSize返回值判断通过eax传入的磁盘是否存在;若存在返回1,否则返回0。这个函数很简单,不再单独分析。

再回到hpw_disk_type中来,可以看到,从‘C’开始,函数调用hpw_getdisksize判断磁盘是否存在;若不存在,跳到loop_or_exit处;若存在,调用GetDriveTypeA判断磁盘类别,如果是DRIVE_REMOVABLE或者DRIVE_FIXED,就调用TStringList@AddObject存起来。

再看loop_or_exit处,首先对ebx加1,即获得下一个盘符,然后判断ebx值是否为5Bh(Z的后一个ascii码),如果是就结束循环,否则继续跳回loc_44E5EB进行磁盘判断。

分析Timer2Timer

同样地,Timer2Timer作为定时器定时触发的函数,我们忽略掉其中和定时器有关的部分,关注功能代码,如下图。hpw_disk_type函数已经分析过了,它用来判断并保存可用的磁盘。

然后,0044EEF0处的函数调用将年、月、日分别赋值给三个变量,我已将它们重命名为day、month、year。从loc_44EF07处开始,对时间进行判断。当年份大于2009(0044EEF5处)、月份大于3(0044EF07处)、日为1或10或21或29时(loc_44EF15处),跳转到loc_44EF31,否则跳转至loc_44EF5E(函数基本结束)。

从loc_44EF31处开始,循环对已保存的磁盘调用hpw_delete函数。经过动态分析,由于0044EF3B处和0044EF5B处的dec ebx操作,若保存了n个盘符,实际对n-1个盘进行hpw_delete,额外的那个是C盘,不进行hpw_delete操作。

然后,我们对hpw_delete函数进行分析,其代码如下图。

这个函数简单直接,首先拼接形成 [路径]:\*.*,对其执行FindFirst(0044ED08处),若执行失败说明该目录下无子内容,直接跳转至loc_44EDCD删除该目录。若含有子内容,跳过其中的.(代表当前目录)和..(代表上级目录)防止死循环,然后对其他内容进行递归删除。

所以,Timer2Timer函数的功能是在指定日期对C盘以外的盘执行删除操作。

分析Timer3Timer

Timer3Timer函数执行了一系列的注册表修改。分析API调用后可以得知有如下修改:

  1. HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced 下 HidenFileExt = 1

  2. HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced 下 Hidden = 2

  3. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folde\Hidden\SHOWALL 下 checkedvalue = 0

  4. 删除HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Fold-e\HideFileExt里的checkedvalue

Timer3Timer通过修改注册表来隐藏文件后缀和文件夹选项中的一些选项,注册表每项的意义很容易搜索出来,此处不再赘述。

分析Timer4Timer

当主机受到该病毒影响时,在被删除文件的磁盘根目录下会留有incaseformat.log文件,就是这个Timer4Timer函数的功劳。该函数很简单,通过hpw_disk_type获取可用盘符后与incaseformat.log字符串拼接,然后调用TFileStream函数向拼接好的路径进行写操作创建文件。

关键函数总结

函数功能
FormCreate复制样本到C:\windows\tsay.exe并修改注册表实现自启动、复制C:\windows\tsay.exe到C:\windows\ttry.exe
Timer2Timer在指定日期对C盘以外的盘执行删除操作
Timer3Timer修改注册表来隐藏文件后缀和文件夹选项中的一些选项
Timer4Timer在被删除盘根目录创建incaseformat.log文件

相关资源

Delphi API 查询:http://docwiki.embarcadero.com/Libraries/Sydney/en/Main_Page

DeDe:http://ftp.twaren.net/cpatch/patchutil/dede/

ida loadmap插件:https://github.com/mefistotelis/ida-pro-loadmap

样本下载:https://s.threatbook.cn/report/file/75ee468476e300c5fddda280a2c0570b1c11a0f7c44acad2b257428cf404e5da/?env=win7_sp1_enx86_office2013





[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2021-1-16 08:40 被中科院卓别林编辑 ,原因:
上传的附件:
收藏
免费 1
支持
分享
最新回复 (4)
雪    币: 6423
活跃值: (3127)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
学习了,感谢
2021-1-17 17:12
0
雪    币: 331
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
之前我分析dp vb程序时就是这样愚蠢的跟过程和搜特征码逆向硬生生搞成体力活,后面才知道有这种类似的工具
2021-1-21 21:05
0
雪    币: 2674
活跃值: (2304)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4

我的样本是在卡饭论坛下的,和楼主的基本一致。

1.逆向分析显示,incaseformat执行C盘以外文件删除的条件为: year>2009且month>3且day为:1,10,21,29

即: 2009年以后,月份大于3的: 1,10,21,29号,这些日子只要一开机,在TForm1.Timer2中就会删除文件

从删除触发日期来看,该样本应该是原始样本,并不是被人篡改后的野样本。

CODE:0044EE84 TForm1@Timer2Timer proc near            ; DATA XREF: CODE:0044E4D5o
CODE:0044EE84
CODE:0044EE84 var_20          = dword ptr -20h
CODE:0044EE84 var_1C          = dword ptr -1Ch
CODE:0044EE84 var_16          = word ptr -16h
CODE:0044EE84 var_14          = word ptr -14h
CODE:0044EE84 System::TDateTime= dword ptr -12h
CODE:0044EE84 var_4           = dword ptr -4
CODE:0044EE84
CODE:0044EE84                 push    ebp             ; TForm1@Timer2Timer
CODE:0044EE85                 mov     ebp, esp
CODE:0044EE87                 add     esp, 0FFFFFFE0h
CODE:0044EE8A                 push    ebx
CODE:0044EE8B                 push    esi
CODE:0044EE8C                 push    edi
CODE:0044EE8D                 xor     ecx, ecx
CODE:0044EE8F                 mov     [ebp+var_20], ecx
CODE:0044EE92                 mov     [ebp+var_4], eax
CODE:0044EE95                 xor     eax, eax
CODE:0044EE97                 push    ebp
CODE:0044EE98                 push    offset loc_44EFA1
CODE:0044EE9D                 push    dword ptr fs:[eax]
CODE:0044EEA0                 mov     fs:[eax], esp
CODE:0044EEA3                 mov     eax, [ebp+var_4]
CODE:0044EEA6                 mov     eax, [eax+2FCh] ; Timer2:TTimer
CODE:0044EEAC                 xor     edx, edx        ; FALSE
CODE:0044EEAE                 call    unknown_libname_426 ; ExtCtrls.TTimer.SetEnabled(TTimer;Boolean);<+>
CODE:0044EEB3                 xor     eax, eax
CODE:0044EEB5                 push    ebp
CODE:0044EEB6                 push    offset loc_44EF84
CODE:0044EEBB                 push    dword ptr fs:[eax]
CODE:0044EEBE                 mov     fs:[eax], esp
CODE:0044EEC1                 mov     dl, 1
CODE:0044EEC3                 mov     eax, off_411BC4
CODE:0044EEC8                 call    unknown_libname_42 ; InStack.TInStack.Create(TInStack;boolean);<+>
CODE:0044EECD                 mov     [ebp+var_1C], eax
CODE:0044EED0                 call    @Sysutils@Now$qqrv ; SysUtils.Now:TDateTime; 获取当前系统时间
CODE:0044EED5                 fstp    qword ptr [ebp+System::TDateTime+2]
CODE:0044EED8                 wait
CODE:0044EED9                 lea     eax, [ebp+var_1C]
CODE:0044EEDC                 call    sub_44E5C8
CODE:0044EEE1                 push    dword ptr [ebp-0Ch]
CODE:0044EEE4                 push    [ebp+System::TDateTime+2] ; unsigned __int16 *
CODE:0044EEE7                 lea     ecx, [ebp+var_16] ; unsigned __int16 *: day
CODE:0044EEEA                 lea     edx, [ebp+var_14] ; unsigned __int16 *: month
CODE:0044EEED                 lea     eax, [ebp+System::TDateTime] ; System::TDateTime: year
CODE:0044EEF0                 call    @Sysutils@DecodeDate$qqrx16System@TDateTimerust2t2 ; Sysutils::DecodeDate(System::TDateTime,ushort &,ushort &,ushort &)
CODE:0044EEF5                 cmp     word ptr [ebp+System::TDateTime], 7D9h ; 当前年份与: 2009进行比较
CODE:0044EEFB                 ja      short loc_44EF07 ; 
CODE:0044EEFD                 call    @System@@TryFinallyExit$qqrv ; System.@TryFinallyExit;
CODE:0044EF02                 jmp     loc_44EF8B      ; 如果当前年份小于等于2009则跳转到loc_44EF8B处返回,什么也不做,
CODE:0044EF02                                         ; 如果大于2009继续执行后面的月份判断
CODE:0044EF07 ; ---------------------------------------------------------------------------
CODE:0044EF07
CODE:0044EF07 loc_44EF07:                             ; CODE XREF: TForm1@Timer2Timer+77j
CODE:0044EF07                 cmp     [ebp+var_14], 3 ; 当前月份与3进行比较
CODE:0044EF0C                 ja      short loc_44EF15 ; 
CODE:0044EF0E                 call    @System@@TryFinallyExit$qqrv ; System.@TryFinallyExit;
CODE:0044EF13                 jmp     short loc_44EF8B ; 如果当前月份小于等于3则跳转到loc_44EF8B处返回,什么也不做,
CODE:0044EF13                                         ; 如果大于3继续执行后面的日期判断
CODE:0044EF15 ; ---------------------------------------------------------------------------
CODE:0044EF15
CODE:0044EF15 loc_44EF15:                             ; CODE XREF: TForm1@Timer2Timer+88j
CODE:0044EF15                 cmp     [ebp+var_16], 1 ; 判断当前日是否是1
CODE:0044EF1A                 jz      short loc_44EF31 ; 
CODE:0044EF1C                 cmp     [ebp+var_16], 0Ah ; 判断当前日是否是10
CODE:0044EF21                 jz      short loc_44EF31 ; 
CODE:0044EF23                 cmp     [ebp+var_16], 15h ; 判断当前日是否是21
CODE:0044EF28                 jz      short loc_44EF31 ; 
CODE:0044EF2A                 cmp     [ebp+var_16], 1Dh ; 判断当前日是否是29
CODE:0044EF2F                 jnz     short loc_44EF5E ; 如果当前日不是: 1,10,21,29则跳转后返回,相当于什么也不做,
CODE:0044EF2F                                         ; 如果满足条件则继续后面的操作
CODE:0044EF31
CODE:0044EF31 loc_44EF31:                             ; CODE XREF: TForm1@Timer2Timer+96j
CODE:0044EF31                                         ; TForm1@Timer2Timer+9Dj ...
CODE:0044EF31                 mov     eax, [ebp+var_1C] ; TStringList
CODE:0044EF34                 mov     edx, [eax]
CODE:0044EF36                 call    dword ptr [edx+14h] ; 取TStringList中的路径个数
CODE:0044EF39                 mov     ebx, eax
CODE:0044EF3B                 dec     ebx
CODE:0044EF3C                 test    ebx, ebx
CODE:0044EF3E                 jle     short loc_44EF5E ; TStringList路径个数为0,则跳
CODE:0044EF40                 mov     esi, 1
CODE:0044EF45
CODE:0044EF45 loc_44EF45:                             ; CODE XREF: TForm1@Timer2Timer+D8j
CODE:0044EF45                 lea     ecx, [ebp+var_20] ; 保存取得的路径
CODE:0044EF48                 mov     edx, esi        ; TStringList中的索引
CODE:0044EF4A                 mov     eax, [ebp+var_1C] ; TStringList
CODE:0044EF4D                 mov     edi, [eax]
CODE:0044EF4F                 call    dword ptr [edi+0Ch] ; 取TStringList的一条路径
CODE:0044EF52                 mov     eax, [ebp+var_20] ; 路径
CODE:0044EF55                 call    sub_44EC70      ; 执行删除操作(满足条件: year>2009且month>3且day为:1,10,21,29)
CODE:0044EF5A                 inc     esi             ; 索引递增
CODE:0044EF5B                 dec     ebx             ; 路径个数递减,直至为0就跳出循环
CODE:0044EF5C                 jnz     short loc_44EF45 ; 如果路径个数非0,继续执行循环
CODE:0044EF5E
CODE:0044EF5E loc_44EF5E:                             ; CODE XREF: TForm1@Timer2Timer+ABj
CODE:0044EF5E                                         ; TForm1@Timer2Timer+BAj
CODE:0044EF5E                 mov     eax, [ebp+var_1C] ; this
CODE:0044EF61                 call    @System@TObject@Free$qqrv ; System.TObject.Free(TObject);
CODE:0044EF66                 xor     eax, eax
CODE:0044EF68                 pop     edx
CODE:0044EF69                 pop     ecx
CODE:0044EF6A                 pop     ecx
CODE:0044EF6B                 mov     fs:[eax], edx
CODE:0044EF6E                 push    offset loc_44EF8B
CODE:0044EF73
CODE:0044EF73 loc_44EF73:                             ; CODE XREF: TForm1@Timer2Timer+105j
CODE:0044EF73                 mov     eax, [ebp+var_4]
CODE:0044EF76                 mov     eax, [eax+2FCh] ; Timer2:TTimer
CODE:0044EF7C                 mov     dl, 1
CODE:0044EF7E                 call    unknown_libname_426 ; ExtCtrls.TTimer.SetEnabled(TTimer;Boolean);<+>
CODE:0044EF83                 retn
CODE:0044EF84 ; ---------------------------------------------------------------------------
CODE:0044EF84
CODE:0044EF84 loc_44EF84:                             ; DATA XREF: TForm1@Timer2Timer+32o
CODE:0044EF84                 jmp     unknown_libname_54 ; System.@HandleFinally;
CODE:0044EF89 ; ---------------------------------------------------------------------------
CODE:0044EF89                 jmp     short loc_44EF73
CODE:0044EF8B ; ---------------------------------------------------------------------------
CODE:0044EF8B
CODE:0044EF8B loc_44EF8B:                             ; CODE XREF: TForm1@Timer2Timer+7Ej
CODE:0044EF8B                                         ; TForm1@Timer2Timer+8Fj ...
CODE:0044EF8B                 xor     eax, eax
CODE:0044EF8D                 pop     edx
CODE:0044EF8E                 pop     ecx
CODE:0044EF8F                 pop     ecx
CODE:0044EF90                 mov     fs:[eax], edx
CODE:0044EF93                 push    offset loc_44EFA8
CODE:0044EF98
CODE:0044EF98 loc_44EF98:                             ; CODE XREF: TForm1@Timer2Timer+122j
CODE:0044EF98                 lea     eax, [ebp+var_20]
CODE:0044EF9B                 call    @System@@LStrClr$qqrpv ; System.@LStrClr(void;void);
CODE:0044EFA0                 retn
CODE:0044EFA1 ; ---------------------------------------------------------------------------
CODE:0044EFA1
CODE:0044EFA1 loc_44EFA1:                             ; DATA XREF: TForm1@Timer2Timer+14o
CODE:0044EFA1                 jmp     unknown_libname_54 ; System.@HandleFinally;
CODE:0044EFA6 ; ---------------------------------------------------------------------------
CODE:0044EFA6                 jmp     short loc_44EF98
CODE:0044EFA8 ; ---------------------------------------------------------------------------
CODE:0044EFA8
CODE:0044EFA8 loc_44EFA8:                             ; CODE XREF: TForm1@Timer2Timer+11Cj
CODE:0044EFA8                                         ; DATA XREF: TForm1@Timer2Timer+10Fo
CODE:0044EFA8                 pop     edi
CODE:0044EFA9                 pop     esi
CODE:0044EFAA                 pop     ebx
CODE:0044EFAB                 mov     esp, ebp
CODE:0044EFAD                 pop     ebp
CODE:0044EFAE                 retn
CODE:0044EFAE TForm1@Timer2Timer endp

 2.搜索目录子项删除之并删除目录

CODE:0044EC70 sub_44EC70      proc near               ; CODE XREF: sub_44EC70+F0p
CODE:0044EC70                                         ; TForm1@Timer2Timer+D1p
CODE:0044EC70
CODE:0044EC70 var_170         = dword ptr -170h
CODE:0044EC70 System::AnsiString= dword ptr -16Ch
CODE:0044EC70 var_168         = dword ptr -168h
CODE:0044EC70 FatTime         = word ptr -164h
CODE:0044EC70 var_15C         = byte ptr -15Ch
CODE:0044EC70 var_158         = dword ptr -158h
CODE:0044EC70 var_C           = dword ptr -0Ch
CODE:0044EC70 var_5           = byte ptr -5
CODE:0044EC70 var_4           = dword ptr -4
CODE:0044EC70
CODE:0044EC70                 push    ebp
CODE:0044EC71                 mov     ebp, esp
CODE:0044EC73                 add     esp, 0FFFFFE90h
CODE:0044EC79                 push    ebx
CODE:0044EC7A                 push    esi
CODE:0044EC7B                 push    edi
CODE:0044EC7C                 xor     edx, edx
CODE:0044EC7E                 mov     [ebp+var_170], edx
CODE:0044EC84                 mov     [ebp+System::AnsiString], edx
CODE:0044EC8A                 mov     [ebp+var_168], edx
CODE:0044EC90                 mov     [ebp+var_C], edx
CODE:0044EC93                 mov     [ebp+var_4], eax
CODE:0044EC96                 mov     eax, [ebp+var_4]
CODE:0044EC99                 call    @System@@LStrAddRef$qqrpv ; System::__linkproc__ LStrAddRef(void *)
CODE:0044EC9E                 lea     eax, [ebp+FatTime]
CODE:0044ECA4                 mov     edx, off_406E18
CODE:0044ECAA                 call    unknown_libname_74 ; BDS 2005-2007 and Delphi6-7 Visual Component Library
CODE:0044ECAF                 xor     eax, eax
CODE:0044ECB1                 push    ebp
CODE:0044ECB2                 push    offset loc_44EE40
CODE:0044ECB7                 push    dword ptr fs:[eax]
CODE:0044ECBA                 mov     fs:[eax], esp
CODE:0044ECBD                 xor     eax, eax
CODE:0044ECBF                 push    ebp
CODE:0044ECC0                 push    offset loc_44EDF7
CODE:0044ECC5                 push    dword ptr fs:[eax]
CODE:0044ECC8                 mov     fs:[eax], esp
CODE:0044ECCB                 mov     eax, [ebp+var_4]
CODE:0044ECCE                 call    unknown_libname_69 ; BDS 2005-2007 and Delphi6-7 Visual Component Library
CODE:0044ECD3                 mov     edx, [ebp+var_4] ; 路径
CODE:0044ECD6                 cmp     byte ptr [edx+eax-1], 5Ch ; 检查路径是否以'\'结尾
CODE:0044ECDB                 jz      short loc_44ECEA ; 
CODE:0044ECDD                 lea     eax, [ebp+var_4]
CODE:0044ECE0                 mov     edx, offset _str___15.Text ; '\',0
CODE:0044ECE5                 call    @System@@LStrCat$qqrv ; 如果路径不以'\'结尾,就追加'\'
CODE:0044ECEA
CODE:0044ECEA loc_44ECEA:                             ; CODE XREF: sub_44EC70+6Bj
CODE:0044ECEA                 lea     eax, [ebp+var_C] ; 用于保存搜索路径
CODE:0044ECED                 mov     ecx, offset _str_____0.Text ; db '*.*',0
CODE:0044ECF2                 mov     edx, [ebp+var_4] ; 以'\'结尾的路径
CODE:0044ECF5                 call    @System@@LStrCat3$qqrv ; 保存到[ebp+var_C]的搜索路径为: [ebp+var_4]+'*.*'
CODE:0044ECFA                 lea     ecx, [ebp+FatTime] ; TSearchRec
CODE:0044ED00                 mov     edx, 3Fh        ; 63
CODE:0044ED05                 mov     eax, [ebp+var_C] ; 搜索路径: <path>\*.*
CODE:0044ED08                 call    @Sysutils@FindFirst$qqrx17System@AnsiStringir19Sysutils@TSearchRec ; Sysutils::FindFirst(System::AnsiString,int,Sysutils::TSearchRec &): 搜索文件
CODE:0044ED0D                 test    eax, eax        ; 判断是否搜索成功(成功时FindFirst返回0,否则返回非0)
CODE:0044ED0F                 jnz     loc_44EDCD      ; 如果没有找到文件,则跳转到loc_44EDCD处删除目录
CODE:0044ED15
CODE:0044ED15 loc_44ED15:                             ; CODE XREF: sub_44EC70+14Cj
CODE:0044ED15                 mov     eax, [ebp+var_158] ; 搜索到的1项
CODE:0044ED1B                 mov     edx, offset _str___2.Text ; BDS 2005-2007 and Delphi6-7 Visual Component Library('.',0)
CODE:0044ED20                 call    @System@@LStrCmp$qqrv ; System::__linkproc__ LStrCmp(void)
CODE:0044ED25                 jz      loc_44EDAF      ; 如果搜索到的项为'.',则跳转到loc_44EDAF处搜索下1项
CODE:0044ED2B                 mov     eax, [ebp+var_158]
CODE:0044ED31                 mov     edx, offset _str____0.Text ; '..',0
CODE:0044ED36                 call    @System@@LStrCmp$qqrv ; System::__linkproc__ LStrCmp(void)
CODE:0044ED3B                 jz      short loc_44EDAF ; 如果搜索到的项为'..',则跳转到loc_44EDAF处搜索下1项
CODE:0044ED3D                 test    [ebp+var_15C], 10h ; 判断是否含有属性: FILE_ATTRIBUTE_DIRECTORY
CODE:0044ED44                 jz      short loc_44ED6F ; 如果是目录则把搜索到的目录名追加到路径后面,然后递归调用执行sub_44EC70,否则跳转到loc_44ED6F处删除文件
CODE:0044ED46                 lea     eax, [ebp+var_168] ; 用于保存子目录路径
CODE:0044ED4C                 mov     ecx, [ebp+var_158] ; 搜索到的子目录名
CODE:0044ED52                 mov     edx, [ebp+var_4] ; 以'\'结尾的路径
CODE:0044ED55                 call    @System@@LStrCat3$qqrv ; System::__linkproc__ LStrCat3(void): 子符串拼接,子目录路径: [ebp+var_168]=[ebp+var158]+[ebp+var4]
CODE:0044ED5A                 mov     eax, [ebp+var_168] ; 子目录路径
CODE:0044ED60                 call    sub_44EC70      ; 递归调用
CODE:0044ED65                 test    al, al
CODE:0044ED67                 jnz     short loc_44EDAF
CODE:0044ED69                 mov     [ebp+var_5], 0
CODE:0044ED6D                 jmp     short loc_44EDAF
CODE:0044ED6F ; ---------------------------------------------------------------------------
CODE:0044ED6F
CODE:0044ED6F loc_44ED6F:                             ; CODE XREF: sub_44EC70+D4j
CODE:0044ED6F                 lea     eax, [ebp+System::AnsiString] ; 保存搜索到的文件路径
CODE:0044ED75                 mov     ecx, [ebp+var_158] ; 搜索到的非目录文件
CODE:0044ED7B                 mov     edx, [ebp+var_4] ; 以'\'结尾的路径
CODE:0044ED7E                 call    @System@@LStrCat3$qqrv ; System::__linkproc__ LStrCat3(void): 字符串拼接得到搜索到的文件路径: [ebp+System::AnsiString]=[ebp+var_158]+[ebp+var_4]
CODE:0044ED83                 mov     eax, [ebp+System::AnsiString] ; System::AnsiString
CODE:0044ED89                 xor     edx, edx        ; int: Attribute: 0
CODE:0044ED8B                 call    @Sysutils@FileSetAttr$qqrx17System@AnsiStringi ; Sysutils::FileSetAttr(System::AnsiString,int): 清空文件属性
CODE:0044ED90                 lea     eax, [ebp+var_170] ; 保存搜索到的文件路径
CODE:0044ED96                 mov     ecx, [ebp+var_158] ; 搜索到的非目录文件
CODE:0044ED9C                 mov     edx, [ebp+var_4] ; 以'\'结尾的路径
CODE:0044ED9F                 call    @System@@LStrCat3$qqrv ; System::__linkproc__ LStrCat3(void): 字符串拼接得到搜索到的文件路径: [ebp+170]=[ebp+var_158]+[ebp+var_4]
CODE:0044EDA4                 mov     eax, [ebp+var_170] ; System::AnsiString: 搜索到的文件路径
CODE:0044EDAA                 call    @Sysutils@DeleteFile$qqrx17System@AnsiString ; Sysutils::DeleteFile(const int System::AnsiString): 删除文件
CODE:0044EDAF
CODE:0044EDAF loc_44EDAF:                             ; CODE XREF: sub_44EC70+B5j
CODE:0044EDAF                                         ; sub_44EC70+CBj ...
CODE:0044EDAF                 lea     eax, [ebp+FatTime] ; lpFatTime
CODE:0044EDB5                 call    @Sysutils@FindNext$qqrr19Sysutils@TSearchRec ; Sysutils::FindNext(Sysutils::TSearchRec &): 搜索下一项
CODE:0044EDBA                 test    eax, eax        ; 判断是否搜索成功(FindNext成功时返回0,失败时返回非0)
CODE:0044EDBC                 jz      loc_44ED15      ; 如果成功则跳转到前面的loc_44ED15继续处理
CODE:0044EDC2                 lea     eax, [ebp+FatTime]
CODE:0044EDC8                 call    @Sysutils@FindClose$qqrr19Sysutils@TSearchRec ; 搜索完毕了: Sysutils::FindClose(Sysutils::TSearchRec &): 关闭搜索
CODE:0044EDCD
CODE:0044EDCD loc_44EDCD:                             ; CODE XREF: sub_44EC70+9Fj
CODE:0044EDCD                 xor     edx, edx        ; int: Attribute: 0
CODE:0044EDCF                 mov     eax, [ebp+var_4] ; System::AnsiString: 目录路径
CODE:0044EDD2                 call    @Sysutils@FileSetAttr$qqrx17System@AnsiStringi ; Sysutils::FileSetAttr(System::AnsiString,int): 清空目录属性
CODE:0044EDD7                 mov     eax, [ebp+var_4] ; System::AnsiString: 目录路径
CODE:0044EDDA                 call    @Sysutils@RemoveDir$qqrx17System@AnsiString ; Sysutils::RemoveDir(System::AnsiString): 删除目录
CODE:0044EDDF                 test    al, al
CODE:0044EDE1                 jz      short loc_44EDE9
CODE:0044EDE3                 mov     [ebp+var_5], 1
CODE:0044EDE7                 jmp     short loc_44EDED
CODE:0044EDE9 ; ---------------------------------------------------------------------------
CODE:0044EDE9
CODE:0044EDE9 loc_44EDE9:                             ; CODE XREF: sub_44EC70+171j
CODE:0044EDE9                 mov     [ebp+var_5], 0
CODE:0044EDED
CODE:0044EDED loc_44EDED:                             ; CODE XREF: sub_44EC70+177j
CODE:0044EDED                 xor     eax, eax
CODE:0044EDEF                 pop     edx
CODE:0044EDF0                 pop     ecx
CODE:0044EDF1                 pop     ecx
CODE:0044EDF2                 mov     fs:[eax], edx
CODE:0044EDF5                 jmp     short loc_44EE01
CODE:0044EDF7 ; ---------------------------------------------------------------------------
CODE:0044EDF7
CODE:0044EDF7 loc_44EDF7:                             ; DATA XREF: sub_44EC70+50o
CODE:0044EDF7                 jmp     @System@@HandleAnyException$qqrv ; System::__linkproc__ HandleAnyException(void)
CODE:0044EDFC ; ---------------------------------------------------------------------------
CODE:0044EDFC                 call    @System@@DoneExcept$qqrv ; System::__linkproc__ DoneExcept(void)
CODE:0044EE01
CODE:0044EE01 loc_44EE01:                             ; CODE XREF: sub_44EC70+185j
CODE:0044EE01                 xor     eax, eax
CODE:0044EE03                 pop     edx
CODE:0044EE04                 pop     ecx
CODE:0044EE05                 pop     ecx
CODE:0044EE06                 mov     fs:[eax], edx
CODE:0044EE09                 push    offset loc_44EE47
CODE:0044EE0E
CODE:0044EE0E loc_44EE0E:                             ; CODE XREF: sub_44EC70+1D5j
CODE:0044EE0E                 lea     eax, [ebp+var_170]
CODE:0044EE14                 mov     edx, 3
CODE:0044EE19                 call    @System@@LStrArrayClr$qqrpvi ; System::__linkproc__ LStrArrayClr(void *,int)
CODE:0044EE1E                 lea     eax, [ebp+FatTime]
CODE:0044EE24                 mov     edx, off_406E18
CODE:0044EE2A                 call    @System@@FinalizeRecord$qqrpvt1 ; System::__linkproc__ FinalizeRecord(void *,void *)
CODE:0044EE2F                 lea     eax, [ebp+var_C]
CODE:0044EE32                 call    @System@@LStrClr$qqrpv ; System::__linkproc__ LStrClr(void *)
CODE:0044EE37                 lea     eax, [ebp+var_4]
CODE:0044EE3A                 call    @System@@LStrClr$qqrpv ; System::__linkproc__ LStrClr(void *)
CODE:0044EE3F                 retn
CODE:0044EE40 ; ---------------------------------------------------------------------------
CODE:0044EE40
CODE:0044EE40 loc_44EE40:                             ; DATA XREF: sub_44EC70+42o
CODE:0044EE40                 jmp     unknown_libname_54 ; BDS 2005-2007 and Delphi6-7 Visual Component Library
CODE:0044EE45 ; ---------------------------------------------------------------------------
CODE:0044EE45                 jmp     short loc_44EE0E
CODE:0044EE47 ; ---------------------------------------------------------------------------
CODE:0044EE47
CODE:0044EE47 loc_44EE47:                             ; CODE XREF: sub_44EC70+1CFj
CODE:0044EE47                                         ; DATA XREF: sub_44EC70+199o
CODE:0044EE47                 mov     al, [ebp+var_5]
CODE:0044EE4A                 pop     edi
CODE:0044EE4B                 pop     esi
CODE:0044EE4C                 pop     ebx
CODE:0044EE4D                 mov     esp, ebp
CODE:0044EE4F                 pop     ebp
CODE:0044EE50                 retn
CODE:0044EE50 sub_44EC70      endp


最后于 2021-1-26 22:45 被低调putchar编辑 ,原因:
2021-1-26 17:32
0
雪    币: 114
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
这个样本的重点应该是时间计算产生Bug的点,也是为什么这么久之后才会爆发的原因吧,个人看法
2021-2-4 17:52
1
游客
登录 | 注册 方可回帖
返回
//