恶意代码逆向这个东西复杂的要死,细节很多,我只写了自己关注的部分,这文章主要当做笔记给自己看的,写的不是很详细。
恶意代码分析 lab-9.1
对于windows的恶意代码,导入函数起到非常大的作用,下面是改程序的:
Address Ordinal Name Library
------- ------- ---- -------
0040B000 OpenSCManagerA ADVAPI32
0040B004 OpenServiceA ADVAPI32
0040B008 ChangeServiceConfigA ADVAPI32
0040B00C CloseServiceHandle ADVAPI32
0040B010 CreateServiceA ADVAPI32
0040B014 RegDeleteValueA ADVAPI32
0040B018 RegCreateKeyExA ADVAPI32
0040B01C RegSetValueExA ADVAPI32
0040B020 RegOpenKeyExA ADVAPI32
0040B024 RegQueryValueExA ADVAPI32
0040B028 DeleteService ADVAPI32
0040B030 ExpandEnvironmentStringsA KERNEL32
0040B034 CopyFileA KERNEL32
0040B038 GetModuleFileNameA KERNEL32
0040B03C GetShortPathNameA KERNEL32
0040B040 Sleep KERNEL32
0040B044 WriteFile KERNEL32
0040B048 ReadFile KERNEL32
0040B04C GetLastError KERNEL32
0040B050 GetSystemDirectoryA KERNEL32
0040B054 CreateFileA KERNEL32
0040B058 GetFileTime KERNEL32
0040B05C SetFileTime KERNEL32
0040B060 DeleteFileA KERNEL32
0040B064 CloseHandle KERNEL32
0040B068 CompareStringW KERNEL32
0040B06C CompareStringA KERNEL32
0040B070 CreateProcessA KERNEL32
0040B074 GetFileAttributesA KERNEL32
0040B078 FlushFileBuffers KERNEL32
0040B07C LoadLibraryA KERNEL32
0040B080 GetProcAddress KERNEL32
0040B084 LCMapStringW KERNEL32
0040B088 LCMapStringA KERNEL32
0040B08C VirtualAlloc KERNEL32
0040B090 SetFilePointer KERNEL32
0040B094 GetStringTypeW KERNEL32
0040B098 ExitProcess KERNEL32
0040B09C TerminateProcess KERNEL32
0040B0A0 GetCurrentProcess KERNEL32
0040B0A4 GetTimeZoneInformation KERNEL32
0040B0A8 GetSystemTime KERNEL32
0040B0AC GetLocalTime KERNEL32
0040B0B0 DuplicateHandle KERNEL32
0040B0B4 GetCommandLineA KERNEL32
0040B0B8 GetVersion KERNEL32
0040B0BC SetStdHandle KERNEL32
0040B0C0 GetFileType KERNEL32
0040B0C4 SetHandleCount KERNEL32
0040B0C8 GetStdHandle KERNEL32
0040B0CC GetStartupInfoA KERNEL32
0040B0D0 CreatePipe KERNEL32
0040B0D4 GetExitCodeProcess KERNEL32
0040B0D8 WaitForSingleObject KERNEL32
0040B0DC HeapReAlloc KERNEL32
0040B0E0 HeapAlloc KERNEL32
0040B0E4 GetCPInfo KERNEL32
0040B0E8 GetACP KERNEL32
0040B0EC GetOEMCP KERNEL32
0040B0F0 UnhandledExceptionFilter KERNEL32
0040B0F4 FreeEnvironmentStringsA KERNEL32
0040B0F8 FreeEnvironmentStringsW KERNEL32
0040B0FC WideCharToMultiByte KERNEL32
0040B100 GetEnvironmentStrings KERNEL32
0040B104 GetEnvironmentStringsW KERNEL32
0040B108 GetModuleHandleA KERNEL32
0040B10C GetEnvironmentVariableA KERNEL32
0040B110 GetVersionExA KERNEL32
0040B114 HeapDestroy KERNEL32
0040B118 HeapCreate KERNEL32
0040B11C VirtualFree KERNEL32
0040B120 HeapFree KERNEL32
0040B124 RtlUnwind KERNEL32
0040B128 MultiByteToWideChar KERNEL32
0040B12C GetStringTypeA KERNEL32
0040B130 SetEnvironmentVariableA KERNEL32
0040B138 ShellExecuteA SHELL32
0040B140 22 shutdown WS2_32
0040B144 115 WSAStartup WS2_32
0040B148 52 gethostbyname WS2_32
0040B14C 19 send WS2_32
0040B150 23 socket WS2_32
0040B154 9 htons WS2_32
0040B158 4 connect WS2_32
0040B15C 3 closesocket WS2_32
0040B160 16 recv WS2_32
0040B164 116 WSACleanup WS2_32
对于dll大致分析:
Advapi32.dll ====> Windows组件访问,如服务管理器和注册表
Kernel32.dll ===> 包含系统核心功能,访问操作内存,文件,硬件等;
Wsock32.dll和Ws2_32.dll ===>这两个是联网DLL,访问其中任何一个DLL的程序非常可能链接网络,或者是执行网络相关任务
可以大致分析出这个程序会操作注册表,服务,执行一些网络行为,伴随着一些文件操作。
这个程序的代码量实在是庞大,所以就不贴代码了,说下主要功能:
首先程序有个密码验证功能,如果没有正确密码输入,它在执行的时候会删除自身,这可能是程序为了防止被发现,因为这是个后门程序。
对于密码的修补就可以用让参数验证函数一直返回1就可以了,给程序打个补丁。
它命令行参数有-in -re -c -cc 四个选项,对应这不同功能。
-in如下 , 这是个安装程序,注册表和服务同时操作,这一波也稍微明白可windows安装包内部是怎么操作的了。。。注册表和服务会使得这个程序实现自启动,这是后门常用的计俩了。
.text:00402B89 loc_402B89: ; CODE XREF: _main+8Fj .text:00402B89 lea edx, [ebp+ServiceName] .text:00402B8F push edx ; lpServiceName .text:00402B90 call sub_402600 .text:00402B95 add esp, 4 .text:00402B98 jmp short loc_402BC2
知识点
mov edi, [ebp+lpServiceName]
lea edx, [ebp+DisplayName]
or ecx, 0FFFFFFFFh
xor eax, eax
repne scasb
类似于上述的代码可以当做strcmp , strcpy , strcat 之类的代码反汇编,一开始还真没看出来。
windows恶意代码在system32这里面有时间戳相关技术来实现与kernel32.dll之类的保持一致,被称为timestomping技术。
值得注意的是如果你用od打开,即是没有参数程序也不会被删除,因为此时windows系统不允许删除这个文件。
总结
对于windows 恶意程序,静态分析想要得出完善的程序流程几乎不可能,我们应该以静态获得大致流程,以动态获得程序细节。