이 저장소에는 기본 Linux 프로그램이 Windows DLL에서 기능을로드하고 호출 할 수있는 라이브러리가 포함되어 있습니다.
시연으로서, 나는 Windows Defender를 Linux로 포팅했습니다.
$ ./mpclient eicar.com
main(): Scanning eicar.com...
EngineScanCallback(): Scanning input
EngineScanCallback(): Threat Virus:DOS/EICAR_Test_File identified.
peloader 디렉토리에는 NDISWrapper에서 파생 된 사용자 정의 PE/COFF 로더가 포함되어 있습니다. 라이브러리는 이전 및 수입을 처리 한 다음 dlopen 과 같은 API를 제공합니다. 이 코드는 GDB (기호 포함), 기본 블록 커버리지 컬렉션, 런타임 후크 및 패치로 디버깅을 지원합니다.
의도는 Linux에서 자체 포함 된 Windows 라이브러리의 확장 가능하고 효율적인 퍼징을 허용하는 것입니다. 좋은 후보자는 비디오 코덱, 감압 라이브러리, 바이러스 스캐너, 이미지 디코더 등 일 수 있습니다.
외부 수입에 대한 지원을 추가 해야하는 경우 스터브를 쓰는 것이 일반적으로 빠르고 쉽습니다.
창에 분산되고 확장 가능한 퍼지는 도전적이고 비효율적 일 수 있습니다. 이는 커널과 사용자 공간에 걸쳐있는 복잡한 상호 연결된 구성 요소를 사용하는 엔드 포인트 보안 제품의 경우 특히 그렇습니다. 이를 위해서는 종종 가상화 된 Windows 환경 전체를 회전 시켜서 퍼지하거나 커버리지 데이터를 수집해야합니다.
이것은 Linux에서 문제가되지 않으며 Windows Antivirus 제품의 구성 요소를 Linux로 포팅하는 것이 종종 가능하다는 것을 알았습니다. 이를 통해 오버 헤드가 거의없는 최소 컨테이너에서 테스트중인 코드를 실행하고 테스트를 쉽게 확장 할 수 있습니다.
이것은 단지 개인적인 의견이지만 Linux에 더 나은 도구가 있다고 생각합니다. ¯_(ツ)_/¯
MSMPENG은 Windows 8, 8.1, 10, Windows Server 2016 등에서 기본적으로 활성화 된 맬웨어 보호 서비스입니다. 또한 Microsoft Security Essentials, 시스템 센터 엔드 포인트 보호 및 기타 다양한 Microsoft Security 제품은 동일한 핵심 엔진을 공유합니다.
스캔 및 분석을 담당하는 MSMPENG의 핵심 구성 요소를 MPENGINE이라고합니다. MPENGINE은 수십 개의 난해한 아카이브 형식, 실행 가능한 패커, 다양한 아키텍처를위한 전체 시스템 에뮬레이터 및 다양한 언어를위한 통역사로 구성된 광대하고 복잡한 공격 표면입니다. 이 모든 코드는 원격 공격자가 액세스 할 수 있습니다.
테스트 클라이언트를 구축하려면 make 입력하기 만하면됩니다.
$ make
.i686 또는 :i386 접미사가 중요합니다. 32 비트 DLL을 사용하려면 32 비트 라이브러리가 필요합니다.
| 페도라 / 레드 하트 | 우분투 / 데비안 | 논평 |
|---|---|---|
glibc-devel.i686 | libc6-dev:i386 / libc6-dev-i386 | 이름은 버전에 따라 다릅니다. |
libgcc.i686 | gcc-multilib | |
readline-devel.i686 | libreadline-dev:i386 | mpscript에서 사용되는 선택 사항. |
cabextract | cabextract | 정의를 추출하는 데 사용됩니다. |
이 페이지에서 32 비트 antimalware 업데이트 파일을 다운로드해야합니다.
이것은 올바른 파일에 대한 직접 링크 여야합니다.
이것은 cabextract 로 추출 할 수있는 캐비닛 파일 인 mpam-fe.exe 라는 파일을 다운로드합니다. engine 디렉토리에 파일을 추출하십시오.
$ cabextract mpam-fe.exe
Extracting cabinet: mpam-fe.exe
extracting MPSigStub.exe
extracting mpavdlta.vdm
extracting mpasdlta.vdm
extracting mpavbase.vdm
extracting mpasbase.vdm
extracting mpengine.dll
All done, no errors.
어떤 버전을 가지고 있는지 알고 싶다면 이것을 시도하십시오.
$ exiftool mpengine.dll | grep 'Product Version Number'
Product Version Number : 1.1.13701.0
기본 MPENGINE 로더를 mpclient 라고하며 파일 이름을 매개 변수로 스캔 할 수 있습니다.
$ ./mpclient netsky.exe
main(): Scanning netsky.exe...
EngineScanCallback(): Scanning input
EngineScanCallback(): Threat Worm:Win32/Netsky.P@mm identified.
다른 샘플 도구, mpstreamfuzz 및 mpscript 가 있습니다.
충돌을 디버깅하려면 루틴을 통해 한 단계 또는 중단 점을 설정하십시오. 다음 예제를 따르십시오. 먼저 IDA의지도 파일이 필요합니다.
Microsoft는 모든 빌드에 대한 공개 기호를 공개하지 않으며 때로는 릴리스 후 몇 달 동안 기호가 뒤쳐져 있습니다. 공개 기호가있는 mpengine 버전을 사용하고 있는지 확인하십시오.
다음 샘플 CommandLine을 사용하여 MAP 및 IDB 파일을 생성하십시오.
> idaw -A -P+ -S"createmap.idc mpengine.map" mpengine.dll
Windows에서 맵 파일을 생성하면 CRLF 라인 터미네이터가 제공됩니다.
$ dos2unix mpengine.map
GDB에서 mpclient를 실행하면 디버거를 감지하고 기호에 대해 GDB를 가르치기 위해 입력 해야하는 명령을 인쇄합니다.
$ gdb -q ./mpclient
(gdb) r testfile.txt
Starting program: mpclient
main(): GDB: add-symbol-file engine/mpengine.dll 0xf6af4008+0x1000
main(): GDB: shell bash genmapsym.sh 0xf6af4008+0x1000 symbols_19009.o < mpengine.map
main(): GDB: add-symbol-file symbols_19009.o 0
Program received signal SIGTRAP, Trace/breakpoint trap.
0x0804d213 in main (argc=1, argv=0xffffcc64, envp=0xffffcc6c) at mpclient.c:156
156 __debugbreak();
(gdb)
명령을 입력하면 GDB에 표시되면 기호를 사용할 수 있습니다.
genmapsym.sh는 GNU awk를 사용하고 있다고 가정합니다.
(gdb) add-symbol-file engine/mpengine.dll 0xf6af4008+0x1000
add symbol table from file "engine/mpengine.dll" at
.text_addr = 0xf6af5008
Reading symbols from engine/mpengine.dll...done.
(gdb) shell bash genmapsym.sh 0xf6af4008+0x1000 symbols_19009.o < mpengine.map
(gdb) add-symbol-file symbols_19009.o 0
add symbol table from file "symbols_19009.o" at
.text_addr = 0x0
Reading symbols from symbols_19009.o...done.
(gdb) p as3_parsemetadata_swf_vars_t
$1 = {void (void)} 0xf6feb842 <as3_parsemetadata_swf_vars_t>
그러면 계속할 수 있고 정상적으로 실행됩니다.
(gdb) c
소프트웨어 중단 점보다 하드웨어 브레이크 포인트를 사용하는 것이 더 신뢰할 수 있지만 중단 점, 파트 포인트 및 배경은 모두 정상적으로 작동합니다.
GDB에서 하드웨어 브레이크 포인트를 사용하려면 break 대신 hb 또는 hbreak 사용합니다. 제한된 수의 하드웨어 브레이크 포인트 만 얻을 수 있습니다.
(gdb) b as3_parsemethodinfo_swf_vars_t
Breakpoint 1 at 0xf6feb8da
(gdb) c
Continuing.
main(): Scanning test/input.swf...
EngineScanCallback(): Scanning input
Breakpoint 1, 0xf6feb8da in as3_parsemethodinfo_swf_vars_t ()
(gdb) bt
#0 0xf6feb8da in as3_parsemethodinfo_swf_vars_t ()
#1 0xf6dbad7f in SwfScanFunc ()
#2 0xf6d73ec3 in UfsScannerWrapper__ScanFile_scanresult_t ()
#3 0xf6d6c9e3 in UfsClientRequest__fscan_SCAN_REPLY ()
#4 0xf6d6a818 in UfsNode__ScanLoopHelper_wchar_t ()
#5 0xf6d6a626 in UfsNode__Analyze_UfsAnalyzeSetup ()
#6 0xf6d71f7f in UfsClientRequest__AnalyzeLeaf_wchar_t ()
#7 0xf6d71bb9 in UfsClientRequest__AnalyzePath_wchar_t ()
#8 0xf6dbbd88 in std___String_alloc_std___String_base_types_char_std__allocator_char______Myptr_void_ ()
#9 0xf6d75e72 in UfsCmdBase__ExecuteCmd__lambda_c80a88e180c1f4524a759d69aa15f87e____lambda_c80a88e180c1f4524a759d69aa15f87e__ ()
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
(gdb) x/3i $pc
=> 0xf6feb8da <as3_parsemethodinfo_swf_vars_t+7>: lea ebx,[edx+0x1c]
0xf6feb8dd <as3_parsemethodinfo_swf_vars_t+10>: push esi
0xf6feb8de <as3_parsemethodinfo_swf_vars_t+11>: mov edx,ebx
이 프로젝트는 와인이나 Winelib을 대체하지 않습니다.
Winelib는 Windows C ++ 프로젝트를 Linux에 포트하는 데 사용되며 Wine은 전체 Windows 응용 프로그램을 실행하기위한 것입니다. 이 프로젝트는 기본 Linux 코드가 간단한 Windows DLL을로드 할 수 있도록하기위한 것입니다.
가장 가까운 비유는 ndiswrapper이지만 사용자 공간의 경우입니다.
GPL2