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
96
97
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <ShlObj.h>
#include <Windows.h>
 
typedef INT(*MESSAGEBOX)(HWND, LPCSTR, LPCSTR, UINT);
typedef struct INJECT
{
    char buf[128];
    MESSAGEBOX pMessageBox;
}INJECT;
 
DWORD WINAPI Injection_ThreadProc(INJECT *inject_thread)
{
    
    MESSAGEBOX pFunc = inject_thread->pMessageBox;
    ((MESSAGEBOX)pFunc)(0, inject_thread->buf, 00);
    
    return 0;
}
 
void afterFunc()
{
 
}
 
BOOL Injection_Thread(DWORD pid)
{
    HANDLE hProcess, hThread;
    LPVOID addr, data_addr;
    INJECT inject;
 
    DWORD size = (DWORD)afterFunc - (DWORD)Injection_ThreadProc;
    
    strcpy(inject.buf, "ㅎㅇㅋㅋ");
    inject.pMessageBox = (MESSAGEBOX)GetProcAddress(GetModuleHandle("user32.dll"), "MessageBoxA");
    
    hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);
 
    data_addr = VirtualAllocEx(hProcess, NULL, sizeof(INJECT), MEM_COMMIT, PAGE_READWRITE);
 
    WriteProcessMemory(hProcess, data_addr, (LPCVOID)&inject, sizeof(INJECT), NULL);
 
    addr = VirtualAllocEx(hProcess, NULL, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
 
    WriteProcessMemory(hProcess, addr, (LPCVOID)Injection_ThreadProc, size, NULL);
    
    printf("%X %X\n", data_addr, addr);
    hThread = CreateRemoteThread(hProcess, 00, (LPTHREAD_START_ROUTINE)addr, data_addr, CREATE_SUSPENDED, 0);
    printf("%X %d\n", hThread, GetLastError());
    ResumeThread(hThread);
    WaitForSingleObject(hThread, INFINITE);
    
    CloseHandle(hThread);
    CloseHandle(hProcess);
 
    return TRUE;
}
 
DWORD GET_PID()
{
    DWORD pid;
    HWND hwnd;
 
    while (!(hwnd = FindWindow(0"하이")))
        Sleep(100);
    GetWindowThreadProcessId(hwnd, &pid);
 
    return pid; 
 
}
 
DWORD WINAPI func(LPVOID arg)
{
    DWORD pid;
 
    pid = GET_PID();
    printf("윈도우 발견\n");
    Injection_Thread(pid);
    return 0;
}
void main()
{
    HANDLE hThread;
    hThread = CreateThread(00, (LPTHREAD_START_ROUTINE)func, 000);
    WaitForSingleObject(hThread, 100);
    
    while (1)
    {
        printf("흠...\n");
        Sleep(4000);
    }
 
    CloseHandle(hThread);
 
 
}
cs

code injection.exe 소스

1
2
3
4
5
6
7
8
9
10
11
void main()
{
    
    SetConsoleTitle("하이");
    while (1)
    {
        Sleep(1000);
        printf("하이 ");
    }
    return;
}
cs


타겟프로그램 소스

인데

http://ezbeat.tistory.com/253

이 포스팅을 참조해서 그대로 따라해봤는데

처음에 메모장에 했더니 반응이 없길래 찾아보니까 32비트 프로세스가 64비트 프로세스에 시도하면 안된다고해서 같은 32비트 프로세스에 시도했는데

그냥 하면 액세스 위반으로 터져버리고 디버깅중에 하면 메박 출력 후에 터져버리네요

소스에 문제가 있는걸까요 아니면 다른 문제일까요?