逆向過程中通過會遇到脫殼的過程,而脫殼的方式有有多重,如果手工脫殼,需要找到oep。
所謂「兩次記憶體斷點法尋找oep」,按照《加密與解密*第三版》上的解釋來說,就是這樣的。
一般的外殼會依次對.text、.rdata、.data、.rsrc區塊進行解壓(解密)處理,所以,可以先在.rdata、.data等區塊下記憶體訪問斷點,中斷後,此時**已解壓,接著再對**段(.text)下記憶體訪問斷點,即可到達oep。
我個人的理解是所有節區都解壓完畢之後,然後程式的執行流會轉移到oep,這個時候自然回去訪問相應的**,所以就會斷下;實際操作的時候還需要多乙個跟蹤步驟。
這裡以乙個upx加殼的程式為例:
首先od引導程式,alt + m開啟記憶體對映檢視,找到主模組的資料段或者資源段f2下訪問中斷,如圖。
然後f9執行程式,會自動斷下,再次alt + m開啟記憶體對映檢視,找到**段f2下訪問中斷,如圖。
之後f9執行,會再次斷下。這個時候仍然alt + m開啟記憶體對映檢視,觀察一下主模組的區塊。
1234567
891011
0040ba75 8d8430 58b00000 leaeax,
dword
ptrds:[
eax+
esi+b058]
0040ba7c 01f3 add
ebx,
esi0040ba7e
50push
eax0040ba7f 83c7 08
addedi,8
0040ba82 ff96 94b00000 call
dword
ptrds:[
esi+b094]
; kernel32.loadlibrarya
0040ba88
95xchg
eax,
ebp0040ba89 8a07 moval,
byte
ptrds:[
edi]
0040ba8b
47inc
edi0040ba8c 08c0 oral,
al0040ba8e ^ 74 dc je
short 0040ba6c
0040ba90 89f9 mov
ecx,
edi
memory map, 專案 18位址=00401000
大小=00008000 (32768.)
屬主=upxdemo 00400000
區段=upx0
型別=映像 01001002
訪問=r
初始訪問=rwe
memory map, 專案 19看到upx0和upx1到底哪乙個是真實的**塊呢?需要試一下。對於upx0,va的範圍是00401000~00409000,對於upx1,va的範圍是00409000~0040c000。可以在od的命令列中執行tc eip<00409000,按enter執行,發現來到了oep了。(同樣可以測試tc eip<0040c000,但得到的不是oep)。位址=00409000
大小=00003000 (12288.)
屬主=upxdemo 00400000
區段=upx1
包含=sfx,**
型別=映像 01001002
訪問=r
初始訪問=rwe
1234567
891011
1213
1415
1617
1819
2021
00401120附:55push
ebp00401121 8bec mov
ebp,
esp00401123 6a ff push-1
00401125
68 b8504000 push 004050b8
0040112a
68 ec1d4000 push 00401dec
0040112f
64:a1 00000000
moveax
,dword
ptrfs:[
0]00401135
50push
eax0040113664:
8925
0000000>mov
dword
ptrfs:[
0],esp
0040113d 83ec 58
subesp,58
00401140
53push
ebx00401141
56push
esi00401142
57push
edi00401143
8965 e8 mov
dword
ptrss:[
ebp-18]
,esp
00401146 ff15 28504000
call
dword
ptrds:[
405028
]; kernel32.getversion
0040114c 33d2 xor
edx,
edx0040114e 8ad4 movdl,
ah00401150
8915
14854000
movdword
ptrds:[
408514],
edx00401156 8bc8 mov
ecx,
eax00401158
81e1 ff000000 and
ecx,0ff
0040115e 890d 10854000
movdword
ptrds:[
408510],
ecx00401164 c1e1 08
shlecx
,8
tc (trace in till condition)跟蹤進入直到條件
更多參考:
兩次記憶體斷點法尋找OEP
逆向過程中通過會遇到脫殼的過程,而脫殼的方式有有多重,如果手工脫殼,需要找到oep。所謂 兩次記憶體斷點法尋找oep 按照 加密與解密 第三版 上的解釋來說,就是這樣的。一般的外殼會依次對.text rdata data rsrc區塊進行解壓 解密 處理,所以,可以先在.rdata data等區塊下...
兩次過 Lintcode 75 尋找峰值
你給出乙個整數陣列 size為n 其具有以下特點 假定p是峰值的位置則滿足a p a p 1 且a p a p 1 返回陣列中任意乙個峰值的位置。給出陣列 1,2,1,3,4,5,7,6 返回1,即數值 2 所在位置,或者6,即數值 7 所在位置.time complexity o logn 普通遍...
Linux下C語言記憶體兩次釋放問題
在linux中,c語言程式設計的永遠讓人最頭痛的問題還是記憶體管理了。特別在記憶體釋放上面,其中有乙個標準就是記憶體一定要釋放,否則就會造成記憶體洩露問題。但是釋放的時候也要隨時注意,因為釋放一次是ok的,但是同一塊記憶體釋放2次的話就是錯誤的了。道理大家很多人都懂,但是實際用起來的時候就會出很多頭...