Mais conteúdo relacionado Semelhante a CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering (20) Mais de Ciklum Ukraine (20) CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering2. Цели
•Библиотеки detour и gmock
•Есть проблемка с телепортацией... ©The Big Bang Theory
5. Detours Принцип работы
Caller function Callee function
Your function Caller prolog*
6. Detours Принцип работы
Caller function Callee function
Your function Caller prolog*
* - replaced by unconditional jump original instructions
7. Detours Принцип работы
Caller function Callee function
Your function Caller prolog*
* - replaced by unconditional jump original instructions
8. Detours Принцип работы
…
CalleeFunction:
jmp YourFunction
…
CalleeFunction: CalleeFunction+5:
push ebp push edi
mov ebp,esp …
push ebx Prolog:
push esi push ebp
push edi mov ebp,esp
… push ebx
push esi
jmp CalleeFunction+5
10. Detours Обзор
Трамплины*:
•Статические
•Динамические
* - пролог
12. 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);
}
* - обращайте внимание на соглашения о вызове
14. 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 );
}
*-обращайте внимание на соглашения о вызове
15. Detours Обзор
Еще Detours “умеет внедрение”
18. Detours
Демонстрация
Запуск своего кода в контексте IDA Pro
20. Google mock
•Mock класс
•Ожидания
•Действия
•Совпадения
22. Google mock Mock класс
Объявляется:
•MOCK_METHODn
•MOCK_CONST_METHODn
•MOCK_METHODn_T
•MOCK_CONST_METHODn_T
23. Google mock Mock класс
Use cases:
•Виртуальные методы
•Невиртуальные методы
•Свободные функции
•Шаблоны классов
24. Google mock 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
25. Google mock Mock класс
Use cases:
•Виртуальные методы
•Невиртуальные методы
•Свободные функции
•Шаблоны классов
26. Google mock Mock класс Невиртуальные методы
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() );
};
*- AppendPacket отстутствует
27. Google mock Mock класс
Use cases:
•Виртуальные методы
•Невиртуальные методы
•Свободные функции
•Шаблоны классов
28. Google mock Mock класс
Use cases:
•Виртуальные методы
•Невиртуальные методы
•Свободные функции
•Шаблоны классов
29. Google mock Mock класс Шаблоны классов
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 ) );
};
*- обратите внимание на _T
31. Google mock Ожидания
EXPECT_CALL( mock_object, method( matchers ) )
.Times( cardinality )
.WillOnce( action )
.WillRepeatedly( action );
32. Google mock Ожидания
EXPECT_CALL( turtle, Forward( _ ) );
EXPECT_CALL( turtle, Forward( 10 ) )
.Times( 2 );
*- ожидания просматриваются в порядке обратном их объявлению
34. Google mock Действия
•Возвращают значение
•Побочные эффекты
•Функция как действие
•Составное действие
•ACTION макрос
35. 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 >( ) );
36. Google mock Действия
•Возвращают значение
•Побочные эффекты
•Функция как действие
•Составное действие
•ACTION макрос
37. 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 ) );
38. Google mock Действия
•Возвращают значение
•Побочные эффекты
•Функция как действие
•Составное действие
•ACTION макрос
39. 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 ) );
40. Google mock Действия
•Возвращают значение
•Побочные эффекты
•Функция как действие
•Составное действие
•ACTION макрос
41. 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 ) ) );
42. Google mock Действия
•Возвращают значение
•Побочные эффекты
•Функция как действие
•Составное действие
•ACTION макрос
43. Google mock Действия ACTION макрос
ACTION_P( Add, n ) { return arg0 + n; }
EXPECT_CALL( foo, Calc( 10 ) )
.WillOnce( ReturnAdd( 5 ) );
46. Google mock Совпадения
EXPECT_CALL( foo, DoThat( "Hello", 5 ) );
47. Google mock Совпадения
•Wildcards
•Простые сравнения
•Строковые совпадения
•Контейнерные совпадения
•Member совпадения
•Составные совпадения
•…
•MATCHER макрос
48. Google mock Совпадения Wildcards
EXPECT_CALL( foo, DoThat( _, 5 ) );
49. Google mock Совпадения
•Wildcards
•Простые сравнения
•Строковые совпадения
•Контейнерные совпадения
•Member совпадения
•Составные совпадения
•…
•MATCHER макрос
50. Google mock Совпадения Простые сравнения
EXPECT_CALL( foo, DoThat( NotNull(), Ge( 5 ) ) );
51. Google mock Совпадения
•Wildcards
•Простые сравнения
•Строковые совпадения
•Контейнерные совпадения
•Member совпадения
•Составные совпадения
•…
•MATCHER макрос
52. Google mock Совпадения Строковые совпадения
EXPECT_CALL( foo, DoAlso( HasSubstring(“Hey”) ) );
53. Google mock Совпадения
•Wildcards
•Простые сравнения
•Строковые совпадения
•Контейнерные совпадения
•Member совпадения
•Составные совпадения
•…
•MATCHER макрос
54. Google mock Совпадения Контейнерные совпадения
MOCK_METHOD1( Foo, void( const vector< int >& numbers ) );
EXPECT_CALL( mock, void( ElementsAre( 1, Gt( 0 ), _, 5 ) ) );
55. Google mock Совпадения
•Wildcards
•Простые сравнения
•Строковые совпадения
•Контейнерные совпадения
•Member совпадения
•Составные совпадения
•…
•MATCHER макрос
56. Google mock Совпадения Member совпадения
MOCK_METHOD1( Foo, void( Bar ) );
EXPECT_CALL( mock, void( Field(&Bar::first, Le( 10 ) ) ) );
57. Google mock Совпадения
•Wildcards
•Простые сравнения
•Строковые совпадения
•Контейнерные совпадения
•Member совпадения
•Составные совпадения
•…
•MATCHER макрос
58. Google mock Совпадения Составные совпадения
EXPECT_CALL( foo, DoAlso( AnyOf(“Hey”, “Dolly”) ) );
59. Google mock Совпадения
•Wildcards
•Простые сравнения
•Строковые совпадения
•Контейнерные совпадения
•Member совпадения
•Составные совпадения
•…
•MATCHER макрос
60. Google mock Совпадения MATCHER макрос
MATCHER_P( IsDivisibleBy, n, "" ) { return ( arg % n ) == 0; }
EXPECT_CALL( mock, Calc(IsDivisibleBy( 10 ) ) );
63. Google mock
Демонстрация
Тестирование отреверсенного кода в gmock