64
Bondartsov Artyom, Ciklum Microsoft Detours and Google Mock for C++ in development using reverse engineering

CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

  • Upload
    ciklum

  • View
    322

  • Download
    0

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Bondartsov Artyom,Ciklum

Microsoft Detours and

Google Mock for C++ in development

using reverse engineering

Page 2: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Цели

•Библиотеки detour и gmock

•Есть проблемка с телепортацией... ©The Big Bang Theory

Page 3: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Что такое Detours?

Detours

Page 4: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Detours

Принцип работы

Page 5: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Caller function

Принцип работыDetours

Your function

Callee function

Caller prolog*

Page 6: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Caller function

Принцип работыDetours

Your function

Callee function

Caller prolog*

* - replaced by unconditional jump original instructions

Page 7: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Caller function

Принцип работыDetours

Your function

Callee function

Caller prolog*

* - replaced by unconditional jump original instructions

Page 8: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Принцип работыDetours

… CalleeFunction: jmp YourFunction

CalleeFunction+5: push edi … Prolog: push ebp mov ebp,esp push ebx push esi jmp CalleeFunction+5

… CalleeFunction: push ebp mov ebp,esp push ebx push esi push edi …

Page 9: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Detours

Обзор

Page 10: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

ОбзорDetours

•Статические

•Динамические

Трамплины*:

* - пролог

Page 11: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

ОбзорDetours

Статический

Page 12: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

ОбзорDetours Статический пролог

#include <windows.h> #include <detours.h>

DETOUR_TRAMPOLINE( void WINAPI SleepTrampoline( DWORD ), Sleep ); void WINAPI SleepDetour( DWORD dw ) { return SleepTrampoline( dw ); } void main( ) { DetourFunctionWithTrampoline( ( PBYTE )SleepTrampoline, ( PBYTE )SleepDetour); Sleep( 0 ); DetourRemove( ( PBYTE )SleepTrampoline, ( PBYTE )SleepDetour); }

* - обращайте внимание на соглашения о вызове

Page 13: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

ОбзорDetours

Динамический

Page 14: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

ОбзорDetours Динамический пролог

#include <windows.h> #include <detours.h>

typedef void (WINAPI *SleepType)( DWORD );static SleepType SleepTrampoline = 0;

void WINAPI DynamicSleep( DWORD dw ) { return SleepTrampoline( dw ); } void main( ) { SleepTrampoline = ( SleepType )DetourFunction( (PBYTE)Sleep, ( PBYTE )DynamicSleep ); Sleep( 0 ); DetourRemove( (PBYTE)SleepTrampoline, ( PBYTE )DynamicSleep ); }

*-обращайте внимание на соглашения о вызове

Page 15: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

ОбзорDetours

Еще Detours “умеет внедрение”

Page 16: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Detours

Page 17: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Detours

9.999 / 64

Page 18: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Detours

ДемонстрацияЗапуск своего кода в контексте IDA Pro

Page 19: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

Что такое Gmock?

Page 20: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

•Mock класс

•Ожидания

•Действия

•Совпадения

Page 21: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

Mock класс

Page 22: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock Mock класс

•MOCK_METHODn

•MOCK_CONST_METHODn

•MOCK_METHODn_T

•MOCK_CONST_METHODn_T

Объявляется:

Page 23: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

•Виртуальные методы

•Невиртуальные методы

•Свободные функции

•Шаблоны классов

Use cases:

Mock класс

Page 24: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock Виртуальные методы

struct Foo { virtual bool Transform( Gadget* g ) = 0;

protected: virtual void Resume();

private: virtual int GetTimeOut();};

struct MockFoo : public Foo { MOCK_METHOD1( Transform, bool( Gadget* g ) ); MOCK_METHOD0( Resume, void() ); MOCK_METHOD0( GetTimeOut, int() );};

*- mock-методы в секции public

Mock класс

Page 25: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

•Виртуальные методы

•Невиртуальные методы

•Свободные функции

•Шаблоны классов

Use cases:

Mock класс

Page 26: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock Невиртуальные методы

*- AppendPacket отстутствует

struct ConcretePacketStream { void AppendPacket( Packet* packet ); const Packet* GetPacket( size_t number) const; size_t NumberOfPackets() const;};

struct MockPacketStream { MOCK_CONST_METHOD1( GetPacket, const Packet*( size_t number) ); MOCK_CONST_METHOD0( NumberOfPackets, size_t() );};

Mock класс

Page 27: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

•Виртуальные методы

•Невиртуальные методы

•Свободные функции

•Шаблоны классов

Use cases:

Mock класс

Page 28: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

•Виртуальные методы

•Невиртуальные методы

•Свободные функции

•Шаблоны классов

Use cases:

Mock класс

Page 29: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock Шаблоны классов

*- обратите внимание на _T

template < typename Elem >struct StackInterface { virtual ~StackInterface();

virtual int GetSize() const = 0; virtual void Push( const Elem& x ) = 0;};

template < typename Elem >struct MockStack : public StackInterface< Elem > { MOCK_CONST_METHOD0_T( GetSize, int() ); MOCK_METHOD1_T( Push, void( const Elem& x ) );};

Mock класс

Page 30: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

Ожидания

Page 31: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

EXPECT_CALL( mock_object, method( matchers ) ) .Times( cardinality ) .WillOnce( action ) .WillRepeatedly( action );

Ожидания

Page 32: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

EXPECT_CALL( turtle, Forward( _ ) ); EXPECT_CALL( turtle, Forward( 10 ) ) .Times( 2 );

*- ожидания просматриваются в порядке обратном их объявлению

Ожидания

Page 33: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

Действия

Page 34: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

•Возвращают значение

•Побочные эффекты

•Функция как действие

•Составное действие

•ACTION макрос

Действия

Page 35: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

struct MockFoo : public Foo { MOCK_METHOD0( GetBar, Bar&() ); MOCK_METHOD1( Calculate, int( int ) );};...MockFoo foo;Bar bar;EXPECT_CALL( foo, GetBar() ) .WillOnce( ReturnRef( bar ) );EXPECT_CALL(foo, Calculate( 10 ) ) .WillOnce( ReturnArg< 0 >( ) );

Возвращают значениеДействия

Page 36: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

•Возвращают значение

•Побочные эффекты

•Функция как действие

•Составное действие

•ACTION макрос

Действия

Page 37: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

struct MockMutator : public Mutator { MOCK_METHOD2( Mutate, void( bool mutate, int* value ) );};...MockMutator mutator;EXPECT_CALL( mutator, Mutate( true, _ ) ) .WillOnce( SetArgPointee< 1 >( 5 ) );

Побочные эффектыДействия

Page 38: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

•Возвращают значение

•Побочные эффекты

•Функция как действие

•Составное действие

•ACTION макрос

Действия

Page 39: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

struct MockFoo : public Foo { MOCK_METHOD1( ComplexJob, bool( int x ) );};struct Helper { bool ComplexJob( int x );};...MockFoo foo;Helper helper;EXPECT_CALL( foo, ComplexJob( _ ) ) .WillOnce( Invoke( &helper, &Helper::ComplexJob ) );

Функция как действиеДействия

Page 40: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

•Возвращают значение

•Побочные эффекты

•Функция как действие

•Составное действие

•ACTION макрос

Действия

Page 41: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

struct MockMutator : public Mutator { MOCK_METHOD1( MutateInt, bool( int* value ) );};...MockMutator mutator;EXPECT_CALL( mutator, MutateInt( _ ) ) .WillOnce( DoAll( SetArgPointee< 0 >( 5 ),

Return( true ) ) );

Составное действиеДействия

Page 42: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

•Возвращают значение

•Побочные эффекты

•Функция как действие

•Составное действие

•ACTION макрос

Действия

Page 43: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

ACTION_P( Add, n ) { return arg0 + n; }

EXPECT_CALL( foo, Calc( 10 ) ) .WillOnce( ReturnAdd( 5 ) );

ACTION макросДействия

Page 44: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

Совпадения

Page 45: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

foo.DoThat( “Hello”, 5 );

Совпадения

Page 46: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

EXPECT_CALL( foo, DoThat( "Hello", 5 ) );

Совпадения

Page 47: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

•Wildcards

•Простые сравнения

•Строковые совпадения

•Контейнерные совпадения

•Member совпадения

•Составные совпадения

•…

•MATCHER макрос

Совпадения

Page 48: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

EXPECT_CALL( foo, DoThat( _, 5 ) );

Совпадения Wildcards

Page 49: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

•Wildcards

•Простые сравнения

•Строковые совпадения

•Контейнерные совпадения

•Member совпадения

•Составные совпадения

•…

•MATCHER макрос

Совпадения

Page 50: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

EXPECT_CALL( foo, DoThat( NotNull(), Ge( 5 ) ) );

Простые сравненияСовпадения

Page 51: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

•Wildcards

•Простые сравнения

•Строковые совпадения

•Контейнерные совпадения

•Member совпадения

•Составные совпадения

•…

•MATCHER макрос

Совпадения

Page 52: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

EXPECT_CALL( foo, DoAlso( HasSubstring(“Hey”) ) );

Строковые совпаденияСовпадения

Page 53: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

•Wildcards

•Простые сравнения

•Строковые совпадения

•Контейнерные совпадения

•Member совпадения

•Составные совпадения

•…

•MATCHER макрос

Совпадения

Page 54: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

MOCK_METHOD1( Foo, void( const vector< int >& numbers ) );

EXPECT_CALL( mock, void( ElementsAre( 1, Gt( 0 ), _, 5 ) ) );

Контейнерные совпаденияСовпадения

Page 55: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

•Wildcards

•Простые сравнения

•Строковые совпадения

•Контейнерные совпадения

•Member совпадения

•Составные совпадения

•…

•MATCHER макрос

Совпадения

Page 56: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

MOCK_METHOD1( Foo, void( Bar ) );

EXPECT_CALL( mock, void( Field(&Bar::first, Le( 10 ) ) ) );

Member совпаденияСовпадения

Page 57: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

•Wildcards

•Простые сравнения

•Строковые совпадения

•Контейнерные совпадения

•Member совпадения

•Составные совпадения

•…

•MATCHER макрос

Совпадения

Page 58: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

EXPECT_CALL( foo, DoAlso( AnyOf(“Hey”, “Dolly”) ) );

Составные совпаденияСовпадения

Page 59: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

•Wildcards

•Простые сравнения

•Строковые совпадения

•Контейнерные совпадения

•Member совпадения

•Составные совпадения

•…

•MATCHER макрос

Совпадения

Page 60: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

MATCHER_P( IsDivisibleBy, n, "" ) { return ( arg % n ) == 0; }

EXPECT_CALL( mock, Calc(IsDivisibleBy( 10 ) ) );

MATCHER макросСовпадения

Page 61: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

Page 62: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Virtual vs. nonvirtual?

Google mock

Page 63: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Google mock

ДемонстрацияТестирование отреверсенного кода в gmock

Page 64: CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Заключение...