6
A
回答
1
如果你在任何ASM好,也許這會有所幫助:
JNE(不相等則跳轉) - 跳轉,如果零標誌爲NZ(NotZero)
_RTC_CheckEsp:
004C8690 jne esperror (4C8693h)
004C8692 ret
esperror:
004C8693 push ebp
004C8694 mov ebp,esp
004C8696 sub esp,0
004C8699 push eax
004C869A push edx
004C869B push ebx
004C869C push esi
004C869D push edi
004C869E mov eax,dword ptr [ebp+4]
004C86A1 push 0
004C86A3 push eax
004C86A4 call _RTC_Failure (4550F8h)
004C86A9 add esp,8
004C86AC pop edi
004C86AD pop esi
004C86AE pop ebx
004C86AF pop edx
004C86B0 pop eax
004C86B1 mov esp,ebp
004C86B3 pop ebp
004C86B4 ret
004C86B5 int 3
004C86B6 int 3
004C86B7 int 3
004C86B8 int 3
004C86B9 int 3
004C86BA int 3
004C86BB int 3
004C86BC int 3
004C86BD int 3
004C86BE int 3
004C86BF int 3
5
那麼一點點彙編程序的檢查將其發送出去
0044EE35 mov esi,esp
0044EE37 push 3039h
0044EE3C mov ecx,dword ptr [ebp-18h]
0044EE3F add ecx,70h
0044EE42 mov eax,dword ptr [ebp-18h]
0044EE45 mov edx,dword ptr [eax+70h]
0044EE48 mov eax,dword ptr [edx+0Ch]
0044EE4B call eax
0044EE4D cmp esi,esp
0044EE4F call @ILT+6745(__RTC_CheckEsp) (42BA5Eh)
有兩條注意事項。首先在0x44ee35註釋它將esp的當前值存儲到esi。
然後,函數調用完成後,它執行esp和esi之間的cmp。他們現在應該都是一樣的。如果他們不是,那麼有人要麼兩次解開堆疊,要麼沒有解開它。
的_RTC_CheckEsp功能如下:
_RTC_CheckEsp:
00475A60 jne esperror (475A63h)
00475A62 ret
esperror:
00475A63 push ebp
00475A64 mov ebp,esp
00475A66 sub esp,0
00475A69 push eax
00475A6A push edx
00475A6B push ebx
00475A6C push esi
00475A6D push edi
00475A6E mov eax,dword ptr [ebp+4]
00475A71 push 0
00475A73 push eax
00475A74 call _RTC_Failure (42C34Bh)
00475A79 add esp,8
00475A7C pop edi
00475A7D pop esi
00475A7E pop ebx
00475A7F pop edx
00475A80 pop eax
00475A81 mov esp,ebp
00475A83 pop ebp
00475A84 ret
正如你可以看到它檢查的第一件事是較早比較的結果是否是「不等於」即ESI = ESP!如果是這種情況,那麼它跳轉到失敗代碼。如果它們相同,那麼函數只是返回。
+0
不錯,我忘記了調用代碼... – 2010-10-12 12:56:27
相關問題
- 1. 如何實現
- 2. 如何在Delphi中實現XIRR實現?
- 3. 如何實現與實體
- 4. 如何實現Tesseract.Xamarin?
- 5. 如何實現IXunitTestCollectionFactory
- 6. 如何實現validateToolbarItem(_ :)?
- 7. 如何實現FlowExecutionExceptionHandler
- 8. 如何實現SOAP?
- 9. 如何實現`prepareForReuse`?
- 10. 如何實現glob.glob
- 11. jQuery如何實現[]
- 12. 如何實現documentlistener
- 13. 如何實現GKTurnBasedMatchOutcomeCustomRange?
- 14. ImageScaleToFit - 如何實現?
- 15. 如何實現IAsyncOperationWithProgress
- 16. 如何實現setOnItemClickListener?
- 17. updateInteractiveTransition如何實現?
- 18. 如何實現saveFragmentInstanceState?
- 19. 如何實現highchart
- 20. 如何實現zmsg_recv_nowait?
- 21. 如何實現SSAS
- 22. 如何實現Excutors
- 23. \ b如何實現?
- 24. 如何實現NavigationDrawer
- 25. 如何實現PHPUnit
- 26. 如何實現getchar()?
- 27. 如何實現viewpager
- 28. 如何實現JEE6
- 29. 如何實現IDEA?
- 30. 如何實現AAShareBubles
爲什麼這麼多'int 3',是不是一個足夠? – ollydbg 2010-10-12 13:14:08
「int 3」是一個字節,它是斷點中斷。因此,該字節值傳統上用作函數之間的填充。 (當然是x86)。請注意,它無法訪問,實際上零就足夠了。 – MSalters 2010-10-12 13:19:42
他們的理由是,如果在int 3s中發生無效跳轉,那麼代碼將立即中斷,您可以輕鬆看到發生了無效跳轉。 – Goz 2010-10-13 07:40:49