Kodumuzun neresinde anahtarımızı bulur?
Process Monitor'ü kullanarak, değer yığını izlemesinin bize verdiği ETL olayını incelemek bize şunları sağlar:
"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"
Bunun OSKSettingsManager::GetOskSetting
değeri okuduğunu görebiliriz .
Peki, bu kısım neye benziyor? Hata ayıklayabilir miyiz?
WinDBG ile bu işleve bakıldığında, bu kayıt defteri anahtarına hemen erişir 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]
...
Şimdi, buradaki sorun, o konumda kesme noktası denediğimde artık hiçbir şey yazamadığım osk.exe
için giriş sürücülerine kendini ekliyor. Bu, Altklavyenizdeki gibi bir değiştirici tuşunu basılı tutarak kolayca görülebilir , bu yanar osk.exe
.
Toplama veya çıkarma koduna bakarak, sadece ondalık olan 40
onaltılık bir şey olduğunu görüyorum 64
. Yani bu sayı ile ilgili bir şey değil.
Dört cmp
(karşılaştırma) talimattan birinde olabilir , ancak hata ayıklama bilgileri gerektirebilir. Ya da daha fazla araştırma gerektiren daha yüksek bir işlevde birlikte olabilir. Ancak, giriş yeteneklerini kaybetmeden hata ayıklama yeteneği olmadan, bu çok zor bir şeydir ...
Hata ayıkladığınız bilgisayar giriş özelliklerini kaybettiğinden veya hata ayıklama yükü nedeniyle çok yavaş olduğundan, doğru konumu bulmanın bir hata ayıklama kablosu gerektireceği anlaşılıyor. Şu anda 1943 bağlantı noktasına sahip bir dizüstü bilgisayarım olmadığından, bu hata ayıklamayı kendim yapamıyorum. Bunu yapabilir ve evet, işletim sisteminizi tam anlamıyla dondurur. Bir uygulama yerine bir işletim sisteminde hata ayıklamak eğlencelidir ... ^^
Bekleyin, sembollere erişimimiz var! Sorunlu kodu bulabilir miyiz?
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)
Daha yakından baktığınızda, rahatsız edici işlevi göreceksiniz:
OSKSettingsManager::_KeepSettingValueInBounds(ulong,ulong *,int)
Bu işlevden geçersek, önce şunu görürüz:
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
Tamam, bu bir şeyi karşılaştırır ve sonra başka bir yere atlar. Orada ne var?
pop ebp
retn 8
Bu nedenle, koşulun atlaması gerektiğine karar verirse, işlevi terk eder ve hiçbir şeyi değiştirmez.
Peki, her zaman işlevi bırakmasını nasıl sağlayabiliriz?
Talimatı her zaman atlamayı yapan jz
bir jmp
talimatla değiştirin, göreli ofsette bulabilirsiniz 41BC10
. Programınızın ofsetleri farklı hesaplaması durumunda, 401000
temel olarak kullandığını bilmeniz gerekir, böylece çıkarma bize mutlak ofseti verir 1AC10
.
Bunu değiştirmenin unutmayın 74
( JZ
Hex editörü) E9
( JMP
) olacak değil işi. Bunu onaltılık bir editörde yapamazsınız, kodu parçalarına ayıran ve yeniden birleştiren bir şeye ihtiyacınız olacak, ancak bunun bulunması kolay olmayabilir (örneğin, insanların gerçekten ödediği IDA Professional, uygun c kodu veya yürütülebilir bir dosya oluşturamaz. Yama topluluğunda yaygın olarak kullanılan OllyDBG, yürütülebilir dosyayı bile açamaz.). Ve sonra bile, Microsoft yürütülebilir dosyasını kurcalamaya karşı koruyor olabilir, çünkü bu EULA'ya karşı düşünülebilir; iyi şanslar!
Meh! Bu zor, sadece faremi / gözlerimi kullanarak hızlı yazmak istiyorum ...
Bir Ekran Klavyesinden çok daha hızlı olan Dasher'i kesinlikle kontrol etmelisiniz . Sadece farenizi harflere doğru hareket ettirerek çalışır; yatay hareket hızı belirler ve dikey hareket harfleri seçer. Dahili bir sözlükle, en büyük harfleri daha büyük olacak şekilde boyutlandırabilir, ayrıca hızınızdan ve harflerin kullanımınıza gerçekten alışacak şekilde hareketinizden öğrenmeye çalışır.
Bir görüntü bin kelimeden fazla konuşuyor ...
Tabii ki bu oldukça küçük ve örnek olarak gerçekten hızlı değil, ancak ekranınızı sağ tarafta olmayacak şekilde yeniden boyutlandırabilirsiniz, böylece ekranınıza müdahale etmez. Bu mümkün olduğunca hızlı yazmanızı sağlar ...
Tahminlerin herhangi bir dili daha hızlı yazmanıza nasıl izin verdiğine dair iyi bir örnek:
Ayrıca sağdaki harflerin belli bir sıraya göre sıralandığını, böylece ana yönün (yukarı, orta veya aşağı) farklı türler (küçük harf, büyük harf, sayı ve noktalama işaretleri) arasında seçim yapmasını unutmayın; ve sonra böyle büyük bir yönde, küçük yönünüz AZ, az, 0-9 ve diğerleri arasında seçim yapar. Bunu geçmişte kullandım ve aslında bunun diğer rakiplerle ne kadar akıcı olduğunu görünce şaşırdım ...
Ayrıca Dasher'in bazı yapılandırmaya sahip olduğunu unutmayın, bu nedenle hoşunuza gitmeyen bir şeyi ayarlayabilirsiniz.