hacktricks/reversing/common-api-used-in-malware.md

179 lines
9 KiB
Markdown

# 악성 소프트웨어에서 사용되는 일반 API
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)를 통해 제로에서 영웅까지 AWS 해킹 배우기</strong></summary>
HackTricks를 지원하는 다른 방법:
- **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
- [**공식 PEASS & HackTricks 굿즈**](https://peass.creator-spring.com) 구매
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
- 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
- **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
</details>
**Try Hard Security Group**
<figure><img src="../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
{% embed url="https://discord.gg/tryhardsecurity" %}
---
## 일반
### 네트워킹
| Raw Sockets | WinAPI Sockets |
| ------------- | -------------- |
| socket() | WSAStratup() |
| bind() | bind() |
| listen() | listen() |
| accept() | accept() |
| connect() | connect() |
| read()/recv() | recv() |
| write() | send() |
| shutdown() | WSACleanup() |
### 지속성
| 레지스트리 | 파일 | 서비스 |
| ---------------- | ------------- | ---------------------------- |
| RegCreateKeyEx() | GetTempPath() | OpenSCManager |
| RegOpenKeyEx() | CopyFile() | CreateService() |
| RegSetValueEx() | CreateFile() | StartServiceCtrlDispatcher() |
| RegDeleteKeyEx() | WriteFile() | |
| RegGetValue() | ReadFile() | |
### 암호화
| 이름 |
| --------------------- |
| WinCrypt |
| CryptAcquireContext() |
| CryptGenKey() |
| CryptDeriveKey() |
| CryptDecrypt() |
| CryptReleaseContext() |
### 안티-분석/가상 머신
| 함수 이름 | 어셈블리 명령어 |
| --------------------------------------------------------- | --------------------- |
| IsDebuggerPresent() | CPUID() |
| GetSystemInfo() | IN() |
| GlobalMemoryStatusEx() | |
| GetVersion() | |
| CreateToolhelp32Snapshot \[프로세스 실행 여부 확인] | |
| CreateFileW/A \[파일 존재 여부 확인] | |
### 은신
| 이름 | |
| ------------------------ | -------------------------------------------------------------------------- |
| VirtualAlloc | 메모리 할당 (패커) |
| VirtualProtect | 메모리 권한 변경 (패커가 섹션에 실행 권한 부여) |
| ReadProcessMemory | 외부 프로세스에 주입 |
| WriteProcessMemoryA/W | 외부 프로세스에 주입 |
| NtWriteVirtualMemory | |
| CreateRemoteThread | DLL/프로세스 주입... |
| NtUnmapViewOfSection | |
| QueueUserAPC | |
| CreateProcessInternalA/W | |
### 실행
| 함수 이름 |
| ---------------- |
| CreateProcessA/W |
| ShellExecute |
| WinExec |
| ResumeThread |
| NtResumeThread |
### 기타
* GetAsyncKeyState() -- 키 로깅
* SetWindowsHookEx -- 키 로깅
* GetForeGroundWindow -- 실행 중인 창 이름(또는 브라우저의 웹사이트) 가져오기
* LoadLibrary() -- 라이브러리 가져오기
* GetProcAddress() -- 라이브러리 가져오기
* CreateToolhelp32Snapshot() -- 실행 중인 프로세스 목록
* GetDC() -- 스크린샷
* BitBlt() -- 스크린샷
* InternetOpen(), InternetOpenUrl(), InternetReadFile(), InternetWriteFile() -- 인터넷 액세스
* FindResource(), LoadResource(), LockResource() -- 실행 파일의 리소스 액세스
## 악성 소프트웨어 기법
### DLL 주입
다른 프로세스 내에서 임의의 DLL을 실행
1. 악성 DLL을 주입할 프로세스 찾기: CreateToolhelp32Snapshot, Process32First, Process32Next
2. 프로세스 열기: GetModuleHandle, GetProcAddress, OpenProcess
3. DLL 경로를 프로세스 내부에 쓰기: VirtualAllocEx, WriteProcessMemory
4. 악성 DLL을 로드할 프로세스 내 스레드 생성: CreateRemoteThread, LoadLibrary
사용할 다른 함수: NTCreateThreadEx, RtlCreateUserThread
### 반사적 DLL 주입
일반 Windows API 호출을 하지 않고 악성 DLL을 로드합니다.\
DLL은 프로세스 내에 매핑되며, 가져오기 주소를 해결하고 재배치를 수정하고 DllMain 함수를 호출합니다.
### 스레드 하이재킹
프로세스에서 스레드를 찾아 악성 DLL을 로드하도록 만듭니다.
1. 대상 스레드 찾기: CreateToolhelp32Snapshot, Thread32First, Thread32Next
2. 스레드 열기: OpenThread
3. 스레드 일시 중지: SuspendThread
4. 피해 프로세스 내 악성 DLL 경로 쓰기: VirtualAllocEx, WriteProcessMemory
5. 라이브러리를 로드하는 스레드 재개: ResumeThread
### PE 주입
포터블 실행 주입: 실행 파일이 피해 프로세스의 메모리에 작성되고 그곳에서 실행됩니다.
### 프로세스 할로잉
악성 코드를 메모리에서 합법적인 코드를 언매핑하고 로드합니다.
1. 새 프로세스 생성: CreateProcess
2. 메모리 언매핑: ZwUnmapViewOfSection, NtUnmapViewOfSection
3. 악성 이진 파일을 프로세스 메모리에 쓰기: VirtualAllocEc, WriteProcessMemory
4. 진입점 설정 및 실행: SetThreadContext, ResumeThread
## 후킹
* **SSDT** (**System Service Descriptor Table**)는 사용자 프로세스가 커널 함수 (ntoskrnl.exe) 또는 GUI 드라이버 (win32k.sys)를 호출할 수 있도록 하는 테이블을 가리킵니다.
* 루트킷은 이러한 포인터를 자신이 제어하는 주소로 수정할 수 있습니다.
* **IRP** (**I/O Request Packets**)는 데이터 조각을 한 구성 요소에서 다른 구성 요소로 전송합니다. 커널의 거의 모든 것이 IRP를 사용하며 각 장치 객체에는 후킹할 수 있는 자체 함수 테이블이 있습니다: DKOM (Direct Kernel Object Manipulation)
* **IAT** (**Import Address Table**)은 종속성을 해결하는 데 유용합니다. 호출될 코드를 탈취하기 위해 이 테이블을 후킹할 수 있습니다.
* **EAT** (**Export Address Table**) 후킹. 이러한 후킹은 **사용자 공간**에서 수행할 수 있습니다. 목표는 DLL에 의해 내보낸 함수를 후킹하는 것입니다.
* **인라인 후킹**: 이 유형은 어렵습니다. 이는 함수 코드 자체를 수정하는 것을 포함합니다. 아마도 이를 위해 시작 부분에 점프를 넣는 것일 수 있습니다.
**Try Hard Security Group**
<figure><img src="../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
{% embed url="https://discord.gg/tryhardsecurity" %}
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)를 통해 제로에서 영웅까지 AWS 해킹 배우기</strong></summary>
HackTricks를 지원하는 다른 방법:
- **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
- [**공식 PEASS & HackTricks 굿즈**](https://peass.creator-spring.com) 구매
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
- 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
</details>
* **HackTricks** 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 저장소에 PR을 제출하여 해킹 기법을 공유하세요.
</details>