<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Большой брейкпоинт page exceptions]]></title><description><![CDATA[<p dir="auto">Наткнувшись на тему вспомнил, что  не все написал. В прошлом посте блога рассматривал бряк через DBVM.  К сожалению, та версия dbvm из поста блога пропускала очень много инструкций и практически смысла нет её юзать.  Например она определяла 16 инструкций, когда их было несколько тысяч, т.е. например 500 оффестов и на каждой по 10 инструкций. По DBVM надо, конечно, писать Дарк Байту, но желания нет.</p>
<p dir="auto">Так вот. Не только с DBVM можно ставить бряки на участок памяти.  Есть еще тип  брейкпоинтов <strong>page exceptions</strong>. О нем давно-давно известно и он как на ладони, но почему-то я пропустил его, когда искал оффсеты в структурах<br />
<img src="/assets/uploads/files/1680955314830-669b8da6-fea1-487c-9762-475e1443b7fa-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="669b8da6-fea1-487c-9762-475e1443b7fa-изображение.png" class=" img-fluid img-markdown" /><br />
С ним можно работать с lua и без. Ловит огромное количество инструкций. Желательно мощное железо, т.к. игра скорее всего будет очень тормозить по 2-5 fps. Но на короткий запуск сойдет. 5 секунд и достаточно для снятия логов. На пару действий в игре тоже сойдет: выстрел или пермещение персонажа, прыжок или вообще ничего не делаем просто снимаем логи.</p>
<ol>
<li>способ поставить бряк из окна памяти. Подопытная программа "<strong>Tutorial-x86_64.exe</strong>"<br />
<img src="/assets/uploads/files/1680955344289-05a2e3e5-6eb5-4271-bd6f-8b7549cb949f-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="05a2e3e5-6eb5-4271-bd6f-8b7549cb949f-изображение.png" class=" img-fluid img-markdown" /><br />
<img src="/assets/uploads/files/1680955356481-b856f5db-cc98-43da-bfa4-a1df4e3a2df4-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="b856f5db-cc98-43da-bfa4-a1df4e3a2df4-изображение.png" class=" img-fluid img-markdown" /><br />
<img src="/assets/uploads/files/1680955367073-dac22f25-9838-44f8-b695-db12e06a689c-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="dac22f25-9838-44f8-b695-db12e06a689c-изображение.png" class=" img-fluid img-markdown" /><br />
Здесь видно, что размер 720 байт</li>
</ol>
<p dir="auto">Логи из окна инструкций CE</p>
<blockquote>
<p dir="auto">1000259AE - 48 8B 00  - mov rax,[rax]<br />
1000259C3 - 48 8B 00  - mov rax,[rax]<br />
10001D70C - F7 40 50 10000000 - test [rax+50],00000010<br />
10001D734 - 48 8B 00  - mov rax,[rax]<br />
1000AAB40 - 48 83 78 70 00 - cmp qword ptr [rax+70],00<br />
10001D809 - F7 40 50 10000000 - test [rax+50],00000010<br />
10000D452 - 48 8B 0A  - mov rcx,[rdx]<br />
10005AE70 - 83 40 68 01 - add dword ptr [rax+68],01<br />
1000A4CF5 - F7 40 50 10000000 - test [rax+50],00000010<br />
1000A4EB8 - 48 8B 00  - mov rax,[rax]<br />
10000DA76 - 4C 8B 32  - mov r14,[rdx]<br />
10005AE90 - 83 68 68 01 - sub dword ptr [rax+68],01<br />
100139C13 - F7 40 50 10000000 - test [rax+50],00000010<br />
100139C32 - 48 8B 48 60  - mov rcx,[rax+60]<br />
100139C46 - 48 8B 40 60  - mov rax,[rax+60]<br />
10009CEFB - 48 8B 00  - mov rax,[rax]<br />
100098850 - 8B 80 80010000  - mov eax,[rax+00000180]<br />
1000A4E81 - 81 88 00010000 00200000 - or [rax+00000100],00002000<br />
1000A4E98 - 48 8B 00  - mov rax,[rax]<br />
1000AD685 - F7 40 50 08000000 - test [rax+50],00000008<br />
10009BFB8 - 8B 40 50  - mov eax,[rax+50]<br />
10009816F - F7 40 50 08000000 - test [rax+50],00000008<br />
100098236 - 48 8B 00  - mov rax,[rax]<br />
10001BECE - 48 8B 00  - mov rax,[rax]<br />
100098419 - F7 40 50 08000000 - test [rax+50],00000008<br />
1000A2A28 - 48 8B 00  - mov rax,[rax]<br />
1000A29F4 - 48 8B 12  - mov rdx,[rdx]<br />
1000A4CC8 - 81 A0 00010000 FFDFFFFF - and [rax+00000100],FFFFDFFF<br />
10001CC58 - F7 40 50 10000000 - test [rax+50],00000010<br />
10000DB13 - 48 8B 00  - mov rax,[rax]<br />
100095C65 - 48 8B 48 60  - mov rcx,[rax+60]<br />
100095C75 - 48 8B 40 60  - mov rax,[rax+60]<br />
10001CB04 - F7 40 50 10000000 - test [rax+50],00000010<br />
10009BF35 - 8B 40 50  - mov eax,[rax+50]<br />
10009932D - 48 8B 00  - mov rax,[rax]<br />
10001F5C8 - F7 40 50 08000000 - test [rax+50],00000008<br />
10001F638 - 8B 40 50  - mov eax,[rax+50]<br />
100021803 - F7 40 50 08000000 - test [rax+50],00000008<br />
100021923 - F7 40 50 08000000 - test [rax+50],00000008<br />
10001ACB1 - 8B 41 50  - mov eax,[rcx+50]<br />
10001B850 - 48 8B 48 60  - mov rcx,[rax+60]<br />
10001B85C - 48 8B 40 60  - mov rax,[rax+60]<br />
1000A2AC0 - 48 8B 00  - mov rax,[rax]<br />
10013A2A3 - F7 40 50 10000000 - test [rax+50],00000010<br />
10013A336 - 48 8B 00  - mov rax,[rax]<br />
100098AC4 - 4C 8B 02  - mov r8,[rdx]<br />
100098AD9 - 48 8B 00  - mov rax,[rax]<br />
10013A35C - 48 8B 00  - mov rax,[rax]<br />
10008A0C1 - 48 8B 00  - mov rax,[rax]<br />
1000192A9 - 48 8B 12  - mov rdx,[rdx]<br />
1000A3B99 - 48 8B 12  - mov rdx,[rdx]<br />
100096636 - 8B 82 D0010000  - mov eax,[rdx+000001D0]<br />
10008A0ED - 48 8B 00  - mov rax,[rax]<br />
100097DF9 - 48 8B 00  - mov rax,[rax]<br />
1000A4325 - 81 B8 80010000 FF7F0000 - cmp [rax+00000180],00007FFF<br />
1000A6218 - F7 40 50 10000000 - test [rax+50],00000010<br />
1000A6240 - 48 8B 00  - mov rax,[rax]<br />
1000A6254 - 48 8B 00  - mov rax,[rax]<br />
100097727 - 48 8B 48 60  - mov rcx,[rax+60]<br />
100097733 - 48 8B 40 60  - mov rax,[rax+60]<br />
10018E4D9 - F7 40 50 10000000 - test [rax+50],00000010<br />
1000AA369 - F7 80 58010000 00400000 - test [rax+00000158],00004000<br />
1000AA394 - 48 8B 00  - mov rax,[rax]<br />
1000AA600 - 48 83 B8 B0020000 00 - cmp qword ptr [rax+000002B0],00<br />
100097E3B - 48 8B 00  - mov rax,[rax]<br />
1000A74A9 - 48 8B 00  - mov rax,[rax]</p>
</blockquote>
<ol start="2">
<li>Способ через Lua (подробнее в документации)</li>
</ol>
<pre><code>debug_setBreakpoint(structure_address, sizeMemory, bptAccess, bpmException, onBreakpoint)
</code></pre>
<p dir="auto">P.S. Я написал про два способа установки брейкпоинта на множество адресов без DBVM. Вручную можно ставить такие брейкпоинты, но дальше уже кропотливый просмотр на предмет того чем это может помочь. Это может помочь определить типы данных и помочь прикинуть размер структуры, а также найти активные оффсеты. Можно на Lua автоматически определять активные offsets по базовому адресу структуры и эту структуру создать и заполнить в dessectData. Если будет время напишу скрипт.</p>
]]></description><link>https://celua.ru/topic/69/большой-брейкпоинт-page-exceptions</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 10:52:18 GMT</lastBuildDate><atom:link href="https://celua.ru/topic/69.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 08 Apr 2023 12:04:06 GMT</pubDate><ttl>60</ttl></channel></rss>