IDA PRO 逆向工程要點
1 IDA pro 進行動態分析的流程。
尤其是 啟動階段下斷點的方法。 之前網上搜過,但是沒記錄下來?
1
E:\javaDev\android-sdk\platform-tools>adb push android_server /data/local/tmp/
2
E:\javaDev\android-sdk\platform-tools>adb shell
3 獲取root許可權
[email protected]:/ $ su
4
[email protected]:/ # cd /data/local/tmp
[email protected]
5
[email protected]:/data/local/tmp # ./android_server
6 再開一個命令列視窗
adb forward tcp:23946 tcp:23946
7 開啟IDA 進行程序附加
2 vs 工程是怎麼建起來的
3 常用的技巧哪些?
指令碼編寫是一個
IDA使用技巧:
某些呼叫函式的地方, 引數個數分析不正確, 尤其是在使用棧傳遞額外引數的時候,
此時,在呼叫指令處按F5, 強制再分析一遍, 可能會分析正確!
對於較為複雜的流程結構(浮點相關除外),IDA 的翻譯很少出問題。 可以直接使用,但整數指令 的合併較多, 不確定是否全都正確!尤其是涉及到位操作的時候
IDA 對於 棧中 陣列和結構體 基本 識別不到,會出問題!
IDA對流程跳轉的分析往往比較準確,尤其是用do while和goto處理跳轉。
但由浮點數運算導致的 跳轉識別不到
2016年5月5日16:16:29
第一遍翻譯的時候, 不要合併太多指令成一個表示式, 這樣容易出錯。
應該大量逐句翻譯, 測試完畢, 保證正確後,再進行表示式合併和簡化。
2016年5月11日15:15:56
Ida 對於沒有子函式呼叫,沒有浮點數, 沒有區域性陣列的函式的翻譯是正確的
2016年5月13日09:53:37
碰到連續的浮點數填充, 有可能是在構造陣列, 不要逐行翻譯!這樣是無效的
2016年5月13日17:20:38
一定要化整為零, ! 逐步保證所作的工作 是正確的!
不要一次性搞一大坨!出了錯都不知怎麼找。。。
2016年5月23日14:08:31
IDA 摳大量資料是使用快捷,在記憶體區起始地址, Alt+L, 對應選單的編輯->開始選擇
然後在記憶體區,按G, 輸入目標地址, 這時會跳轉到目標地址, 使用鍵盤上的右方向鍵向右進行選擇若干列即可!
2016年6月1日10:29:05
編譯器對整除除法會進行優化, IDA能識別到這一點。
比如除以10, 可以先用 UMULL 乘以 0xcccccccd, 再將高32位右移3位,即得到商
4 偏僻的指令有哪些
Uxth,
示例, r10 = 0xfffffffb
uxth r3, r10
後, r3 = 0x0000fffb
Smull 指令, ida 6.6無法翻譯此指令
r1 = 0x0000fffb, 低16位當成有符號數即為 -5
smulbb r1, r1, r1
結果為 r1 = 0x00000019, 即 25
對於單精度浮點數的十六進位制表示:
UBFX R2, R1, #0x17, #8
可獲取 r1 表示的浮點數的指數部分
比如, r1 = 11.0, 如上 r2 = 0x82
5 容易出錯的有哪些點
浮點指令裡說對結果求反,就是指 取相反數
RSBS R2, R2, #1
MOVCC R2, #0
這種,先運算,並修改標誌位, 然後判斷。
直接 r2 = 1-r2; 然後 if(1 < r2) 就出錯了。必須先用一個變數儲存比較資訊,再運算
Vs除錯時, 某些時候在函式開始時下斷點會導致莫名其妙的問題(對SP進行修改的指令更容易出問題?)。 因此,穩妥起見,還是在幾條指令後再下斷點. 出現這個問題也可能是用的測試機不行
Ida 對某些浮點立即數的解析存在問題, 精度不夠高。 VS沒有這樣的問題。
一些填充陣列的程式碼裡面 包含一兩條 儲存資料或者其他的指令,導致容易發生指令遺漏
注意不要遺漏 函式呼叫 對 r0 的影響!
讀取整數陣列的時候, 使用 int 比 unsigned int 安全, 因為讀取的數可能是負數,使用無符號數讀取,後續運算易出錯!
IDA 翻譯出的VCVTR 指令,似乎 vs 翻譯不出來。。此時,可能出現 兩者執行結果不一致的情況。這個要引起注意!
6 重要的知識點
LR 暫存器的主要作用
在使用 隱式函式呼叫時, 一般會用到 LR暫存器,
還有哪些場合? 使用棧來傳遞額外引數?
GDB 常用指令
b *(0x5bae48a0-0xf8a0+0xB48B8)
i sh
Delete breakpoints 刪除所有斷點
Disable n 利用序號禁用某個斷點
2016年5月28日17:27:45
使用 AWK 翻譯全部程式碼,注意事項有哪些?
1 判斷和跳轉
CMP 和跳轉語句一起翻譯,使用 goto 翻譯
2 函式開頭結尾、
3 一些指令 好像是先從 記憶體讀取浮點數的十六進位制到整數暫存器,再從整數暫存器轉到浮點暫存器? 這種情況就容易出錯
VLDR S15, [R2]
VMOV R10, S15
STR R10, [R8,R3]
上面是一種典型的情況, 把浮點數十六進位制存到整數暫存器中,然後存入記憶體
如果 int r10 = s15; 這就會導致舍入。 該怎麼翻譯!
uint32 r10 = (uint 32)&s15;
2016年5月29日16:53:17
關鍵幀還是 各種跳轉指令翻譯起來比較麻煩。。 大概目前碰到過12 中跳轉指令!
還好不是幾十種!
還有浮點數的跳轉, 這個需要引起注意!
MOV LDR STR 是絕大部分用到的指令!
2016年5月29日17:04:15
CMP 和跳轉往往並不相鄰! 這個要引起注意!
需要想個辦法!
2016年5月30日09:09:07
碰到 CMP ,使用兩個變數 記錄 兩個運算元!
2016年6月1日10:32:52
逐行翻譯, 實際上是給 ARM 彙編寫一個直譯器!
直譯器本身用AWK實現, 用C++程式碼進行解釋! 是這樣的!
2016年6月1日20:18:17
剛才翻譯了 CMP, B , BNE,
看到如下這幾條指令, 翻譯要小心啊!
LDMIA R4, {R0-R2}
LDMIB R12, {R10,LR}
STMIA R4, {R3,R10,LR}
STMIA R12, {R0-R2}
R0 = (uint32)(r4);
r4 += 4;
R1 = (uint32)(r4)
2016年6月1日20:24:20
一個關鍵的問題是, 從記憶體中讀出的整數, 是賦給int 還是賦給 unsigned ??
好像目前碰到負數的情況不多?
弄成 int 在多數時候比較保險! 在比較指令的時候如果是無符號數比較,則進行強行轉換
碰到這種要返回:
.text:00045854 ADD SP, SP, #0x64
.text:00045858 VPOP {D8-D13}
.text:0004585C LDMFD SP!, {R4-R11,PC}
BL 這種再處理下,好像就OK 了!
2016年6月6日11:57:04
如果對IDA 翻譯結果基礎之上 進行處理, 那麼,
浮點指令,相對定址獲取值, 暫存器需要人工定位,
更大的問題是, 浮點數引起的 條件判斷, 以及棧中浮點陣列的處理!