1、相关文件
DesktopLayer.exe.v :样本;
upDesktopLayer.exe.v :脱壳后的样本;
DesktopLayer.exe.new.v:由样本释放到C盘新建文件夹的文件;
dmlconf.dat:样本在iexplorer.exe 目录下创建的文件,用于写入系统时间信息 和网络连通时间差;
HookZwWriteVirtualMemroy Data.txt:API ZwWriteVirtualMemroy被Hook前后 的函数地址机器码,以及Hook过程中的 15 字节堆空间数据。
感染EXE和DLL文件过程中的文件: (Exe_Dll文件夹)
Exe_Sample.exe.v:一个满足感染条件且未被感染过的exe文件;
Exe_Sample_InFected.exe.v:被感染后的exe文件;
Exe_Sample_InFectedSrv.exe.v:被感染文件在运行时释放出来的文件;
Data2Exe_1.bin、Data2Exe_1.bin:感染时向EXE和DLL中写入的两段数据;
Data2ExeAsm.txt:被感染文件入口点代码行为分析文件;
感染HTML和HTM文件过程中的文件: (Html_Htm文件夹)
Html_Sample.html.v:一个满足感染条件且未被感染过的HTML文件;
Html_Sample_InFected.html.v:被感染后的HTML文件;
Data2Html.bin:感染时向HTML文件中追加的数据;
感染可移动磁盘文件过程中的文件:(RemovableDisk文件夹)
RECYCLER_1.rar:含有自动运行文件和写入的exe文件(RECYCLER 的二级文 件名和EXE文件名均具有随机性)。
以上文件中相关文件的MD5和SHA1值如下:
样本DesktopLayer.exe.v
MD5:FF5E1F27193CE51EEC318714EF038BEF
SHA1:B4FA74A6F4DAB3A7BA702B6C8C129F889DB32CA6
释放的文件DesktopLayer.exe.new.v、Exe_Sample_InFectedSrv.exe.v和感染 可移动磁盘时写入的exe文件其实是同一个文件:
MD5: 240B869098AF035A4FD7968308C86EDD
SHA1: 0798717EEE86F30EBF8BD11F3C8F4C2B473BC724
向 HTML和HTM文件中写入的数据Data2Html.bin:
MD5:36748DD7B6C9EFBF0A6371C307DC2D2C
SHA1:1E3934254D07F67D54DFD5D69F86DDAC200BD39F
2、行为预览
样本名称:DesktopLayer.exe
样本类型:Win32.Ramnit(由360云查杀确定)
样本大小:55.0 KB(56320 字节)
传播方式:本地磁盘文件感染和可移动磁盘传播
样本具体行为:该样本在运行过程中分3个阶段,下面详细说明每个阶段的关 键行为。
l Phase1:勘测本机环境,确保样本的关键行为能顺利执行:
1. 通过注册表获取 iexplorer.exe 程序的目录,并在该目录下查找验证 iexplorer.exe 程序是否存在;
2. 尝试在C盘的相应位置(共7个备选路径,详见后文)创建文件夹"Microsoft",并复制新样本到新创建的文件夹中, 其中复制到新文件夹下的新样本内容即为手动脱壳后的upDesktopLayer.exe.v的内容;
3. 启动新文件夹下的新样本程序。
l Phase2:通过 HookZwWriteVirtualMemory完成对 iexplorer.exe的注入, 关键代码均在iexplorer.exe中。
1. 验证特定文件夹(Phase1创建的文件夹)下是否存在样本文件;
2. 获取 ntdll.dll的一些导出函数地址保存到全局变量中,便于后续代码中直接调用;
3. Hook ZwWriteVirtualMemory
4. 调用 CreateProcessA来启动 iexplorer.exe进程,在该 API内部会调用 ZwWriteVirtualMemory进而完成对 iexplorer.exe的注入;
l Phase3:iexplorer.exe的入口点被修改之后程序的原流程发生了变化,这使得iexplorer.exe其实变成了一个执行注入代码的壳。注入代码的行为如下:
1. 填写内存 PE 的 IAT 并处理节数据:
2. 初始化 SOCKET
3. 获取系统磁盘信息、版本信息和本地语言环境信息,用于向远程发送,并接收远程数据;
4. 创建6个线程,完成核心工作,关于6个线程的功能描述如下:
Thread1: 20017ACA功能:
每隔 1 秒就打开注册表项: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon
并读取 Userinit 的键值,然后检查样本文件目录(c:\programfiles\microsoft\desktoplayer.exe)是否在键值中,如果不在的话就将样本文件目录追加到该键值中,以达到开机启动样本的目的。
Thread2: 20017626功能:
间歇性的测试与google.com 的 80 端口、bing.com 的 80 端口、yahoo.com 的 80 端口的连通性,只要有一个连通,就不再测试后面的网址并在全局变量 2001A23B 处保存两次能够连通的时间差(秒单位)。
Thread3: 2001781F功能:
每分钟向"C:\Program Files\Internet Explorer\dmlconf.dat" 中写入 16 字节的数据,前8字节为系统时间,接着是 4字节数据是两次连通特定网站的时间差,最后 4 字节数据始终为 0。
Thread4: 2001790C功能:
每10分钟向 "fget-career.com的443端口" 发送当前系统时间信息以及含有本机信息的字符串,并接收 "fget-career.com" 发回的数据。
Thread5: 20016EA8功能:
对 DRIVE_FIXED类型的磁盘进行遍历感染,感染方式:
对 html和htm文件的感染方式:先检查文件内容的最后9字节数据是不是“"</SCRIPT>”以此来判断该文件是否被感染过,如果没有被感染,则在文件末尾添加数据,数据具体的内容可以本文档的相关文件中提取。
对 EXE 或 DLL 文件的感染方式:
1:查看该文件的导入表中是否有按名称导入“LoadLibraryA”和 "GetProcessAddress" 这两个函数,有的话就获取该函数在 IAT 项中的 RVA, 没有的话不感染;
2:查看该文件节表后是否有一个节表大小的全0可用空间,如果有就利用该位置添加一个新节(添加的新节名称为".rmnet"),否则不感染;
3:对“LoadLibraryA”和"GetProcessAddress" 的函数地址进行重定位,方便在注入代码中进行调用;
4:修改程序员入口点为新节地址,更改程序执行流程;
5:向源文件中写入两段数据,写入的数据见文件。
20016AA9 E8 DDFCFFFF CALL 2001678B 该调用是处理 exe 和 dll 文件的关键调用
2001633E E8 4A070000 CALL 20016A8D 该句是核心感染过程
Thread6: 20016EC2功能:
每10秒钟遍历一次所有磁盘,当磁盘类型为可移动磁盘时,对该磁盘进行感染:
感染 DRIVE_REMOVABLE 磁盘的方式:首先判断该磁盘是否被感染过,如果已经被感染过则不再感染,否者进行关键感染行为。
对是否已经感染的判断:
1:磁盘根目录存在 "autorun.inf" 文件;
2:"autorun.inf"文件大小大于 3 字节; 3:"autorun.inf"文件头3字节内容为"RmN"
以上3条都满足时,表明该可移动磁盘已经被感染过。
对没有感染过的磁盘进行的感染行为:
1:磁盘根目录创建"RECYCLER"文件夹并设置属性为 HIDDEN;
2:"RECYCLER"文件夹下创建子文件夹并设置属性为 HIDDEN;
3:子文件夹下创建文件"AyZIKwEU.exe"(文件名不唯一,具有随机性)并写入数 据;写入的数据其实也是之前 释放出来的新样本的数据;
4:磁盘根目录创建"autorun.inf" 并设置属性为 HIDDEN;
5:分4次写入数据到 "autorun.inf" 。
达到可移动磁盘插入电脑后可以自动运行新样本的目的
3、清理方式
1. 使用字符串"KyUffThOkYwRRtgPP" 创建互斥体,如果互斥体已经存在,说明已经有样本在运行,此时需要遍历系统所有进程,查找名称为"DesktopLayer "和"iexplore "的进程:
对于"DesktopLayer"进程:直接结束;
对于"iexplore "进程:如果进程空间的20010000地址为有效地址,则 直接结束进程,同时删除iexplore目录下的 dmlconf.dat文件。
2. 依次在1:"C:\Program Files\";
2:"C:\Program Files\Common Files\";
3:"C:\Documents and Settings\Administrator\ ";
4:"C:\Documents andSettings\Administrator\Application Data\ ";
5:"C:\WINDOWS\system32\ ";
6:"C:\WINDOWS\ ";
7:"C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\";
目录下查找"Microsoft"目录,如果找到该目录,则删除该目录及目录下的"DesktopLayer.exe"文件。
3. 读取HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\
CurrentVersion\Winlogon的Userinit 的键值,并判断键值内容的最后一个启动项中是否包含"desktoplayer.exe",如果包含,则删除最后一个启动项。
4. 遍历全盘文件,进行查杀:
对于 DISK_FIXED类型的磁盘,在遍历时可以避开系统目录和Windows目录,对于EXE文件,如果文件MD5和特征文件的MD5匹配,则直接删除;
对于EXE、DLL,如果节表中含有".rmnet"节,则可判定文件已经被感染,可由用户决定是删除文件还是修复文件(修复办法:删除".rmnet"节并修复入口点);对HTML、HTM文件,可以通过文件最后9 字节内容是否是"</SCRIPT>"来判断文件是否被感染,文如果文件已被感染,则由用户决定是删除文件还是修复文件(修复办法:删除文件
"<SCRIPT Language=VBScript>"之后的内容)。
对于 DISK_REMOVABLE类型的磁盘,如果磁盘根目录有"autorun.inf"文件且文件头3字节内容为"RmN",则可判定该磁盘已经被感染,需要从该文件总提取住exe文件的路径,然后先删除"autorun.inf"文件,再删除
exe 文件。
4、正文
在对样本进行分析之前,先用 PEiD对样本进行查壳:
通过PEiD可以发现,该样本加了UPX壳,手动脱掉之后的文件为upDesktopLayer.exe.v后续的分析均是直接针对脱壳后的文件的。
Phase1:
1-1:获取IE路径并验证 IE 可执行文件是否存在 (3种方法): 如果三种方法均不能找到 IE 路径并验证对应路径下 IE 可执行文件的存在,则样本行为就此终止。
(1-1-1)通过注册表"HKEY_CLASSES_ROOT\http\shell\open\command" 获取IE路径并验证IE可执行文件是否存在
00401723 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
00401726 50 PUSH EAX
00401727 68 E9D84000 PUSH upDeskto.0040D8E9 ; ASCII "http\shell\open\command"
0040172C 68 00000080 PUSH 80000000
00401731 E8 D6160000 CALL upDeskto.00402E0C ; JMP to ADVAPI32.RegOpenKeyA
/*
//参数信息:
0012FF9C 00401736 /CALL to RegOpenKeyA from upDeskto.00401731
0012FFA0 80000000 |hKey = HKEY_CLASSES_ROOT
0012FFA4 0040D8E9 |Subkey = "http\shell\open\command"
0012FFA8 0012FFB0 \pHandle = 0012FFB0
*/
00401743 50 PUSH EAX
00401744 FF75 08 PUSH DWORD PTR SS:[EBP+8]
00401747 6A 00 PUSH 0
00401749 6A 00 PUSH 0
0040174B 6A 00 PUSH 0
0040174D FF75 FC PUSH DWORD PTR SS:[EBP-4]
00401750 E8 BD160000 CALL upDeskto.00402E12 ; JMP toADVAPI32.RegQueryValueExA
/*
//参数信息:
0012FF94 0000003A |hKey = 3A
0012FF98 00000000 |ValueName = NULL
0012FF9C 00000000 |Reserved = NULL
0012FFA0 00000000 |pValueType = NULL
0012FFA4 0040DFD0 |Buffer = upDeskto.0040DFD0
0012FFA8 0012FFAC \pBufSize = 0012FFAC
*/
/*获取的 IE 路径
0040DFD0 22 43 3A 5C 50 72 6F 67 72 61 6D 20 46 69 6C65 "C:\Program File
0040DFE0 73 5C 49 6E 74 65 72 6E 65 74 20 45 78 70 6C6F s\Internet Explo
0040DFF0 72 65 72 5C 49 45 58 50 4C 4F 52 45 2E 45 5845 rer\IEXPLORE.EXE
0040E000 22 20 2D 6E 6F 68 6F 6D 65 00 70 00 6C 00 6F00 " -nohome.p.l.o.
0040E010 72 00 65 00 72 00 5C 00 49 00 45 00 58 00 5000 r.e.r.\.I.E.X.P.
0040E020 4C 00 4F 00 52 00 45 00 2E 00 45 00 58 00 4500 L.O.R.E...E.X.E.
0040E030 22 00 20 00 2D 00 6E 00 6F 00 68 00 6F 00 6D00 ". .-.n.o.h.o.m.
0040E040 65 00 00 00 00 00 00 00 00 00 00 00 00 00 0000 e...............
*/
004011FF 50 PUSH EAX
00401200 FF75 08 PUSH DWORD PTR SS:[EBP+8]
00401203 E8 201B0000 CALL upDeskto.00402D28 ; JMP to kernel32.FindFirstFileA
/*
//参数信息:
0012FE58 0040DFD0 |FileName = "C:\Program Files\Internet Explorer\IEXPLORE.EXE"
0012FE5C 0012FE62 \pFindFileData = 0012FE62
*/
(1-1-2)通过绝对路径 "C:\Program Files\InternetExplorer\IEXPLORE.EXE" 获取 IE 路径并验证 IE 可执行文件是否存在
004017B5 FF75 0C PUSH DWORD PTR SS:[EBP+C]
004017B8 FF75 08 PUSH DWORD PTR SS:[EBP+8]
004017BB 68 7AD84000 PUSH upDeskto.0040D87A ; ASCII"%ProgramFiles%\Internet Explorer\iexplore.exe"
004017C0 E8 57150000 CALL upDeskto.00402D1C ; JMP to kernel32.ExpandEnvironmentStringsA
/*
//参数信息:
0012FFA0 0040D87A |SrcString = "%ProgramFiles%\Internet Explorer\iexplore.exe"
0012FFA4 0040DFD0 |DestString = "C:\Program Files\Internet Explorer\IEXPLORE.EXE"
0012FFA8 00000400 \DestSizeMax = 400 (1024.)
*/
004011FF 50 PUSH EAX
00401200 FF75 08 PUSH DWORD PTR SS:[EBP+8]
00401203 E8 201B0000 CALL upDeskto.00402D28 ; JMP to kernel32.FindFirstFileA
/*
//参数信息:
0012FE58 0040DFD0 |FileName = "C:\Program Files\Internet Explorer\iexplore.exe"
0012FE5C 0012FE62 \pFindFileData = 0012FE62
*/
(1-1-3)通过注册表"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\
CurrentVersion\AppPaths\IEXPLORE.EXE" 获取 IE 路径并验证 IE 可执行文件是否存在
004017E7 50 PUSH EAX
004017E8 68 A8D84000 PUSH upDeskto.0040D8A8 ; ASCII "SOFTWARE\Microsoft\Windows\CurrentVersion\AppPaths\IEXPLORE.EXE"
004017ED 68 02000080 PUSH 80000002
004017F2 E8 15160000 CALL upDeskto.00402E0C ; JMP to ADVAPI32.RegOpenKeyA
/*
//参数信息:
0012FFA0 80000002 |hKey = HKEY_LOCAL_MACHINE
0012FFA4 0040D8A8 |Subkey = "SOFTWARE\Microsoft\Windows\CurrentVersion
\App Paths\IEXPLORE.EXE"
0012FFA8 0012FFB0 \pHandle = 0012FFB0
*/
00401804 50 PUSH EAX
00401805 FF75 08 PUSH DWORD PTR SS:[EBP+8]
00401808 6A 00 PUSH 0
0040180A 6A 00 PUSH 0
0040180C 6A 00 PUSH 0
0040180E FF75 FC PUSH DWORD PTR SS:[EBP-4]
00401811 E8 FC150000 CALL upDeskto.00402E12 ; JMP toADVAPI32.RegQueryValueExA
/*
//参数信息:
0012FF94 00000038 |hKey = 38
0012FF98 00000000 |ValueName = NULL
0012FF9C 00000000 |Reserved = NULL
0012FFA0 00000000 |pValueType = NULL
0012FFA4 0040DFD0 |Buffer = upDeskto.0040DFD0
0012FFA8 0012FFAC \pBufSize = 0012FFAC
*/
/*获取的 IE 路径
0040DFD0 43 3A 5C 50 72 6F 67 72 61 6D 20 46 69 6C 6573 C:\Program Files
0040DFE0 5C 49 6E 74 65 72 6E 65 74 20 45 78 70 6C 6F72 \Internet Explor
0040DFF0 65 72 5C 49 45 58 50 4C 4F 52 45 2E 45 58 4500 er\IEXPLORE.EXE.
*/
004011FF 50 PUSH EAX
00401200 FF75 08 PUSH DWORD PTR SS:[EBP+8]
00401203 E8 201B0000 CALL upDeskto.00402D28 ; JMP to kernel32.FindFirstFileA
/*
//参数信息:
0012FE58 0040DFD0 |FileName = "C:\Program Files\Internet Explorer\
IEXPLORE.EXE"
0012FE5C 0012FE62 \pFindFileData = 0012FE62
*/
1-2:依次尝试在 1:"C:\Program Files\ ";
2:"C:\Program Files\CommonFiles\ ";
3:"C:\Documents andSettings\Administrator\ ";
4:"C:\Documents andSettings\Administrator\Application Data\ ";
5:"C:\WINDOWS\system32\ ";
6:"C:\WINDOWS\ ";
7:"C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\";
下创建" Microsoft"目录并写入临时文件,用于测试能否在该目录下成功创建文件,为后续在该目录下创建文件"DesktopLayer.exe" 做准备,如果当前路径尝试成功,则停止尝试。 如果上述7个路径的尝试均失败,则样本行为就此结束。
这里演示仅以第一个路径作为示例:
(1-2-1)创建文件夹 "C:\Program Files\Microsoft"
00401534 6A 00 PUSH 0
00401536 8D85 00FCFFFF LEA EAX,DWORD PTR SS:[EBP-400]
0040153C 50 PUSH EAX
0040153D E8 B0170000 CALLupDeskto.00402CF2 ; JMP to kernel32.CreateDirectoryA
/*
//参数信息:
0012FB40 0012FB64 |Path = "C:\Program Files\Microsoft"
0012FB44 00000000 \pSecurity = NULL
*/
新创建的文件夹" Microsoft "
(1-2-2)通过在该文件夹下创建一个临时文件以检验能否在该文件下创建新文件
00401242 6A 00 PUSH 0
00401244 68 80000000 PUSH 80
00401249 6A 02 PUSH 2
0040124B 6A 00 PUSH 0
0040124D 6A 00 PUSH 0
0040124F 68 000000C0 PUSH C0000000
00401254 8D85 00FCFFFF LEA EAX,DWORD PTR SS:[EBP-400]
0040125A 50 PUSH EAX
0040125B E8 981A0000 CALLupDeskto.00402CF8 ; JMP tokernel32.CreateFileA
/*
//参数信息:
0012F720 0012F73C |FileName = "C:\Program Files\Microsoft\px1.tmp"
0012F724 C0000000 |Access = GENERIC_READ|GENERIC_WRITE
0012F728 00000000 |ShareMode = 0
0012F72C 00000000 |pSecurity = NULL
0012F730 00000002 |Mode = CREATE_ALWAYS
0012F734 00000080 |Attributes = NORMAL
0012F738 00000000 \hTemplateFile = NULL
*/
(1-2-3)删除刚刚创建的临时文件
00401271 50 PUSH EAX
00401272 E8 991A0000 CALL upDeskto.00402D10 ; JMP tokernel32.DeleteFileA
/*
//参数信息:
0012F738 0012F73C \FileName = "C:\Program Files\Microsoft\px1.tmp"
*/
1-3:释放一个新样本到之前创建的目录下,名命为“DesktopLayer.exe”,并调用 CreateProcess 来启动该应用程序。
(1-3-1)获取当前应用程序路径名称
00402C8D 68 04010000 PUSH 104
00402C92 68 D1E34000 PUSH upDeskto.0040E3D1
00402C97 6A 00 PUSH 0
00402C99 E8 AE000000 CALL upDeskto.00402D4C ; JMP to kernel32.GetModuleFileNameA
/*
//参数信息:
0012FFB8 00000000 |hModule = NULL
0012FFBC 0040E3D1 |PathBuffer = upDeskto.0040E3D1
0012FFC0 00000104 \BufSize = 104 (260.)
*/
/*当前应用程序路径名称
0040E3D1 43 3A 5C 44 6F 63 75 6D 65 6E 74 73 20 61 6E64 C:\Documents and
0040E3E1 20 53 65 74 74 69 6E 67 73 5C 41 64 6D 69 6E69 Settings\Admini
0040E3F1 73 74 72 61 74 6F 72 5C D7 C0 C3 E6 5C 54 656D strator\桌面\Tem
0040E401 70 5C 75 70 44 65 73 6B 74 6F 70 4C 61 79 6572 p\upDesktopLayer
0040E411 2E 65 78 65 .exe
*/
(1-3-2)释放新样本到新创建的文件夹下,新文件名称为“DesktopLayer.exe”
00402C2C 6A 00 PUSH 0
00402C2E FF75 F4 PUSH DWORD PTR SS:[EBP-C]
00402C31 FF75 08 PUSH DWORD PTR SS:[EBP+8]
00402C34 E8 B3000000 CALL upDeskto.00402CEC ; JMP to kernel32.CopyFileA
/*
//参数信息:
0012FF8C 0040E3D1 |ExistingFileName = "C:\Documents and Settings
\Administrator\桌面\Temp\upDesktopLayer.exe"
0012FF90 00910020 |NewFileName = "C:\Program Files\Microsoft\
DesktopLayer.exe"
0012FF94 00000000 \FailIfExists = FALSE
*/
释放的新样本文件
(1-3-3)启动 "C:\ProgramFiles\Microsoft\DesktopLayer.exe", Phase1关键行为已经结束
004013A2 8D45 AC LEA EAX,DWORD PTR SS:[EBP-54]
004013A5 50 PUSH EAX
004013A6 8D45 BC LEA EAX,DWORD PTR SS:[EBP-44]
004013A9 50 PUSH EAX
004013AA 6A 00 PUSH 0
004013AC 6A 00 PUSH 0
004013AE 6A 00 PUSH 0
004013B0 6A 00 PUSH 0
004013B2 6A 00 PUSH 0
004013B4 6A 00 PUSH 0
004013B6 FF75 08 PUSH DWORD PTR SS:[EBP+8]
004013B9 6A 00 PUSH 0
004013BB E8 44190000 CALL upDeskto.00402D04 ; JMP tokernel32.CreateProcessA
/*
//参数信息:
0012FF0C 00000000 |ModuleFileName = NULL
0012FF10 00910020 |CommandLine = "C:\Program Files\Microsoft\
DesktopLayer.exe"
0012FF14 00000000 |pProcessSecurity = NULL
0012FF18 00000000 |pThreadSecurity = NULL
0012FF1C 00000000 |InheritHandles = FALSE
0012FF20 00000000 |CreationFlags = 0
0012FF24 00000000 |pEnvironment = NULL
0012FF28 00000000 |CurrentDir = NULL
0012FF2C 0012FF44 |pStartupInfo = 0012FF44
0012FF30 0012FF34 \pProcessInfo = 0012FF34
*/
//这里手动修改 "C:\ProgramFiles\Microsoft\DesktopLayer.exe" 的入口点为 0XCC(同时需要记下原值,便于恢复),OD即可在样本启动的时断下该进程
Phase2:
2-1验证特定文件夹(Phase1创建的文件夹)下是否存在样本文件:
00402C8D 68 04010000 PUSH 104
00402C92 68D1E34000 PUSH DesktopL.0040E3D1
00402C97 6A00 PUSH 0
00402C99 E8 AE000000 CALL DesktopL.00402D4C ; JMP to kernel32.GetModuleFileNameA
/*
参数信息:
0012FFB8 00000000 |hModule = NULL
0012FFBC 0040E3D1 |PathBuffer = DesktopL.0040E3D1
0012FFC0 00000104 \BufSize = 104 (260.)
功能: 获取当前应用程序模块路径
0040E3D1 43 3A 5C 50 72 6F 67 72 61 6D 20 46 69 6C 6573 C:\Program Files
0040E3E1 5C 4D 69 63 72 6F 73 6F 66 74 5C 44 65 73 6B74 \Microsoft\Deskt
0040E3F1 6F 70 4C 61 79 65 72 2E 65 78 65 00 00 opLayer.exe..
*/
00402C9E 50 PUSH EAX
00402C9F 68 D1E34000 PUSH DesktopL.0040E3D1 ; ASCII "C:\Program Files\Microsoft\
DesktopLayer.exe"
00402CA4 E8 94E3FFFF CALL DesktopL.0040103D
/*
参数信息:
0012FFBC 0040E3D1 |Arg1 = 0040E3D1 ASCII "C:\Program Files\Microsoft
\DesktopLayer.exe"
0012FFC0 0000002B \Arg2 = 0000002B
功能: MOV BYTE PTR[Arg1 + Arg2], 0
*/
00402CA9 68 D1E34000 PUSH DesktopL.0040E3D1 ; ASCII "C:\Program Files\Microsoft
\DesktopLayer.exe"
00402CAE E8 D6FEFFFF CALL DesktopL.00402B89
/*
参数信息:
0012FFC0 0040E3D1 \Arg1 = 0040E3D1 ASCII "C:\Program Files\Microsoft\
DesktopLayer.exe"
功能: 判断样本文件是否已经位于特定文件夹下
返回值: 是1,否0
*/
2-2获取 ntdll.dll 的一些导出函数地址保存到全局变量中,便于后续代码的调用:
0040184E 68 01D94000 PUSH DesktopL.0040D901 ; ASCII "ntdll.dll"
00401853 E8 FA140000 CALL DesktopL.00402D52 ; JMP to kernel32.GetModuleHandleA
00401858 83F8 00 CMP EAX,0
0040185B 0F84 6C010000 JE DesktopL.004019CD
00401861 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
00401864 68 0FD94000 PUSH DesktopL.0040D90F ; ASCII "LdrLoadDll"
00401869 FF75 FC PUSH DWORD PTR SS:[EBP-4]
0040186C E8 E7140000 CALL DesktopL.00402D58 ; JMP to kernel32.GetProcAddress
00401871 83F8 00 CMP EAX,0
00401874 0F84 53010000 JE DesktopL.004019CD
0040187A A3 0BD94000 MOV DWORD PTR DS:[40D90B],EAX
0040187F 68 1ED94000 PUSH DesktopL.0040D91E ; ASCII "LdrGetDllHandle"
00401884 FF75 FC PUSH DWORD PTR SS:[EBP-4]
00401887 E8 CC140000 CALL DesktopL.00402D58; JMP tokernel32.GetProcAddress
0040188C 83F8 00 CMP EAX,0
0040188F 0F84 38010000 JE DesktopL.004019CD
00401895 A3 1AD94000 MOV DWORD PTR DS:[40D91A],EAX
0040189A 68 32D94000 PUSH DesktopL.0040D932 ASCII"LdrGetProcedureAddress"
0040189F FF75 FC PUSH DWORD PTR SS:[EBP-4]
004018A2 E8 B1140000 CALL DesktopL.00402D58 ; JMP to kernel32.GetProcAddress
004018A7 83F8 00 CMP EAX,0
004018AA 0F84 1D010000 JE DesktopL.004019CD
004018B0 A3 2ED94000 MOV DWORD PTR DS:[40D92E],EAX
004018B5 68 4DD94000 PUSH DesktopL.0040D94D; ASCII"RtlInitUnicodeString"
004018BA FF75 FC PUSH DWORD PTR SS:[EBP-4]
004018BD E8 96140000 CALL DesktopL.00402D58; JMP tokernel32.GetProcAddress
004018C2 83F8 00 CMP EAX,0
004018C5 0F84 02010000 JE DesktopL.004019CD
004018CB A3 49D94000 MOV DWORD PTR DS:[40D949],EAX
004018D0 68 66D94000 PUSH DesktopL.0040D966 ; ASCII "RtlUnicodeStringToAnsiString"
004018D5 FF75 FC PUSH DWORD PTR SS:[EBP-4]
004018D8 E8 7B140000 CALL DesktopL.00402D58; JMP tokernel32.GetProcAddress
004018DD 83F8 00 CMP EAX,0
004018E0 0F84 E7000000 JE DesktopL.004019CD
004018E6 A3 62D94000 MOV DWORD PTR DS:[40D962],EAX
004018EB 68 87D94000 PUSH DesktopL.0040D987 ; ASCII "RtlFreeAnsiString"
004018F0 FF75 FC PUSH DWORD PTR SS:[EBP-4]
004018F3 E8 60140000 CALL DesktopL.00402D58 ; JMP to kernel32.GetProcAddress
004018F8 83F8 00 CMP EAX,0
004018FB 0F84 CC000000 JE DesktopL.004019CD