2010-11-23 6 views
0
내가 exe 인 내가 사용하고 있으므로 코드를 실행하면 메시지 상자를 표시하기 위해 exe 파일을 읽고 코드를 삽입하는 C#을 사용하고

은 다음과 같다 : 내가 가상 주소입니다 사용하고자동 가상 주소를 메모리 주소로 변환 하시겠습니까?

6A 00    //push 0 
68 OXxxxx   //push Address of Message Title 
68 OXxxxx   //push Address of Message Body 
6A 00    //push 0 
FF 15 OXxxxx  //Call Address of User32.MessageBoxA 
E9 OXxxxx   // jmp to old entry point 

모든 주소 만 새로운 exe는 실행할 수 없습니다, 나는 주소가 (윈도우 로더에 의해) 메모리 주소로 변환해야한다고 생각하지만 어떻게 할 수 있습니까 ??.

감사합니다.

답변

2

가상 주소는 메모리 주소입니다.
.exe에 재배치 테이블이있는 경우 새베이스 주소로 재배치 할 수 있으며 pushcall 명령에 재배치 테이블 항목이없는 경우 테이블이 손상됩니다.

또한 코드에서 사용하는 문자열의 위치가 표시되지 않기 때문에 코드가 맞는지 확실하지 않습니다.

6A 00   // push 0 
6A 00   // push 0 
E8 04 00 00 00 // call $+5+4 
31 32 33 00 // '123', 0 
6A 00   // push 0 
68 XX XX XX XX // push user32.MessageBoxA address, it's the same in all processes 
C3    // retn 
E9 XX XX XX XX // jmp OEP 

UPD : 지적ruslik 우리가 파일을 패치하는 경우, 우리가 모르는 그 문제를 보장하기 위해

재배치 테이블의 항목을 누락, 다음 위치 독립적 인 코드를 시도 user32.MessageBoxA 주소이므로 다른 방법으로 찾아야합니다. 우리는 IAT 항목의 주소를 알고 있다면

, 우리는 독립적 인 뭔가베이스에 FF 15 (__imp_MessageBoxA)를 교체해야합니다 :

 E8 00 00 00 00 // call base: 
base: 
    58    // pop eax 
    05 XX XX XX XX // add eax, __imp_MessageBoxA - base 
    FF 10   // call dword ptr [eax] 
+0

2 개 질문 : 1 - (E8 04 무엇 00 00 00 // 전화 $ + 5 + 4 31 32 33 00 // '123', 0 6A 00 // push 0) 2 - 재배치 테이블 – Radi

+0

에서 push 및 call 명령어에 대한 항목을 추가하는 방법 - 일부 어셈블리 코드입니다. 당신은 PE에 감염되기 전에 그것을 배워야합니다. 2. - PE 형식 스펙을 읽습니다. – Abyx

+0

작은 수정 :'call'은 재배치 엔트리가 필요하지 않습니다, 그것은 import 테이블을 참조하는 것입니다. –

관련 문제