C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[69648] Re:버추얼 메소드 테이블 패치해서 Virtual Function 가로채는 방법이 궁금합니다
김태선 [cppbuilder] 1631 읽음    2013-06-14 10:46
가상 메소드에 의한 VirtualTable이 놓이는 방식은
C++은 개발툴과 상관없이 표준적으로 동작합니다.
가상함수 점프 테이블이 곧 버츄얼테이블 입니다.

그러므로 원하는 가상 함수 점프테이블을 원하는 곳으로
수정해주면 됩니다.
가상테이블을 가르키는 포인트는 만들어진 객체가 가르키는 번지에 있고
가상테이블은 _DATA 영역에 놓이니까
잘 연구해보시면 될 것이라 생각됩니다.

하지만 자기 코드에 있는 것이 아닌 COM의 버추얼 테이블 수정이라면
WriteMemoryProcess 같은 다른 영역에 있는 메모리 수정 함수를 써야 가능할 것으로 보입니다.

한번 찾아 보시기를..

다음은 테스트 삼아 만든 간단한 버츄얼테이블 수정 예입니다.

//---------------------------------------------------------------------------
void __fastcall TFormMain::FormCreate(TObject *Sender)
{
    class Test
    {
    public:
        int v;
        virtual int add(int a)
        {
            return a + 1;
        }
    };

    class TTest : public Test
    {
    public:
        virtual int add(int a)
        {
            return a + 2;
        }
    };


    TTest aa;
    aa.v = 100;
    int n = aa.add(10);
    Caption = n;
    Test *bb = &aa;

    typedef int (__closure *TFunc2)(int);
    TFunc2 func = &_addtest;
    asm
    {
        lea eax, [bb]
        mov eax, [eax]
        lea edx, [func]
        mov [eax], edx
    };
    n = bb->add(10);   //  n 값은 15가 리턴됨.
    Caption = n;
}

int    TFormMain::_addtest(int a)
{
    return a + 5;
}


이 코드에 보시면 버추얼 메소드 TTest :: add 를
다른 클래스의 메소드 _addtest로 바꿔치기한 것입니다.
그래서 bb->add(10)을 호출하면
바꿔치기한 메소드가 실행되어 15를 리턴합니다.

//---------------------------------------------------------------------------



질문 님이 쓰신 글 :
: 어느 분이 RTTI 이용하거나 버추얼 메소드 테이블 패치해서 가로챌 수 있다고 쓰셨던거 같은데요
: 버추얼 메소드 테이블을 어떤 식으로 패치해서 코딩해야할지 도무지 감이 오질 않네요
:
:

+ -

관련 글 리스트
69635 버추얼 메소드 테이블 패치해서 Virtual Function 가로채는 방법이 궁금합니다 질문 1515 2013/06/12
69648     Re:버추얼 메소드 테이블 패치해서 Virtual Function 가로채는 방법이 궁금합니다 김태선 1631 2013/06/14
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.