कोड में यह हमारी कुंजी कहां मिलती है?
प्रक्रिया मॉनिटर का उपयोग करना, ईटीएल ईवेंट के लिए खुदाई करना जो कि स्टैक ट्रेस का पता लगाता है, हमें देता है:
"Frame","Module","Location","Address","Path"
...
"3","ntdll.dll","NtQueryValueKey + 0xa","0x7fbce17344a","C:\Windows\SYSTEM32\ntdll.dll"
"4","KERNELBASE.dll","LocalBaseRegQueryValue + 0x15d","0x7fbcb1a3e1d","C:\Windows\system32\KERNELBASE.dll"
"5","KERNELBASE.dll","RegQueryValueExW + 0xe9","0x7fbcb1a3c19","C:\Windows\system32\KERNELBASE.dll"
"6","ADVAPI32.dll","RegQueryValueExWStub + 0x1e","0x7fbcba412fe","C:\Windows\system32\ADVAPI32.dll"
"7","osk.exe","OSKSettingsManager::GetOskSetting + 0xc7","0x7f72356057f","C:\Windows\System32\osk.exe"
"8","osk.exe","OSKSettingsManager::Initialize + 0x6e","0x7f72355ffe2","C:\Windows\System32\osk.exe"
"9","osk.exe","OSKSettingsManager::GetOSKSettingsManager + 0x64","0x7f72355fee4","C:\Windows\System32\osk.exe"
"10","osk.exe","COskNativeHWNDHost::DetermineOSKWindowSizeAndLimits + 0x5a","0x7f72355d4fa","C:\Windows\System32\osk.exe"
"11","osk.exe","COskNativeHWNDHost::Initialize + 0xaa","0x7f72355d28e","C:\Windows\System32\osk.exe"
"12","osk.exe","PresentOSK + 0x112","0x7f723557882","C:\Windows\System32\osk.exe"
"13","osk.exe","wWinMain + 0x356","0x7f723557f16","C:\Windows\System32\osk.exe"
"14","osk.exe","operator new[] + 0x37a","0x7f723564b12","C:\Windows\System32\osk.exe"
"15","KERNEL32.DLL","BaseThreadInitThunk + 0x1a","0x7fbcd24298e","C:\Windows\system32\KERNEL32.DLL"
"16","ntdll.dll","RtlUserThreadStart + 0x1d","0x7fbce19e229","C:\Windows\SYSTEM32\ntdll.dll"
हम देख सकते हैं कि OSKSettingsManager::GetOskSetting
मूल्य पढ़ता है।
तो, वह हिस्सा कैसा दिखता है? क्या हम इसे डीबग कर सकते हैं?
WinDBG के साथ उस फ़ंक्शन को देखते हुए, यह उस रजिस्ट्री कुंजी को सही से पहले एक्सेस करता है 000007f7 23560517
।
osk!OSKSettingsManager::GetOskSetting:
...
000007f7`2356050e ff15440bfeff call qword ptr [osk!_imp_RegOpenKeyExW (000007f7`23541058)]
000007f7`23560514 448bd8 mov r11d,eax
000007f7`23560517 85c0 test eax,eax
000007f7`23560519 751f jne osk!OSKSettingsManager::GetOskSetting+0x82 (000007f7`2356053a)
000007f7`2356051b 488b0b mov rcx,qword ptr [rbx]
...
अब, यहां समस्या यह है कि जब मैं उस स्थान पर ब्रेकपॉइंट करने का प्रयास करता हूं तो मैं अब कुछ भी टाइप नहीं कर सकता क्योंकि osk.exe
इनपुट ड्राइवरों में खुद को जोड़ता है। यह आसानी से Altअपने कीबोर्ड पर एक संशोधक कुंजी को पकड़कर देखा जा सकता है , यह इसमें रोशनी करता है osk.exe
।
परिवर्धन या घटाव के लिए कोड के माध्यम से देखने पर, मुझे केवल 40
हेक्साडेसिमल के साथ कुछ होता है जो 64
दशमलव है। तो यह भी संख्या से संबंधित कुछ भी नहीं है।
यह चार cmp
(तुलना) निर्देशों में से एक में हो सकता है , लेकिन इसके लिए डिबगिंग जानकारी की आवश्यकता होगी। या यह एक उच्च अप फ़ंक्शन में पूरी तरह से हो सकता है, जिसे अधिक जांच की आवश्यकता होगी। लेकिन इनपुट क्षमताओं को खोए बिना इसे डिबग करने की क्षमता के बिना, यह एक बहुत ही मुश्किल काम है ...
लगता है कि सही स्थान खोजने के लिए डिबग केबल की आवश्यकता होगी क्योंकि जिस कंप्यूटर पर आप डिबग करते हैं वह अपनी इनपुट क्षमताओं को खो देता है, या डीबगिंग के ओवरहेड के कारण बहुत धीमा होता है। जैसा कि मेरे पास वर्तमान में 1943 पोर्ट के साथ लैपटॉप नहीं है, मैं इस डिबगिंग को स्वयं करने में असमर्थ हूं। यह ऐसा करने में सक्षम होगा, और हाँ, यह सचमुच आपके ओएस को फ्रीज कर देगा। एक आवेदन के बजाय एक ओएस डीबगिंग मजेदार है ... ^ ^
रुको, हमारे पास प्रतीकों तक पहुंच है! क्या हमें अपमानजनक कोड मिल सकता है?
OSKSettingsManager::ClearTransferKey(void)
OSKSettingsManager::GetOSKSettingsManager(OSKSettingsManager * *)
OSKSettingsManager::GetOskSetting(ulong,ulong *)
OSKSettingsManager::GetOskSetting(ulong,ulong *,int)
OSKSettingsManager::Initialize(void)
OSKSettingsManager::NotifyListeners(ulong,ulong)
OSKSettingsManager::RegisterListener(void (*)(ulong,ulong))
OSKSettingsManager::SQMStartupSettings(void)
OSKSettingsManager::SetOskSetting(ulong,ulong)
OSKSettingsManager::SetOskSetting(ulong,ulong,int)
OSKSettingsManager::_HandleUpdateAllListeners(void)
OSKSettingsManager::_KeepSettingValueInBounds(ulong,ulong *,int)
OSKSettingsManager::`scalar deleting destructor'(uint)
करीब से देखने पर, आप आक्रामक कार्य को नोटिस करेंगे:
OSKSettingsManager::_KeepSettingValueInBounds(ulong,ulong *,int)
यदि हम उस समारोह से गुजरते हैं तो हम पहली बार देखते हैं:
mov edi, edi
push ebp
mov ebp, esp
mov eax, [ebp+arg_4]
imul eax, 14h
cmp dword_4B7598[eax], 0
jz short loc_41BC36
ठीक है, यह कुछ तुलना करता है और फिर दूसरे स्थान पर कूदता है। वहां क्या है?
pop ebp
retn 8
इसलिए, यदि यह शर्त तय हो जाती है कि इसे कूदना चाहिए तो यह केवल कार्य छोड़ देगा और कुछ भी नहीं बदलेगा।
तो, हम यह कैसे करते हैं कि यह हमेशा फ़ंक्शन को छोड़ दे?
jz
निर्देश को एक निर्देश में बदलें jmp
जो हमेशा कूदता है, आप इसे सापेक्ष ऑफसेट पर पा सकते हैं 41BC10
। यदि आपका कार्यक्रम अलग-अलग ऑफसेट की गणना करता है, तो आपको यह जानना होगा कि यह 401000
एक आधार के रूप में उपयोग करता है इसलिए घटाना हमें पूर्ण ऑफसेट देता है 1AC10
।
कृपया ध्यान दें कि हेक्स संपादक में बदलना 74
( JZ
) काम नहीं करेगा E9
( JMP
)। आप एक हेक्स संपादक में ऐसा नहीं कर सकते हैं, आपको कुछ ऐसी चीज़ की आवश्यकता होगी जो कोड को डिसैम्बल करती है और रिजेक्ट करती है, लेकिन इसे ढूंढना आसान नहीं है। आमतौर पर पैच समुदाय में उपयोग किए जाने वाले ओलीबीडीजी, निष्पादन योग्य भी नहीं खोल सकते हैं।) और फिर भी, Microsoft छेड़छाड़ के खिलाफ अपने निष्पादन योग्य की रक्षा कर सकता है, क्योंकि इसे EULA के खिलाफ माना जा सकता है; इतनी अच्छी किस्मत!
मेह! यह कठिन है, मैं बस अपने माउस / आंखों / का उपयोग करके तेजी से टाइप करना चाहता हूं ...
आपको निश्चित रूप से डैशर की जांच करनी चाहिए जो ऑन-स्क्रीन कीबोर्ड की तुलना में तेज़ है। यह बस अपने माउस को अक्षरों की ओर ले जाकर काम करता है; क्षैतिज गति गति निर्धारित करती है और ऊर्ध्वाधर आंदोलन अक्षरों का चयन करते हैं। इसमें निर्मित एक शब्दकोश के साथ, बड़े होने की संभावना वाले अक्षरों को भी आकार दे सकता है, यह आपके आंदोलन से सीखने की भी कोशिश करता है जैसे कि गति और अक्षर वास्तव में आपके उपयोग के आदी हैं।
एक छवि एक हजार से अधिक शब्द बोलती है ...
बेशक यह छोटा है और वास्तव में तेज़ नहीं है क्योंकि यह एक उदाहरण है, लेकिन आप इसे अपनी स्क्रीन के दाईं ओर होने के लिए आकार बदल सकते हैं, ताकि यह आपकी स्क्रीन के साथ हस्तक्षेप न करे। यह आपको जितनी जल्दी हो सके टाइप करने की अनुमति देता है ...
यहाँ एक अच्छा उदाहरण है कि भविष्यवाणियाँ आपको किसी भी भाषा को और अधिक तेज़ी से टाइप करने की अनुमति कैसे देती हैं:
यह भी ध्यान दें कि दाईं ओर के अक्षरों को एक विशिष्ट क्रम में क्रमबद्ध किया गया है, जैसे कि प्रमुख दिशा (ऊपर, मध्य या नीचे) विभिन्न प्रकारों (लोअरकेस, अपरकेस, संख्या और विराम चिह्न) के बीच चयन करता है; और फिर इतनी बड़ी दिशा के भीतर, आपकी छोटी सी दिशा AZ, az, 0-9 और इसी तरह के बीच का चयन करेगी। मैंने अतीत में इसका उपयोग किया है और वास्तव में इस बात से चकित था कि अन्य प्रतियोगियों की तुलना में यह कितना धाराप्रवाह है ...
यह भी ध्यान दें कि डैशर में कुछ कॉन्फ़िगरेशन है, इसलिए आप कुछ ऐसा समायोजित करने में सक्षम हो सकते हैं जो आपको पसंद नहीं है।