分析symbian软件总结笔记
一、symbian API
這里只說說對分析破解symbian軟件用得到的API接口。
1、獲取手機IMEI碼:
CTelephony::TPhoneIdV1::TPhoneIdV1(void)
CTelephony::GetPhoneId(TRequestStatus &, TDes8 &)
獲取的IMEI碼的數據類型為unicode字符串類型,這是目前軟件注冊驗證最喜歡用的,也是最直接有用的突破口。
2、比較函數:
TDesC8::Compare(TDesC8 const&)
TDesC16::Compare(TDesC16 const&)
TDesC16::CompareF(TDesC16 const&)
返回值為0即兩個數據相同,一般在IDA Pro搜索Compare文本即可,這是最常用的之一了。
3、文件類:
RFile::Open(RFs &,TDesC16 ?const&,uint) ?//打開文件,返回文件句柄
RFile::Read(TDes8 &)?? //讀取文件
RFile::Size(int &) //文件大小
注冊方式用授權文件時也是很好的突破點。
4、窗口類:
CAknNoteDialog::CAknNoteDialog(void) ?
提示對話框,通過窗口類找突破口目前我還沒有成功用過,所以對這些類了解很少。
5、字符串資源加載:
StringLoader::Load(TDes16 &,int,CCoeEnv *)
CCoeEnv::AllocReadResourceAsDes16LC(int) //一般搜索Resource就可以搜到一堆相關API
這個要用得先對資源文件的結構有所了解才能用,其中那個int類型參數值是字符串數據索引表起始地址+索引值,一般程序中是用字符串數據索引表起始地址+一個字符串的索引值,然后再用這個值加上與要加載的目的字符串的索引值差值,通過索引值來判斷字符串內容進而確認是否是關鍵點,這個方法的關鍵是要對資源文件結構有所了解,找到字符串數據索引表的起始位置的地址,又因為加載字符串的地方非常多,所以實際使用很困難,不太推薦用這個方法。
6、加密類
(1)CRC32加密
Mem::Crc32(ulong &,void ?const*,int) //對內存數據進行CRC32驗證,用于防止程序數據被修改
(2)Base64加密
TImCodecB64::TImCodecB64(void)?
TImCodecB64::Encode(TDesC8 ?const&,TDes8 &) //編碼
TImCodecB64::Decode(TDesC8 ?const&,TDes8 &) ?//解碼
(3)SHA1加密
CSHA1::NewL(void)?
調用SHA1執行加密的對象方法的匯編代碼一般類似BL ?R3,R3寄存器的值即該加密方法的?函數地址。
(4)RSA加密
RInteger::NewL(TDesC8 ?const&)
RInteger::NewL(int) ?//這兩句是用來創建大數的,第一句一般是生成模數n,第二句是生成公鑰e
CRSAPublicKey::NewLC(RInteger &,RInteger &) ?//用前兩句生成的模數n和公鑰e來生成公鑰對象
CRSAPKCS1v15Verifier::NewLC(CRSAPublicKey ?const&) ?//用公鑰對象生成驗證對象
CRSASignature::NewLC(RInteger &) ?//RInteger一般為明文,即注冊碼數據,生成簽名對象
接下來的匯編代碼中會按順序出現一句BL ?R3和一句BL ?R2,執行BL ?R2后的R0值即密文,用RSA加密一般是用IMEI的數據(可以先做一些處理)作為密文,軟件作者通過解密程序(即注冊機)算出明文生成注冊碼,而程序用加密把注冊碼加密還原出IMEI數據,然后再把還原出的數據與IMEI數據進行比對,具體RSA加密的原理請自行搜索了解。
7、數據拷貝:
TDes8::Copy(TDesC8 ?const&)
TDes16::Copy(TDesC8 ?const&)
TDes16::Copy(TDesC16 ?const&)
一般R0為返回值,R1為參數,即把R1指向的數據復制一份到R0指向的內存地址內,ARM匯編代碼一般為:
LDR ? ?R1,[SP,#100+var_10] ? //將要復制的數據地址加載到R1
LDR ? ?R0,[SP,#100+var_20] ? //把要存儲數據備份的內存地址加載到R0
TDes16::Copy(TDesC16 ?const&) ?//調用函數,R1即函數的參數,R0為返回值。
8、堆棧數據安全清除:
CleanupStack::PushL(CBase *)
CleanupStack::PopAndDestroy(int)
CleanupStack::PopAndDestroy(void)
這個對分析沒多大用處,但在修改代碼時需要注意,PushL和PopAndDestroy需要配對使用,如果修改程序流程跳過了PushL,后面卻執行PopAndDestroy也許會造成程序崩潰,所以如果發現改完程序運行崩潰了,可以檢查一下是否是這個原因。
二、ARM匯編 1、函數調用 ARM匯編語言的函數調用只能使用R0、R1、R2、R3四個寄存器作為參數,超過四個參數的函數,后面的參數必須得使用堆棧,沒有返回值的函數的參數從左至右相應對應,function(R0,R1,R2,R3,SP1,SP2....),有返回值的函數一般R0作為返回值,即R0=function(R1,R2,R3,SP1,SP2....)。 2、指令 CMP----比較 BEQ----兩數相等跳轉 BNE----兩數不等跳轉 BGE----操作數1大于等于操作數2跳轉 BLE----操作數1小于等于操作數2跳轉 B-------強制跳轉,無需條件比對 ADD----加 SUB----減 MUL----乘 LSL----左移 LSR----右移 LDR----內存數據/地址加載 STR----內存數據/地址存儲 NOP----空指令,不做任何操作 MOV----賦值 BL,BLX-函數調用 ARM指令分16位和32位,一般使用的是16位,調用系統API的代碼語句為32位,怎么看呢?在IDA中看單行語句的十六進制代碼,兩個字節長度的即16位,四個字節的為32位。 3、代碼修改 分析完軟件,找到破解點后,如果采用爆破方式,就需要修改代碼,修改前要先知道改后的匯編代碼的機器碼,才能在十六進制編輯器內修改,在這里推薦一個工具CeleASM,這個工具是用來將ARM匯編代碼生成機器碼(十六進制)的,之前因為不會用一直放在硬盤上,今天看了下ARM的一些文章,再經過一番折騰,終于弄明白了,發現CeleASM的強大了,在說這個軟件前先說下ARM中跳轉指令的尋址方式,ARM匯編的尋址方式共有9種,其中一種是相對尋址方式,相對尋址方式是以PC值為基址,到目的地址的偏移量,PC值即是要修改的代碼地址,直接舉個例子: .text:79C27B0C ? ? ? ? ? ? ? ? CMP ? ? R0, #0 .text:79C27B0E ? ? ? ? ? ? ? ? BEQ ? ? loc_79C27B18 //如果你要把這句修改成跳轉至loc_79C27B26 .text:79C27B10 ? ? ? ? ? ? ? ? LDR ? ? R1, [R0] .text:79C27B12 ? ? ? ? ? ? ? ? LDR ? ? R1, [R1,#4] .text:79C27B14 ? ? ? ? ? ? ? ? BLX ? ? R1 .text:79C27B16 ? ? ? ? ? ? ? ? STR ? ? R5, [R4,#0x58] .text:79C27B18 .text:79C27B18 loc_79C27B18 ? ? ? ? ? ? ? ? ? ? ? ? ? ?; CODE XREF: sub_79C27AB4+5Aj .text:79C27B18 ? ? ? ? ? ? ? ? LDR ? ? R0, [R4,#0x54] .text:79C27B1A ? ? ? ? ? ? ? ? CMP ? ? R0, #0 .text:79C27B1C ? ? ? ? ? ? ? ? BEQ ? ? loc_79C27B26 .text:79C27B1E ? ? ? ? ? ? ? ? LDR ? ? R1, [R0] .text:79C27B20 ? ? ? ? ? ? ? ? LDR ? ? R1, [R1,#4] .text:79C27B22 ? ? ? ? ? ? ? ? BLX ? ? R1 .text:79C27B24 ? ? ? ? ? ? ? ? STR ? ? R5, [R4,#0x54] .text:79C27B26 .text:79C27B26 loc_79C27B26 ? ? ? ? ? ? ? ? ? ? ? ? ? ?; CODE XREF: sub_79C27AB4+68j .text:79C27B26 ? ? ? ? ? ? ? ? LDR ? ? R0, [R4,#0x3C] .text:79C27B28 ? ? ? ? ? ? ? ? CMP ? ? R0, #0 .text:79C27B2A ? ? ? ? ? ? ? ? BEQ ? ? loc_79C27B34 .text:79C27B2C ? ? ? ? ? ? ? ? LDR ? ? R1, [R0] 如果你要把79C27B0E位置的BEQ?loc_79C27B18修改成B loc_79C27B26,即跳到loc_79C27B26處,那么你只要在CeleASM內填寫如下內容: AREA .text, CODE, READONLY CeleASM CODE16 B 0x18 END 然后按“匯編”按鈕,就會顯示如下內容: Microsoft (R) ARM Macro Assembler Version 14.00.60131 Copyright (C) Microsoft Corporation. ?All rights reserved.ARM macroassembler ? ? ?Page:1? 1 ? ? ? ? ? ? ? ? ? ? ?AREA .text, CODE, READONLY? 2 00000000 ? ? ? ? ?CeleASM? 3 00000000 ? ? ? ? ? ? CODE16? 4 00000000 e00a ? ? ? ? B 0x18? 5 00000002 ? ? ? ? ? ? END? Assembly terminated, errors: 0, warnings: 0? 把BNE 0x18前的e00a高低位調轉一下,即0ae0就是機器碼,就可以用十六進制編輯器進行修改了。那么我們所輸入的內容是什么意思呢?其實我們只要關注CODE16和B 0x18這兩句,其他內容可以看作是模板,用的時候只要在CeleASM和END之間填寫所要查詢的ARM匯編代碼即可。CODE16是告訴編譯器我們使用的是16位的Thumb指令,ARM匯編指令有16位和32位兩種,16位指令的機器碼是2字節,32指令的機器碼是4字節,這里用的是16位,16位指令尋址范圍只能在32MB內,32位尋址范圍在4GB內,如果你要查詢的是32位的指令,只要把CODE16刪除即可。B 0x18中的B就是強制跳轉指令,0x18是79C27B0E地址到79C27B26地址的偏移量,即0x79C27B26-0x79C27B0E=0x18,最后附一些經常需要修改的語句查詢結果。
Microsoft (R) ARM Macro Assembler Version 14.00.60131 Copyright (C) Microsoft Corporation. ?All rights reserved.
ARM macroassembler ? ? ?Page:1? 1 ? ? ? ? ? ? ? ? ? ? ?AREA .text, CODE, READONLY? 2 00000000 ? ? ? ? ? ? 3 00000000 ? ? ? ? ?CeleASM? 4 00000000 ? ? ? ? ? ? CODE16? 5 00000000 2801 ? ? ? ? CMP R0,#0x1? 6 00000002 d106 ? ? ? ? BNE 0x10? 7 00000004 9940 ? ? ? ? LDR R1,[SP,#0x100]? 8 00000006 9440 ? ? ? ? STR R4,[SP,#0x100]? 9 00000008 2800 ? ? ? ? CMP R0,#0x0? 10 0000000a d00c ? ? ? ? BEQ 0x1C? 11 0000000c 1c0e ? ? ? ? MOV R6,R1? 12 0000000e 3201 ? ? ? ? ADD R2,#0x1? 13 00000010 e00a ? ? ? ? B 0x18? 14 00000012 46c0 ? ? ? ? NOP? 15 00000014 ? ? ? ? ? ? END? Assembly terminated, errors: 0, warnings: 0?
三、資源文件結構 了解了這個才有辦法用字符串加載API作為突破口,但這個沒有做過研究,只是通過別人研究結果試了一下,但實際使用效果不佳,所以也就不用,有興趣的可以搜一下,網上有一篇這方面的文章,就不在此記錄了。
總結
以上是生活随笔為你收集整理的分析symbian软件总结笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Seafile在玩客云上的armbian
- 下一篇: dataTable自定义搜索框位置