我看了ljtt的那篇文章,於是跟著作了,但卻不成功,於是我也跟蹤了一下,
發現程式在015F:00408A2F處有一call走過之後就會推出,於是用F8跟進
0040782F 55 push
ebp
00407830 8BEC mov ebp,
esp
00407832 83EC4C sub esp, 4Ch
00407835 53 push
ebx
00407836 56 push
esi
00407837 57 push
edi
00407838 C745C800000000 mov dword ptr [ebp-38h], 0
0040783F 833D7C30410000 cmp ds:dword_41307C, 0
<-判斷此處是否為0
00407846 0F843B010000 jz loc_407987
<-跳就完了
0040784C C745D0724102CF mov [ebp+var_30], 0CF024172h
00407853 8175D035247683 xor [ebp+var_30], 83762435h
由於後面的程式還會判斷41307C是否為0,所以我把0040783F處的程式碼改為
0040783F C6057C30410001 mov ds:dword_41307C, 1
正好也是7個位元組,這樣就可以對付以後的判斷了。另外
004079FD C705183041004C9B4000 MOV DWORD PTR [00413018],00409B4C
的程式碼和
00408F28 C705183041004C9B4000 MOV DWORD PTR [00413018],00409B4C
一樣於是我把它也改為
C705BE324100D3000000 MOV DWORD PTR [004132BE],000000D3
否則照樣無法執行。
被mh-dog加殼的程式的那個用來還原程式資料的“密匙”
放.data的某處(在notepadmh.exe中為123FFh處),只要
一個位元組即可,而源程式的oep,放在.gdata的+18h處的4
個位元組(dj-dog加的殼的oep在.gdata的+10h處)。
我還沒找出好方法來判斷那個“密匙”存放的地方。
最後,我要感謝ljtt的無私奉獻!
ps:ljtt,你能把如何反推出“密匙”的方法詳細的講一下嗎?
我比較笨,怎麼跟都看不懂演算法。