[C & C++] Memory Detection - 메모리 진단
메모리에서 특정 코드로 시작하는 스레드를 찾는 코드이다. 주로 코드 인젝션을 통해 다른 프로세스에 코드가 인젝션 되었는지 확인할 때 사용하면 된다.1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495#include #include #include #define ThreadQuerySetWin32StartAddress 9 using namespace std;typedef NTSTATUS(WINAPI *NtQueryInformationThr..
2016.09.24
[C & C++] BasicDLL - 기본적인 DLL 제작
아주 기초적인 DLL 파일로 지정된 경로(코드에선 Kali\Dekstop)에 아무런 내용이 없는 txt 파일을 만드는 코드이다.아래 코드는 DLL 을 로드하기 위한 EXE 파일의 코드이다.
2016.09.05
[C & C++] Check PE - PE 파일 여부 확인
지정한 핸들의 파일이 PE 파일인지 확인하는 코드이다. MZ 헤더와 PE 시그니쳐를 확인하며, 실제 파일의 크기가 PE 구조에 나타난 크기보다 작지는 않는지 확인한다. PE 구조를 파싱하는 부분은 아래와 동일하므로 조금씩 수정하면 다른 부분들도 확인할 수 있다.
2016.08.27
[C & C++] Search a file - 파일 탐색
인자로 지정한 경로에 존재하는 파일을 탐색하는 코드이다. 만약 폴더를 탐색하면 재귀를 통해 다시 그 안에 파일들까지 탐색한다. 컴파일러에 따라 "_CRT_SECURE_NO_WARNINGS"를 추가해주어야 하거나, "char * 형식의 인수가 LPCWSTR 형식의 매개 변수와 호환되지 않습니다" 라는 오류로 인해 유니코드 문자 집합 사용 설정을 해제해주어야 한다.
2016.08.24
Python - PE Parser
2016.05.16
Python - Yara Launcher
2016.03.06
Pytsk3를 통한 MFT 추출
2016.02.23
Python - Simple Extract File
2016.02.17
메모리에서 특정 코드로 시작하는 스레드를 찾는 코드이다. 주로 코드 인젝션을 통해 다른 프로세스에 코드가 인젝션 되었는지 확인할 때 사용하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <Windows.h>
#include <iostream>
#include <TlHelp32.h>
 
#define ThreadQuerySetWin32StartAddress 9  
 
using namespace std;
typedef NTSTATUS(WINAPI *NtQueryInformationThreadT)(HANDLE ThreadHandle, ULONG ThreadInformationClass, PVOID ThreadInformation, ULONG ThreadInformationLength, PULONG ReturnLength);
 
BOOL GetThreadStartAddress(DWORD tid, PVOID *EntryPoint);
BOOL CompareBinary(CHAR Buffer[]);
 
int main()
{
    BOOL result;
    THREADENTRY32 t32;
    PVOID EntryPoint;
    HANDLE hProc;
    CHAR Buffer[0x100];
    DWORD NumberofByteRead;
    HANDLE hSnap;
 
    printf("\n[*] Memory Detection - Reverse_L01.exe\n");
 
    /* Create a Snapshot Handle */
    hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
    if (hSnap == INVALID_HANDLE_VALUE)
        return 0;
 
    /* if you don't initialize THREADENTRY32.dwSize, Thread32First API fails */
    t32.dwSize = sizeof(THREADENTRY32);
    if (Thread32First(hSnap, &t32))
    {
        do
        {
            result = GetThreadStartAddress(t32.th32ThreadID, &EntryPoint);
            if ((DWORD)EntryPoint == 0x1)
            {
                continue;
            }
            hProc = OpenProcess(PROCESS_VM_READ, 0, t32.th32OwnerProcessID);
            ReadProcessMemory(hProc, EntryPoint, Buffer, 0x100&NumberofByteRead);
 
            if (CompareBinary(Buffer))
            {
                printf("\t+ Detect It, Process ID : %d, Thread ID : %d, EntryPoint :0x%X\n", t32.th32OwnerProcessID, t32.th32ThreadID, EntryPoint);
            }
        } while (Thread32Next(hSnap, &t32));
    }
    CloseHandle(hSnap);
    
    return 0;
}
 
BOOL GetThreadStartAddress(DWORD tid, PVOID *EntryPoint)
{
    PVOID ThreadInfo;
    ULONG ThreadInfoLength;
    PULONG ReturnLength;
 
    HMODULE hNtdll = LoadLibrary("ntdll.dll");
    NtQueryInformationThreadT NtQueryInformationThread = (NtQueryInformationThreadT)GetProcAddress(hNtdll, "NtQueryInformationThread");
    
    if (!NtQueryInformationThread)
        return FALSE;
 
    /* if NtQueryInformationThread's THREADINFOCALSS is a ThreadQurtySetWin32StartAddress, return start address of thread */
    HANDLE hThread = OpenThread(THREAD_QUERY_INFORMATION, 0, tid);
    NTSTATUS NtStat = NtQueryInformationThread(hThread, ThreadQuerySetWin32StartAddress, &ThreadInfo, sizeof(ThreadInfo), NULL);
    
    *EntryPoint = ThreadInfo;
    return TRUE;
}
 
BOOL CompareBinary(CHAR Buffer[])
{
    char CmpCode[0x67= { '\x6A''\x00''\x68''\x00''\x20''\x40''\x00''\x68''\x12''\x20''\x40''\x00',
        '\x6A''\x00''\xE8''\x4E''\x00''\x00''\x00''\x68''\x94''\x20''\x40''\x00''\xE8''\x38',
        '\x00''\x00''\x00''\x46''\x48''\xEB''\x00''\x46''\x46''\x48''\x3B''\xC6''\x74''\x15',
        '\x6A''\x00''\x68''\x35''\x20''\x40''\x00''\x68''\x3B''\x20''\x40''\x00''\x6A''\x00',
        '\xE8''\x26''\x00''\x00''\x00''\xEB''\x13''\x6A''\x00''\x68''\x5E''\x20''\x40''\x00',
        '\x68''\x64''\x20''\x40''\x00''\x6A''\x00''\xE8''\x11''\x00''\x00''\x00''\xE8''\x06',
        '\x00''\x00''\x00''\xFF''\x25''\x50''\x30''\x40''\x00''\xFF''\x25''\x54''\x30''\x40',
        '\x00''\xFF''\x25''\x5C''\x30''\x40''\x00' };
 
    for (int i = 0; i < sizeof(CmpCode); i++)
    {
        if ((BYTE)CmpCode[i] != (BYTE)Buffer[i])
        {
            return FALSE;
        }
    }
    return TRUE;
}
 
cs




아주 기초적인 DLL 파일로 지정된 경로(코드에선 Kali\Dekstop)에 아무런 내용이 없는 txt 파일을 만드는 코드이다.

아래 코드는 DLL 을 로드하기 위한 EXE 파일의 코드이다.


지정한 핸들의 파일이 PE 파일인지 확인하는 코드이다. MZ 헤더와 PE 시그니쳐를 확인하며, 실제 파일의 크기가 PE 구조에 나타난 크기보다 작지는 않는지 확인한다. PE 구조를 파싱하는 부분은 아래와 동일하므로 조금씩 수정하면 다른 부분들도 확인할 수 있다.


인자로 지정한 경로에 존재하는 파일을 탐색하는 코드이다. 만약 폴더를 탐색하면 재귀를 통해 다시 그 안에 파일들까지 탐색한다. 컴파일러에 따라 "_CRT_SECURE_NO_WARNINGS"를 추가해주어야 하거나, "char * 형식의 인수가 LPCWSTR 형식의 매개 변수와 호환되지 않습니다" 라는 오류로 인해 유니코드 문자 집합 사용 설정을 해제해주어야 한다.



Python - PE Parser

Kail-KM
|2016. 5. 16. 16:45


'Programming > Python' 카테고리의 다른 글

Python - Yara Launcher  (2) 2016.03.06
Pytsk3를 통한 MFT 추출  (2) 2016.02.23
Python - Simple Extract File  (0) 2016.02.17
Python - MFT Path Parsing  (0) 2016.02.04
Prefetch Parser 제작기  (4) 2015.12.26



'Programming > Python' 카테고리의 다른 글

Python - PE Parser  (1) 2016.05.16
Pytsk3를 통한 MFT 추출  (2) 2016.02.23
Python - Simple Extract File  (0) 2016.02.17
Python - MFT Path Parsing  (0) 2016.02.04
Prefetch Parser 제작기  (4) 2015.12.26



'Programming > Python' 카테고리의 다른 글

Python - PE Parser  (1) 2016.05.16
Python - Yara Launcher  (2) 2016.03.06
Python - Simple Extract File  (0) 2016.02.17
Python - MFT Path Parsing  (0) 2016.02.04
Prefetch Parser 제작기  (4) 2015.12.26



'Programming > Python' 카테고리의 다른 글

Python - Yara Launcher  (2) 2016.03.06
Pytsk3를 통한 MFT 추출  (2) 2016.02.23
Python - MFT Path Parsing  (0) 2016.02.04
Prefetch Parser 제작기  (4) 2015.12.26
Windows Timestamp Convert 64bit  (0) 2015.12.12