記一個手遊app資料檔案的破解

來源:互聯網
上載者:User

標籤:android   資料破解   

出於一些很猥瑣的需要,同時自己也想做一些新鮮的嘗試,周末用了大半天時間破解了某款手遊的資料檔案。

過程比我預想的要順利,主要原因還是我們開發人員的懈怠,咳咳。

過程如下:

  • 下載安裝包,解壓,發現幾個XXX.db檔案,最感興趣的是一個50多M的XXX.db
  • 用UltraEdit開啟XXX.DB檔案,沒有任何線索。只發現這幾個檔案有相同的檔案頭
  • 搜尋.DB檔案可能是什麼檔案,發現了開源庫sqlite,這是一個輕量級的資料庫組件,IOS就用了這個,頓時眼前一亮
  • 下載sqlite的命令列工具,發現打不開.DB檔案
  • 自己存了一個sqlite的資料庫檔案做測試,發現根本就是明文儲存的
  • 是時候祭出神器IDA pro了,反組譯碼libXXX.so,發現大量sqlite3_XXX函數,.db檔案應該是sqlite資料庫檔案沒錯
  • 搜尋sqlite加密的相關資訊,官方的加密實現是需要授權的,但有一個wxsqlite的開源實現。私下推測該app用了wxsqlite
  • wxsqlite是AES演算法加密的,必須找到密匙,否則無法解密,心裡涼了半截
  • 繼續看反組譯碼,找到keySqlite函數,發現key就明文寫在代碼裡,是一串1....,額
  • 下載wxsqlite,寫了幾行代碼進行測試,發現依然打不開。自己建立了一個加密資料庫檔案,發現跟app的db檔案差別很大。
  • 閱讀wxsqlite的代碼,發現密碼編譯演算法是在sqlite3Codec函數中調用的。在彙編中找到sqlite3Codec,發現它調用了一個My_Encrypt_Func(呵呵)
  • 閱讀My_Encrypt_Func的彙編代碼,發現就是按位元組取反(呵呵呵)
  • 寫個小程式,將db檔案按位元組取反。再用UltraEdit開啟,看到了熟悉的明文資訊
  • 這回資料檔案可以用sqlite命令列開啟了,dump成txt檔案,得到表結構和所有的資料
  • 最後是那個50多M的db檔案。列印出表結構發現是一個字串name和一個二進位對象。寫個小程式,遍曆所有表項,將二進位對象存成png檔案。任務完成


收穫:
  • 如果是用wxsqlite加密實現,並且密匙是通過網路擷取的,那就得先想辦法在運行時hook api截獲密匙。破解難度會上升一大截...
  • 加密函數的arm彙編看上去效率很低....讓我好生奇怪。寫了一段同樣的代碼自己編了一下,發現該lib是debug的,這....
  • 加密相關的函數名暴露在動態庫中是很危險的,給函式宣告加上static,export符號表中沒有了,我們就只能看到一個地址跳轉啦

反組譯碼出來的加密函數,跟自己寫的並用debug編譯出來是一樣的
.text:002C46E0                 EXPORT My_Encrypt_Func.text:002C46E0 My_Encrypt_Func                         ; CODE XREF: sqlite3Codec+11Cp.text:002C46E0                                         ; sqlite3Codec+190p.text:002C46E0.text:002C46E0 var_3C          = -0x3C.text:002C46E0 var_38          = -0x38.text:002C46E0 var_34          = -0x34.text:002C46E0 var_30          = -0x30.text:002C46E0 var_28          = -0x28.text:002C46E0 var_20          = -0x20.text:002C46E0 var_4           = -4.text:002C46E0.text:002C46E0                 STR     R11, [SP,#var_4]!.text:002C46E4                 ADD     R11, SP, #4+var_4.text:002C46E8                 SUB     SP, SP, #0x1C.text:002C46EC                 STR     R0, [R11,#0x20+var_30].text:002C46F0                 STR     R1, [R11,#0x20+var_34].text:002C46F4                 STR     R2, [R11,#0x20+var_38].text:002C46F8                 STR     R3, [R11,#0x20+var_3C].text:002C46FC                 MOV     R3, #0.text:002C4700                 STR     R3, [R11,#0x20+var_28].text:002C4704                 B       loc_2C473C.text:002C4708 ; ---------------------------------------------------------------------------.text:002C4708.text:002C4708 loc_2C4708                              ; CODE XREF: My_Encrypt_Func+68j.text:002C4708                 LDR     R3, [R11,#-0x10].text:002C470C                 LDRB    R3, [R3].text:002C4710                 MVN     R3, R3.text:002C4714                 STRB    R3, [R11,#-9].text:002C4718                 LDR     R3, [R11,#-0x10].text:002C471C                 LDRB    R2, [R11,#-9].text:002C4720                 STRB    R2, [R3].text:002C4724                 LDR     R3, [R11,#-0x10].text:002C4728                 ADD     R3, R3, #1.text:002C472C                 STR     R3, [R11,#-0x10].text:002C4730                 LDR     R3, [R11,#-8].text:002C4734                 ADD     R3, R3, #1.text:002C4738                 STR     R3, [R11,#-8].text:002C473C.text:002C473C loc_2C473C                              ; CODE XREF: My_Encrypt_Func+24j.text:002C473C                 LDR     R2, [R11,#-8].text:002C4740                 LDR     R3, [R11,#-0x14].text:002C4744                 CMP     R2, R3.text:002C4748                 BCC     loc_2C4708.text:002C474C                 MOV     R3, #0.text:002C4750                 MOV     R0, R3.text:002C4754                 SUB     SP, R11, #0.text:002C4758                 LDR     R11, [SP+0x20+var_20],#4.text:002C475C                 BX      LR.text:002C475C ; End of function My_Encrypt_Func

用release編譯的,運行效率怎麼也得差幾十倍

.text:00001D88 ; My_Encrypt_Func(unsigned char *, unsigned int, unsigned char *, unsigned int).text:00001D88                 EXPORT _Z15My_Encrypt_FuncPhjS_j.text:00001D88 _Z15My_Encrypt_FuncPhjS_j.text:00001D88                 MOVS    R3, #0.text:00001D8A                 B       loc_1D94.text:00001D8C ; ---------------------------------------------------------------------------.text:00001D8C.text:00001D8C loc_1D8C                                ; CODE XREF: My_Encrypt_Func(uchar *,uint,uchar *,uint)+Ej.text:00001D8C                 LDRB    R2, [R0,R3].text:00001D8E                 MVNS    R2, R2.text:00001D90                 STRB    R2, [R0,R3].text:00001D92                 ADDS    R3, #1.text:00001D94.text:00001D94 loc_1D94                                ; CODE XREF: My_Encrypt_Func(uchar *,uint,uchar *,uint)+2j.text:00001D94                 CMP     R3, R1.text:00001D96                 BNE     loc_1D8C.text:00001D98                 MOVS    R0, #0.text:00001D9A                 BX      LR.text:00001D9A ; End of function My_Encrypt_Func(uchar *,uint,uchar *,uint)


記一個手遊app資料檔案的破解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.