一、介绍
1. 什么是白加黑
通俗的讲白加黑中的白就是指被杀软列入到可信任列表中的文件。比如说微软自带的系统文件或者一些有有效证书签名的文件,什么是微软文件,或者什么是有效签名文件在后面我们会提到他的辨别方法。黑就是指我们自己的文件,没有有效证书签名,也不是微软文件。通常这种文件会被杀软加入到可疑名单中。
2. 白加黑的作用是什么
在很多的杀软中会对白文件的操作进行放行,如果我们将黑程序和白程序在一个进程中是否就可以绕过一些杀软的检测。
二、如何挖掘利用白文件
1. 思考->解决
问:如果我们想要将我们的黑程序载入到白文件中有什么办法?
答:通常情况下我们可以利用注入去将一个程序执行到另外的程序中。
问:在程序执行的开始,如何加载一个DLL。
答:程序加载的时候会优先加载当前文件夹下的文件下的DLL,当然这些DLL要存在于可执行程序的导入表中。
2. 挖掘白文件
首先我们先去找几个有签名的文件或者微软的可执行文件。
下图就是签名的鉴别方式。必须是正常数字签名才行。
这里有一些我们常用的软件也可以利用,我们尽量去看看目录里面体积小的文件,这样方便我们在攻击的时候投入。
这里我们在steam中找到一个uninstall.exe的exe,用ProcessMonitor可以监控到他执行的时候加载了一个“C:\Windows\System32\wow64log.dll” ,那么我们是否可以写一个这个dll放到和他在相同的目录下让他加载我们的wow64log.dll不去加载System32下的wow64log.dll呢?
那么我们去尝试下
3. 如何构造wow64log.dll
首先我们要知道一个exe加载这个dll后他调用了哪些函数,我们要去伪造这些函数,不然他肯定是加载不起来的。有很多方式可以查看比如说LordPe,或者说VS带有的dumpbin。这里我们用dumpbin来看下白程序的导入表,看看wow64log.dll用到了哪些函数。
C:\Users\Administrator\Desktop\1>dumpbin /imports uninstall.exe
Microsoft (R) COFF/PE Dumper Version 14.36.32535.0
Copyright (C) Microsoft Corporation. All rights reserved.Dump of file uninstall.exeFile Type: EXECUTABLE IMAGESection contains the following imports:KERNEL32.dll408070 Import Address Table408614 Import Name Table0 time date stamp0 Index of first forwarder reference30B SetCurrentDirectoryW161 GetFileAttributesW16A GetFullPathNameW356 Sleep1DF GetTickCount56 CreateFileW163 GetFileSize271 MoveFileW31A SetFileAttributesW17E GetModuleFileNameW46 CopyFileWB9 ExitProcess314 SetEnvironmentVariableW1F4 GetWindowsDirectoryW1D6 GetTempPathW111 GetCommandLineW1E8 GetVersion315 SetErrorMode390 WaitForSingleObject142 GetCurrentProcess39 CompareFileTime20A GlobalUnlock203 GlobalLock6F CreateThread171 GetLastError4E CreateDirectoryW69 CreateProcessW2C5 RemoveDirectoryW3C3 lstrcmpiA1D4 GetTempFileNameW3A4 WriteFile3C6 lstrcpyA3C7 lstrcpyW270 MoveFileExW3BE lstrcatW1C2 GetSystemDirectoryW1A0 GetProcAddress17F GetModuleHandleA1FF GlobalFree1F8 GlobalAlloc1B6 GetShortPathNameW2DC SearchPathW3C4 lstrcmpiW31F SetFileTime34 CloseHandleBD ExpandEnvironmentStringsW3C1 lstrcmpW150 GetDiskFreeSpaceW3CD lstrlenW3CA lstrcpynW15A GetExitCodeProcessD5 FindFirstFileWDD FindNextFileW84 DeleteFileW31B SetFilePointer2B5 ReadFileCE FindClose274 MulDiv275 MultiByteToWideChar3CC lstrlenA394 WideCharToMultiByte19D GetPrivateProfileStringW3AA WritePrivateProfileStringWF8 FreeLibrary254 LoadLibraryExW182 GetModuleHandleWUSER32.dll408198 Import Address Table40873C Import Name Table0 time date stamp0 Index of first forwarder reference15C GetSystemMenu248 SetClassLongW1AE IsWindowEnabledC2 EnableMenuItem283 SetWindowPos15A GetSysColor16F GetWindowLongW24D SetCursor1BD LoadCursorW38 CheckDlgButton13C GetMessagePos1B9 LoadBitmapW1C CallWindowProcW1B1 IsWindowVisible42 CloseClipboard24A SetClipboardDataC1 EmptyClipboard1F6 OpenClipboard2D8 wsprintfW231 ScreenToClient174 GetWindowRect15D GetSystemMetrics254 SetDlgItemTextW114 GetDlgItemTextW1E3 MessageBoxIndirectW2F CharPrevW2A CharNextA2D7 wsprintfAA2 DispatchMessageW201 PeekMessageW10C GetDC22A ReleaseDCC4 EnableWindow193 InvalidateRect240 SendMessageW8F DefWindowProcWD BeginPaintFF GetClientRectE2 FillRectC6 EndDialog219 RegisterClassW29A SystemParametersInfoW61 CreateWindowExWF9 GetClassInfoW9F DialogBoxParamW2C CharNextWE1 ExitWindowsEx99 DestroyWindow1C1 LoadImageW27A SetTimer287 SetWindowTextW204 PostQuitMessage292 ShowWindow111 GetDlgItem1AD IsWindow281 SetWindowLongWE5 FindWindowExW2A4 TrackPopupMenu9 AppendMenuW5E CreatePopupMenuBF DrawTextWC8 EndPaint56 CreateDialogParamW23F SendMessageTimeoutW257 SetForegroundWindowGDI32.dll40804C Import Address Table4085F0 Import Name Table0 time date stamp0 Index of first forwarder reference20E SelectObject216 SetBkMode3D CreateFontIndirectW23C SetTextColor8F DeleteObject16B GetDeviceCaps29 CreateBrushIndirect215 SetBkColorSHELL32.dll40817C Import Address Table408720 Import Name Table0 time date stamp0 Index of first forwarder referenceC3 SHGetSpecialFolderLocationBD SHGetPathFromIDListW7A SHBrowseForFolderWAD SHGetFileInfoW10B ShellExecuteW9B SHFileOperationWADVAPI32.dll408000 Import Address Table4085A4 Import Name Table0 time date stamp0 Index of first forwarder reference1D7 RegDeleteKeyW22F SetFileSecurityW1AC OpenProcessToken150 LookupPrivilegeValueW1C AdjustTokenPrivileges1ED RegOpenKeyExW1E2 RegEnumValueW1D9 RegDeleteValueW1CB RegCloseKey1D2 RegCreateKeyExW205 RegSetValueExW1F8 RegQueryValueExW1E0 RegEnumKeyWCOMCTL32.dll408038 Import Address Table4085DC Import Name Table0 time date stamp0 Index of first forwarder reference34 ImageList_AddMaskedOrdinal 1738 ImageList_Destroy37 ImageList_Createole32.dll4082A0 Import Address Table408844 Import Name Table0 time date stamp0 Index of first forwarder reference105 OleUninitializeEE OleInitialize65 CoTaskMemFree10 CoCreateInstanceSummary21000 .data36000 .ndata2000 .rdata13000 .rsrc7000 .textC:\Users\Administrator\Desktop\1>
可以发现这里面并没有wow64log.dll这个导入dll,那么他有可能是动态加载的,也有可能是默认加载的。这样我们就不需要考虑这个dll的导出函数了,直接伪造一个dll即可。
首先我们要知道这个可执行程序32位还是64位,我们可以用DIE或者x64dbg去查看。
这里看得出来是PE32,那么我们要构造的dll也就是32位的dll。
我们在进程附加的时候去弹出一个信息框
这里我们选择和程序对应的架构。X86编译出来就是PE32。
编译好之后我们和可执行文件放到同目录下去执行文件即可。
很遗憾我们并没有去加载成功我们的dll,此时就说明此文件不是我们可以利用的程序,我们需要去更换程序。我们需要继续去以上步骤去重新找白程序文件。
这里我们找到一个企业微信里面的exe我们再去尝试一下。
可以看出我们先加载了dbghelp.dll我们将我们之前的文件名字改成这个名字看看是否可以运行。
此时看到这个图,不要认为我们又要换白程序了,报错是成功的一大步,到这里就说明我们已经成功百分之90了,这里的问题是我们dll虽然有了但是程序加载我们的dll后调用的函数我们并没有提供,好的我们用dumpbin来看下。
C:\Users\Administrator\Desktop\1>dumpbin /imports minidump.exe
Microsoft (R) COFF/PE Dumper Version 14.36.32535.0
Copyright (C) Microsoft Corporation. All rights reserved.Dump of file minidump.exeFile Type: EXECUTABLE IMAGESection contains the following imports:dbghelp.dll403108 Import Address Table403A6C Import Name Table0 time date stamp0 Index of first forwarder reference1D MiniDumpWriteDump
这里可以看到我们的dll需要一个MiniDumpWriteDump这个函数,我们在代码中添加一下。
我们编译再去执行下。
这里我们就可以弹出我们的信息框了。
三、如何检测是否为白加黑程序
1. 杀软检测
杀软很容易检测的这些简单的白加黑文件,因为我们找的黑dll是系统自带的文件,杀软只需对比Hash就可过了出是不可信文件,一般情况下也不会有程序去伪造系统的dll文件。(这里也好解决我们只需要找一些加载不是系统文件的白程序即可。)
2. 手动检测
手动检测的方式也很简单,我们只需要多注意这种exe只带有一个dll的文件,因为如果是木马的话他一般不会有很多文件,我们可以dll右键属性看看是否有签名,如果没有就很可疑,如果有的话看看签名是否有效,这里也可以用代码去代替这个过程。
以上两种都可以怀疑此程序是可疑程序。