临时补充一个内容,这是一个后门程序,通过IDA分析,之后把里面收集的信息点全部整理出来(包括:反虚拟机,系统信息等等)pass:guet
用IDA打开先看看主函数的样子
查阅一些这些API
InternetOpenA:
参数:
lpszAgent: [输入] 指定用户代理名称的字符串。
dwAccessType: [输入] 指定访问类型的标志。例如,使用 INTERNET_OPEN_TYPE_DIRECT 直接连接到互联网。
lpszProxyName: [输入] 指定代理服务器名称的字符串。
lpszProxyBypass: [输入] 指定应绕过的代理服务器的主机名的字符串。
dwFlags: [输入] 附加选项标志。
返回值:返回一个有效的句柄,表示打开的 Internet 会话;如果失败,则返回 NULL。
InternetOpenUrlA:
参数:
hInternet: [输入] 用于请求的 Internet 连接句柄。
lpszUrl: [输入] 指向包含 URL 的 null 结尾字符串的指针。
lpszHeaders: [输入] 指向包含 HTTP 请求标头的可选 null 结尾字符串的指针。
dwHeadersLength: [输入] 指定标头字符串的长度(以字节为单位)。
dwFlags: [输入] 附加选项标志。
dwContext: [输入] 用户定义的上下文值。
返回值:如果成功,则返回一个有效的句柄,表示在指定的 Internet 会话中打开的 URL;如果失败,则返回 NULL。
InternetCloseHandle:
参数:
hInternet: [输入] 打开的 Internet 句柄。
返回值:如果成功,返回 TRUE;如果失败,返回 FALSE。
GetLastError:
参数:无
返回值:返回最近发生的错误代码。
FormatMessageA:
参数:
dwFlags: [输入] 格式化选项标志。
lpSource: [输入] 指向包含消息定义的可执行模块或 DLL 的指针。
dwMessageId: [输入] 错误消息标识符。
dwLanguageId: [输入] 语言标识符。
lpBuffer: [输出] 接收格式化消息文本的缓冲区。
nSize: [输入] 缓冲区的大小(以字符为单位)。
Arguments: [输入] 指向一个数组,其中包含要插入格式化消息的参数的地址。
返回值:如果成功,则返回写入缓冲区的字符数,不包括 null 终止字符;如果失败,则返回 0。
LocalFree:
参数:
hMem: [输入] 要释放的内存句柄。
返回值:如果成功,返回 NULL;如果失败,返回非空值。
也就是说上面这段代码就是传输在你本机上读取的信息
看到sub_1400010D0这个函数这个函数有点长,我们慢慢分析
先查阅一下函数
RegOpenKeyExW:
参数:
hKey: [输入] 要打开的注册表项的父键句柄。
lpSubKey: [输入] 指向要打开的子键名称的字符串指针。
ulOptions: [输入] 注册表项打开选项,例如 REG_OPTION_OPEN_LINK。
samDesired: [输入] 访问注册表项的安全性和访问权限。
phkResult: [输出] 接收打开的注册表项句柄。
RegQueryValueExW:
参数:
hKey: [输入] 打开的注册表项句柄。
lpValueName: [输入] 指向要查询的值的名称的字符串指针。
lpReserved: [保留] 保留参数,必须设置为 NULL。
lpType: [输出] 接收值的类型。
lpData: [输出] 接收查询到的值的缓冲区。
lpcbData: [输入/输出] 指定 lpData 缓冲区大小的指针。
RegCloseKey:
参数:
hKey: [输入] 要关闭的注册表项句柄。
SLIsGenuineLocal:
参数:
pComponent: [输入] 保留参数,必须设置为 NULL。
SysAllocString:
参数:
psz: [输入] 指向以 null 结尾的字符串的指针。
CoUninitialize:
参数:无
SysFreeString:
参数:
bstrString: [输入] 要释放的 BSTR 字符串。
GetPwrCapabilities:
参数:
pSystemPowerCapabilities: [输出] 接收系统电源功能信息的结构体指针。
MultiByteToWideChar:
参数:
CodePage: [输入] 指定要使用的代码页。
dwFlags: [输入] 附加选项标志。
lpMultiByteStr: [输入] 指向多字节字符的字符串指针。
cbMultiByte: [输入] 多字节字符的长度(以字节为单位)。
lpWideCharStr: [输出] 接收宽字符的缓冲区。
cchWideChar: [输入] 缓冲区的大小(以字符为单位)。
GetDiskFreeSpaceExW:
参数:
lpDirectoryName: [输入] 要查询的目录的路径。
lpFreeBytesAvailable: [输出] 接收可用空间的指针。
lpTotalNumberOfBytes: [输出] 接收总空间的指针。
lpTotalNumberOfFreeBytes: [输出] 接收总可用空间的指针。
GlobalMemoryStatusEx:
参数:
lpBuffer: [输入/输出] 指向接收内存信息的结构体指针。
Sleep:
参数:
dwMilliseconds: [输入] 线程挂起的时间,以毫秒为单位。
GetLastInputInfo:
参数:
plii: [输入/输出] 指向 LASTINPUTINFO 结构体的指针,用于接收最后输入信息。
GetTickCount:
参数:无
VariantClear:
参数:
pvarg: [输入/输出] 要清除的 VARIANT 变量。
RegOpenKeyExW:如果成功,返回 ERROR_SUCCESS;如果失败,返回错误代码。
RegQueryValueExW:如果成功,返回 ERROR_SUCCESS;如果失败,返回错误代码。
RegCloseKey:如果成功,返回 ERROR_SUCCESS;如果失败,返回错误代码。
SLIsGenuineLocal:如果操作系统是正版的,返回非零值;否则返回零。
SysAllocString:如果成功,返回分配的 BSTR 字符串;如果失败,返回 NULL。
CoUninitialize:无返回值。
SysFreeString:无返回值。
GetPwrCapabilities:如果成功,返回非零值;如果失败,返回零。
MultiByteToWideChar:如果成功,返回转换后的宽字符数;如果失败,返回零。
GetDiskFreeSpaceExW:如果成功,返回非零值;如果失败,返回零。
GlobalMemoryStatusEx:无返回值。
Sleep:无返回值。
GetLastInputInfo:如果成功,返回非零值;如果失败,返回零。
GetTickCount:返回从系统启动到当前经过的毫秒数。
VariantClear:如果成功,返回 S_OK;如果失败,返回错误代码。
后续我们分析一下代码逻辑