Trường hợp trong mã nó tìm thấy khóa của chúng tôi?
Sử dụng Trình giám sát quy trình, đào sâu vào sự kiện ETL đọc ra dấu vết ngăn xếp giá trị mang lại cho chúng ta:
"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"
Chúng ta có thể thấy rằng OSKSettingsManager::GetOskSetting
đọc ra giá trị.
Vì vậy, phần đó trông như thế nào? Chúng ta có thể gỡ lỗi không?
Nhìn vào chức năng đó với WinDBG, nó truy cập khóa đăng ký đó ngay trước đó 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]
...
Bây giờ, vấn đề ở đây là khi tôi cố gắng dừng điểm tại vị trí đó, tôi không còn có thể gõ bất cứ thứ gì vì osk.exe
tự thêm vào trình điều khiển đầu vào. Điều này có thể dễ dàng được nhìn thấy bằng cách giữ một phím bổ trợ như Alttrên bàn phím của bạn, nó sẽ sáng lên osk.exe
.
Nhìn qua mã để thêm hoặc trừ, tôi chỉ thấy điều gì đó xảy ra với 40
thập lục phân là 64
số thập phân. Vì vậy, điều đó cũng không có gì liên quan đến số lượng.
Nó có thể là một trong bốn cmp
hướng dẫn (so sánh), nhưng điều đó sẽ yêu cầu thông tin gỡ lỗi. Hoặc nó có thể xảy ra trong một chức năng cao hơn hoàn toàn, sẽ cần điều tra nhiều hơn. Nhưng không có khả năng gỡ lỗi mà không mất khả năng nhập liệu, đây là một việc rất khó thực hiện ...
Có vẻ như việc tìm đúng vị trí sẽ yêu cầu cáp gỡ lỗi vì máy tính mà bạn gỡ lỗi bị mất khả năng nhập liệu hoặc quá chậm do quá trình gỡ lỗi. Vì hiện tại tôi không có máy tính xách tay có cổng 1943, tôi không thể tự mình sửa lỗi này. Nó sẽ có thể làm điều này, và vâng, nó sẽ đóng băng hệ điều hành của bạn. Gỡ lỗi một hệ điều hành thay vì một ứng dụng rất thú vị ... ^^
Chờ đã, chúng ta có quyền truy cập vào các biểu tượng! Chúng tôi có thể tìm thấy mã vi phạm?
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)
Nhìn kỹ hơn, bạn sẽ nhận thấy chức năng vi phạm:
OSKSettingsManager::_KeepSettingValueInBounds(ulong,ulong *,int)
Nếu chúng ta đi qua chức năng đó, trước tiên chúng ta sẽ thấy:
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
Được rồi, điều này so sánh một cái gì đó và sau đó nhảy đến một vị trí khác. Có gì ở đó
pop ebp
retn 8
Vì vậy, nếu điều kiện quyết định rằng nó phải nhảy, nó sẽ chỉ rời khỏi chức năng và không thay đổi bất cứ điều gì.
Vì vậy, làm thế nào để chúng ta làm cho nó luôn luôn rời khỏi chức năng?
Thay đổi jz
hướng dẫn thành một jmp
hướng dẫn luôn luôn thực hiện bước nhảy, bạn có thể tìm thấy nó ở độ lệch tương đối 41BC10
. Trong trường hợp chương trình của bạn tính toán bù đắp khác nhau, bạn cần biết rằng nó sử dụng 401000
làm cơ sở để việc trừ đi mang lại cho chúng tôi sự bù đắp tuyệt đối 1AC10
.
Xin lưu ý rằng việc thay đổi 74
( JZ
) trong trình soạn thảo hex thành E9
( JMP
) sẽ không hoạt động. Bạn không thể làm điều này trong trình soạn thảo hex, bạn sẽ cần một cái gì đó có thể tháo rời và lắp lại mã nhưng điều đó không nhất thiết phải tìm thấy (ví dụ: IDA Professional mà mọi người thực sự trả tiền, không thể tạo mã c phù hợp hoặc có thể thực thi được. OllyDBG, thường được sử dụng trong cộng đồng vá lỗi, thậm chí không thể mở tệp thực thi.). Và thậm chí, Microsoft có thể bảo vệ khả năng thực thi của mình trước sự giả mạo, bởi vì điều này có thể được xem xét chống lại EULA; vậy thì chúc may mắn!
Meh! Điều này thật khó, tôi chỉ muốn gõ nhanh bằng chuột / mắt / ...
Bạn chắc chắn nên kiểm tra Dasher nhanh hơn Bàn phím trên màn hình. Nó chỉ đơn giản hoạt động bằng cách di chuyển chuột của bạn về phía các chữ cái; chuyển động ngang xác định tốc độ và chuyển động dọc chọn các chữ cái. Với một từ điển được xây dựng, nó thậm chí có thể kích thước các chữ cái có khả năng lớn hơn, nó cũng cố gắng học hỏi từ chuyển động của bạn sao cho tốc độ và các chữ cái thực sự quen với việc sử dụng của bạn.
Một hình ảnh nói hơn một ngàn từ ...
Tất nhiên, điều này khá nhỏ và không thực sự nhanh như một ví dụ, nhưng bạn có thể thay đổi kích thước của nó ở bên phải màn hình để nó không cản trở màn hình của bạn. Điều này cho phép bạn gõ nhanh nhất có thể ...
Dưới đây là một ví dụ hay về cách dự đoán cho phép bạn nhập bất kỳ ngôn ngữ nào nhanh hơn:
Cũng lưu ý rằng các chữ cái ở bên phải được sắp xếp theo thứ tự cụ thể, sao cho hướng chính (lên, giữa hoặc xuống) chọn giữa các loại khác nhau (chữ thường, chữ hoa, số và dấu chấm câu); và sau đó trong hướng chính như vậy, hướng nhỏ của bạn sẽ chọn giữa AZ, az, 0-9, v.v. Tôi đã sử dụng điều này trong quá khứ và thực sự ngạc nhiên bởi mức độ thông thạo này so với các đối thủ khác ...
Cũng lưu ý rằng Dasher có một số cấu hình, vì vậy bạn có thể điều chỉnh thứ gì đó bạn không thích.