1
2
3
4
5
6
7
8
9
10
11
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);
    
    hThread = CreateRemoteThread(hProcess, 00, addr, data_addr, CREATE_SUSPENDED, 0);
cs


제목 길이에 제한이 있어서 모호하게 적었는데

CreateRemoteThread로 만든 쓰레드가 파라미터로 넘긴 주소보다 몇십바이트 앞에서 실행되네요

VirtualAllocEx로 함수 한 뭉텅이랑 파라미터 구조체 한 뭉텅이 타겟 프로세스에 할당한뒤에 WriteProcessMemory로 적어줬는데

디버깅을 해보면 원래 할당한 메모리보다 64바이트정도 전 코드가 실행돼서 access violation으로 터져버리네요

무슨 소리냐면 

addr = VIrtualAllocEx(~~);

printf("%X ", addr);

이렇게 해보면 490000이 나오는데

타겟 프로세스를 디버깅해보면 쓰레드가 시작되는 코드 주소가 48FFC0이네요

vs2015로 봤을때 여기 코드는 다 ??로 나와있구요

왜 원격 쓰레드 만들때 490000이라는 주솟값을 넘겼는데 48FFC0에서 시작이 되는지 궁금하네요