2010-07-13 3 views
4

호출 할 함수를 새 함수로 변경하는 코드가 있지만 새 함수 만 호출하고 싶지는 않습니다. 이전 함수도 호출하고 싶습니다. . 이것은 예입니다, 그래서 당신은 무슨 말인지 이해할 수 : 내 .EXE를 분해하면Assembly 및 C++로 함수를 두 번 호출합니다.

, 나는이 부분에서 볼 것이다 :

L0: 
     mov eax, [L00654321] //doesn't matter 
     mov ecx, [eax+1Ch] //doesn't matter 
     push esi    //the only parameter 
0x123 call SUB_L00999999 //this is the function I wanna overwrite 
     //... 

(0x123 그 라인의 주소입니다) 에 어떤 아이디어를 어떻게 할 수 ...이 ... MyNewFunction

호출 그래서, 대신 SUB_L00999999를 호출, 이제

DWORD old; 
DWORD from = 0x123; 
DWORD to = MyNewFunction; 
VirtualProtect(from, 5, PAGE_EXECUTE_READWRITE, &old); 

DWORD disp = to - (from + 5); 
*(BYTE *)(from) = 0xE8; 
*(DWORD *)(from + 1) = (DWORD)disp; 

: 그래서,이 코드를 사용 여전히 오래된 함수를 호출합니까?

나는 (여러면에서)이 같은 것들을 시도했지만 내 응용 프로그램 충돌 :

int MyNewFunction(int parameter) 
{ 
    DWORD oldfunction = 0x00999999; 
    _asm push parameter 
    _asm call oldfunction 
} 

노트 : 나는 2010 비주얼 스튜디오 C++ 사용이 코드가 .exe로로드 된 .DLL에 있습니다.

감사합니다.

답변

2

나는 이런 문제가 오래 전에 발생했습니다. 어쨌든 _asm call dword ptr [oldfunction]이 나를 위해 일했습니다.

+0

감사합니다.이 사람은 괜찮 았는데, 나는 이것을 얼마 전에 사용했다는 것을 기억하지 못했습니다 ... –

2

ret은 맨 위 스택 인수가 돌아갈 주소가 될 것으로 예상합니다. 새 함수에서 ret 명령어 바로 이전에 스택에 구형 함수 주소를 푸시함으로써이 문제를 악용 할 수 있습니다. 호출이 돌아 오면 (또는 오히려 이전 함수로 분기) 스택 포인터가 원래 반환 주소 (여기 0x128)를 남기도록 이동하여 스택이 손상되지 않은 것처럼 보입니다. (당신이 우회를하지 않았 더라면 같았습니다).

+0

"ret"를 사용하여 예제 코드를 줄 수 있습니까? 고맙습니다. –

+1

'_asm {push oldfunction; ret 4}'그리고 디버거로 출력을 확인하십시오. 나는 C 컴파일러가 스택을 혼란시킬 수있는 다른 것을 추가/제거할지 여부를 확신 할 수 없다. 스택은 newfunction을 입력 할 때처럼 oldfunction을 입력 할 때 동일하게 보입니다. (아, 그리고 일부 레지스터가 동일해야 할 수도 있습니다, 당신 retn 전에 그들을 설정해야 할 수도 있습니다). –

+0

당신의 대답도 효과가 있습니다 만, 그냥 내 매개 변수로 함수를 호출하는 대신 이전 스택으로 돌아가서 함수를 호출한다는 점에서 더 복잡합니다. 나는 이것을 어떤 프로젝트 파일에서 보았고 그런 식으로 시도했다. 그러나 @myeviltacos의 방법은 더 어렵다. 도와 줘서 고마워. –