2016-12-12 8 views
5

내 DLL에서 을 호출하고 싶은 실행 파일 내에 함수가 있습니다. OllyDbg에 따르면이 주소는 0x0090DE00입니다. 내가 직접 전화를 시도했다 :로드 된 DLL에서 실행 파일에있는 함수를 호출하는 방법은 무엇입니까?

luaL__openlib *f = ((luaL__openlib*)(module_handle + 0x0090DE00)); 

을뿐만 아니라 here 제안으로의 모듈 핸들의 기지를 추가로 :

uint8_t * module_handle = (uint8_t *)GetModuleHandle(L"ForgedAlliance1.exe"); 

luaL__openlib *f = ((luaL__openlib*)(module_handle + 0x0090DE00)); 

내가 접근 할 수로이 작동하지 않은 것 같습니다 위반 예외 - 포인터가 유효하지 않은 것 같습니다.

So : 어떻게 주소를 사용하여이 함수를 호출 할 수 있습니까?


난 그냥 0x00C0B530에서 간단한 RET 명령을 삽입했다. 지금과 같이 보이나요 내 코드는 다음과 같습니다

예외 ForgedAlliance1.exe에 0x909090C3 던져 : 나는 예외 메시지에서 다른 주소를 얻을 이유가 확실히 이해하지 못하는 어떤

typedef void (*test)(); 

EXTERN_DLL_EXPORT void initialize(lua_State *L) 
{ 
    // Adding this should not be necessary. I get 0x00C0B530 from 
    // OllyDbg where the offset 0x00401000 is included 
    uint8_t * module_handle = (uint8_t *)GetModuleHandle(L"ForgedAlliance1.exe"); 

    test *f = NULL; 

    f = ((test*)(0x00C0B530)); 

    (*f)(); // Crashing 
} 

0xC0000005 : 액세스 위반 실행 위치 0x909090C3.


UPDATE : 나는 그냥 코드 자체

90 | NOP 
90 | NOP 
90 | NOP 
C3 | RETN 

입니다 내가 포인터로 뭔가를 엉망으로하고있다 보인다, 0x909090C3 여기에 단지 포인터 아니라는 것을 깨달았다. 왜 "위치"를 실행하려고합니까 0x909090C3. 그것은 위치가 아닙니다.

+1

olly를 검사 할 때 함수가'ForgedAlliance1.exe'가 사용하는 다른 모듈 안에 저장되지 않았는지 확인 했습니까? – Bauss

+0

@Bauss 흠, 나는이 모든 것에 대해 조금 새로운 것이지만 어떻게 주소를 얻었는지 말할 수 있습니다 : 방금 실행 파일을 열었습니다. 디버깅 할 때 시작 주소는'0x00401000'입니다. 그래서 저는이 특정 창에서 볼 수있는 모든 것이 실행 파일이라고 가정합니다. 실행 파일의 어셈블리 코드에 몇 가지 변경 사항을 저장할 때마다 실행 파일'ForgedAlliance1.exe'를 덮어 씁니다. OllyDbg가 내 기억의 다른 영역을 표시하지 않는 한 주소는 정확해야하며 실행 파일의 일부 여야합니다. – displayname

+1

이 기사를 보셨습니까? https://www.codeproject.com/articles/1045674/load-exe-as-dll-mission-possible – Alden

답변

2

알았어, 그냥 포인터가 망가 졌어. 죄송합니다 - C에 작성하지 않았습니다. 내가 그랬어 그것은 바로, 기본적으로,하지만

f = ((test*)(0x00C0B530)); 
(*f)(); 

에 문제가 (*f)0x909090C3입니다입니다 - 실행 파일 내부 지침 -이 프로그램이되는 무효 물론이다 점프를 시도 주소입니다.

그래서 트릭이었다 :

int test_addr = 0x00C0B530 
f = ((test*)(&test_addr)); 
(*f)(); 

내가이 조금 더 간단 할 수 있지만 지금은 노력하고 있습니다 확신합니다.