2013-10-30 3 views
6

우선, 나는 dll을 삽입하고 싶지 않습니다. WriteProcessMemory()를 사용하여 코드를 삽입하고 싶습니다 (가능한 경우). 필자는 이미 ReadProcessMemory()를 사용했기 때문에 글을 쓰는 것이 그리 큰 문제가 아니었다.
음, TargetProgram.exe + D78C612
에서 함수가 말할 수와의 그것이 다음과 같이 호출 할 수있는 가정 해 봅시다 :C++ : 함수 호출을위한 코드 삽입

push eax 
push [esp+08] 
push edx 
push 00 
push TargetProgram.exe+AF76235 
push 04 
call TargetProgram.exe+D78C612 

가 정확히 어떻게 내가 위해 WriteProcessMemory()로이 작업을 수행 할 것 ?
중요한 내용을 덮어 쓰지 않고 코드를 삽입 할 수있는 섹션은 어디에서 찾을 수 있습니까? 가장 중요한 것은 함수를 어떻게 호출할까요?
활성 루틴에서 내 코드로 점프를하고 점프하고 다시 삭제하십시오. 하지만 어떻게 그 일상을 찾을 수 있을까요?
많은 질문이있어서 시작하는 법을 모릅니다 ... 저를 도울 수 있기를 바랍니다. :)
그리고 시간이 있다면 실제로 함수 호출 주입 예제 코드를보고 싶습니다.

답변

4

VirtualAllocEx을 사용하여 원격 프로세스에서 메모리를 할당 한 다음 프로 시저를이 메모리로 복사 할 수 있습니다.

최대의 대답에 의해 언급 한 바와 같이
SuspendThread(hThread); // Suspend the remote thread 
remote_address = VirtualAllocEx(hProcess, ...) // allocate memory for your code 
WriteProcessMemory(hProcess, remote_address, local_address, length, NULL) // copy your code to remote process 
WriteProcessMemory(hProcess, remote_fixup, ...) // insert a jump to your code 
ResumeThread(hThread); // Resume the remote thread 
+0

OP와 비슷한 문제가 있지만 1 차 WriteProcessMemory 호출이 없습니다. local_address로서 함수의 주소를 전달할 수 있지만 다음 인수에서 길이를 전달할 수 없습니다. 간단히 말해 컴파일러가 아직 컴파일하지 못했기 때문에 얼마나 큰지 알지 못하기 때문입니다. WriteProcessMemory는 내 프로세스에서 다른 프로세스로 함수/코드를 작성하는 데 적합합니까? 편집 : 또는 C + + 대신 어셈블러에서 함수를 작성하는 유일한 열쇠 (나는 그것을 계산할 수 있습니까?)? – Kra

+2

@Kra 대부분의 경우 점프 주소가 깨지기 때문에 C 함수를 다른 프로세스로 복사 할 수 없습니다. 재배치를 수정하거나 재배치 가능한 코드를 작성해야합니다.두 경우 모두 어셈블리 언어를 사용해야합니다. 함수 코드 길이에 대한 질문에 대답하기 위해 최적화를 사용하지 않고 f1() 및 f2() 함수를 작성할 수 있다고 생각합니다. 여기서 f2는 코드에서 f1을 따릅니다. 그런 다음 f2의 주소에서 f1의 주소를 빼고 f1의 길이를 얻을 수 있습니다. 그러나 함수 크기는 여기에있는 문제 중 가장 적은 것입니다. – Max

+0

포인트를 얻었습니다. 감사. – Kra

1

, VirtualAllocEx은 원격 프로세스에 메모리 페이지를 할당하는 방법 중 하나는 당신이 프로세스에 대한 PROCESS_VM_OPERATION 액세스 권리를 가지고 가정입니다 : 여기

사출을하는 단계입니다 문제. 새로운 페이지가 쓰는 동안 보호 수준에 대해 PAGE_EXECUTE_READWRITE으로 표시되었는지 확인한 다음 나중에 PAGE_EXECUTE_READ으로 변경하고 VirtualProtectEx을 사용하여 변경하십시오.

x86의 분기 및 일부 호출 명령어는 IP 기준입니다. 즉, 인코딩은 명령의 끝에서 서명 된 상대 변위를 사용하므로 메모리에있는 위치에 따라 달라집니다. 따라서 새 코드에서 기존 함수를 호출 할 계획이라면 상대 호출 명령을 사용할 때 이것을 고려하거나 간접/직접 형 식을 대신 사용해야합니다.

그러나 여기서 수행하려는 작업을 정확히 모르는 경우 새 대상 코드를 실행하기위한 기술을 권장하기가 어렵습니다. 새로운 코드를 사용하면 CreateRemoteThread을 사용하는 원격 스레드를 삽입하여 기존 스레드를 중단시키지 않고 실행할 수 있습니다. 이것은 새 코드를 실행하는 가장 간단한 솔루션이지만 호출하는 코드는 스레드로부터 안전해야합니다. 이미 실행중인 스레드를 선택하거나, 일시 중단하거나, EIP를 수정하거나, 우회 경로를 도입하고, 부작용없이 호출을 다시 시작하는 것은 매우 어렵습니다.

개인 메모 : 타사 x86/x86-64 코드를 신속하게 다시 작성하여 범위 데이터를 수집하기 위해 Visual Studio 2012의 코드 적용 도구를 작성한 사람으로서이 내용이 유용합니다. - 해킹하고 생각하는 재미 :

관련 문제