二.《UE4奧丁》解密哈希ID
哈希表概念
1.相信大家經(jīng)常在UE4或者UE5游戲逆向中遇到下面的代碼段
$?==>????????????>?41:8B42?0C???????????????>?mov?eax,dword?ptr?ds:[r10+C]??????????????>
$+4??????????????>?3B05?AE589B04????????????>?cmp?eax,dword?ptr?ds:[7FF7B68B74F4]???????>
$+A??????????????>?7D?28????????????????????>?jge?projectlh.7FF7B1F01C70????????????????>
$+C??????????????>?99???????????????????????>?cdq???????????????????????????????????????>
$+D??????????????>?0FB7D2???????????????????>?movzx?edx,dx??????????????????????????????>
$+10?????????????>?03C2?????????????????????>?add?eax,edx???????????????????????????????>
$+12?????????????>?8BC8?????????????????????>?mov?ecx,eax???????????????????????????????>
$+14?????????????>?0FB7C0???????????????????>?movzx?eax,ax??????????????????????????????>
$+17?????????????>?2BC2?????????????????????>?sub?eax,edx???????????????????????????????>
$+19?????????????>?48:98????????????????????>?cdqe??????????????????????????????????????>
$+1B?????????????>?C1F9?10??????????????????>?sar?ecx,10????????????????????????????????>
$+1E?????????????>?48:63C9??????????????????>?movsxd?rcx,ecx????????????????????????????>
$+21?????????????>?48:8D1440????????????????>?lea?rdx,qword?ptr?ds:[rax+rax*2]??????????>
$+25?????????????>?48:8B05?78589B04?????????>?mov?rax,qword?ptr?ds:[7FF7B68B74E0]???????>
$+2C?????????????>?48:8B0CC8????????????????>?mov?rcx,qword?ptr?ds:[rax+rcx*8]??????????>
$+30?????????????>?48:8D1CD1????????????????>?lea?rbx,qword?ptr?ds:[rcx+rdx*8]??????????>
$+34?????????????>?8B43?08??????????????????>?mov?eax,dword?ptr?ds:[rbx+8]??????????????>

2.其實這個就是在進行解密哈希ID,有的人不明白這個ID是如何通過這個哈希表拿到我們的哈希對象的
3.額~老師,啥是哈希表?
4.我們首先看看百度是如何解釋的

5.正如上面所說我們對任意給定的關(guān)鍵字值key,帶入函數(shù)后都能返回一個表中的地址,那么我們稱這個表是哈希表
6.是不是感覺和我們遇到的情況一樣,我們在UE4中通過一個哈希ID(Key),通過上面的代碼塊拿到對象
7.好~這里明白了大致的概念,現(xiàn)在我們就著手動態(tài)分析這段匯編代碼,搞清楚是如何解密ID拿到對象
哈希ID來源
1.首先在頭下斷點,并斷下

2.觀察此時的寄存器r10

3.轉(zhuǎn)到內(nèi)存發(fā)現(xiàn)r10是一個對象

4.按F8執(zhí)行一句,繼續(xù)觀察eax

5.發(fā)現(xiàn)eax存的是拿到的4字節(jié)r10對象+C的哈希ID

6.從來這,我們觀察到所有的r10對象+C偏移都是一個哈希ID!
7.結(jié)論大家一定要記??!以后看到這個對象+C偏移的地址存有一個4字節(jié)ID那么這個對象就是哈希對象
8.然后拿到這個哈希ID經(jīng)過下面的代碼段就可以返回對象了,現(xiàn)在我們看看匯編是如何操作這個哈希ID的
動態(tài)分析解密ID
1.我們繼續(xù)F8執(zhí)行到這里 movzx edx, dx 的下一句

2.當執(zhí)行 movzx edx, dx 后,觀察寄存器edx是0,好 我們繼續(xù)
3.執(zhí)行add eax, edx 后,觀察到把原本eax(哈希ID)加上了edx(0),然后賦值給了eax(哈希ID),注意這里都是在操作4字節(jié)哦,因為哈希ID就是一個4字節(jié)

4.到這里,我們的寄存器edx(0),eax(哈希ID)由于加上0還是等于哈希ID
5.繼續(xù)執(zhí)行,經(jīng)過這句代碼 mov ecx, eax,我們觀察到eax(哈希ID)賦值給了ecx(哈希ID)

6.繼續(xù)F8執(zhí)行movzx eax, ax后,這里就是關(guān)鍵點了,我們觀察寄存器變化

7.原本的eax()變成了1D73,是不是取了原本31D73的低4位呢?也就是低2字節(jié),注意我們這里都是按4字節(jié)講的
8.其實不難分析,原來 ax 就是低2字節(jié)的意思,為了方便理解,這里畫了一張圖

9.其實說白了,rax是8字節(jié),eax是4字節(jié),ax是2字節(jié)
10.所以我們看到原本31D73,居然取了低2字節(jié)為1D73賦值給了eax
11.繼續(xù)F8執(zhí)行sub eax, edx

12.eax(1D73)加上edx(0)無任何變化
13.繼續(xù)F8執(zhí)行過sar ecx, 0x10, 這句的時候,又來到一個關(guān)鍵點

14.我們發(fā)現(xiàn)執(zhí)行后,ecx變成了3,這個3來源哪里呢?
15.分析得到這個3居然就是上面哈希ID的高2字節(jié)
16.額,他是如何得到的呢?其實仔細看到sar ecx, 0x10這個sar匯編指令的作用我們就知道原因了
17.有的同學不太明白sar的作用,我們百度看看

18.居然是位運算!,而且我們看到sar ecx, 0x10中的0x10換算成十進制就是16剛好右移動了16位(二進制位),是不是相當于把原本的低16位給移除了,原本的搞16位變成了現(xiàn)在的
低16位也就是3!
19.這里畫了一張圖便于分析

20.分析后,原來sar ecx, 0x10這句代碼是取哈希ID的高4字節(jié),而movzx eax, ax是取低4字節(jié)

偏移表達式
1.上面我們解密了ID分成了2個部分分別存在了rcx(哈希ID的高4字節(jié)),eax(哈希ID的低4字節(jié))
2.我們繼續(xù)執(zhí)行下,這里比較簡單就是偏移表達式的組合

3.能得到一個偏移表達式
[[0x00007FF7B68B74E0]+ecx8]+eax3*8]==哈希對象
4.原來我們的ecx和eax就是2個索引,分別從哈希ID分解得到
5.那么最終我們得出結(jié)論如圖

6.好了今天的哈希ID解密就講到這里,是不是很簡單呢?
7.感謝同學們的支持,感謝支持迪大學院
