-
Постов
2 999 -
Зарегистрирован
-
Победитель дней
129
Тип контента
Профили
Форумы
Загрузки
Блоги
Весь контент MasterGH
-
Я не знаю деталей, но во всех официальных шейдрерах постэффектов есть установки //...Subshader {Pass { ZTest Always Cull Off ZWrite Off Fog { Mode off }//...}//...Официального объяснения я не нашел. На форумах пишут, что это нужно для работы Graphics.Blit, которая работает для пост эффекта в следующей функции public void OnRenderImage (RenderTexture src, RenderTexture dest){//... RenderTexture scaled = RenderTexture.GetTemporary (horizontalResolution, verticalResolution); scaled.filterMode = FilterMode.Point; Graphics.Blit (src, scaled, material); Graphics.Blit (scaled, dest); RenderTexture.ReleaseTemporary (scaled);}ZTest может быть установлен в Less | Greater | LEqual | GEqual | Equal | NotEqual | AlwaysZTest позволяет рисовать такие примеры: Для интересующихся шейдеры примеров можно найти здесь
-
Вроде так Shader "AlpacaSound/RetroPixel3"{ Properties { _Br0 ("Brightness Range 0", Range (0, 1.0)) = 0.3 _Br1 ("Brightness Range 1", Range (0.0, 1.0)) = 0.6 _Color0 ("Color 0", Color) = (0.00, 0.00, 0.00, 1.0) _Color1 ("Color 1", Color) = (0.14, 0.14, 0.14, 1.0) _Color2 ("Color 2", Color) = (0.29, 0.29, 0.29, 1.0) _MainTex ("", 2D) = "white" {} } SubShader { Lighting Off ZTest Always Cull Off ZWrite Off Fog { Mode Off } Pass { CGPROGRAM #pragma exclude_renderers flash #pragma vertex vert_img #pragma fragment frag #pragma fragmentoption ARB_precision_hint_fastest #include "UnityCG.cginc" uniform fixed4 _Color0; uniform fixed4 _Color1; uniform fixed4 _Color2; uniform fixed _Br0; uniform fixed _Br1; uniform sampler2D _MainTex; fixed4 frag (v2f_img i) : COLOR { fixed3 original = tex2D (_MainTex, i.uv).rgb; fixed brightest = (original.r + original.g + original.b)/3.0; fixed4 col = fixed4 (0,0,0,0); if (brightest < _Br0) col = _Color0; else if (brightest > _Br0 && brightest < _Br1) col = _Color1; else if (brightest > _Br1) col = _Color2; return col; } ENDCG } } FallBack "Diffuse"}
-
Задали на работе написать пост эффект. Кому интересно, могут помочь. Берем каждый пиксель за кадр рендренига и анализируем его яркость - 30% темных по яркости делаем черными - 30% - сиреневым цветом - след. 40% - белыми Если это делать CPU, то это очень медленно. Поэтому надо через шейдер писельный. Вот пример, когда цвета подбираются по функции distance(), а не по яркости Я сегодня колупался с шейдерами, пока не решил. Вот такой интересной штукой я занимаюсь на работе.
-
Выходит ошибка с "aobscan(address0, 89 91 F4 04 00 00)" в связке с зареганной меткой address0. Здесь три варианта 1. Сигна "89 91 F4 04 00 00" не уникальная и встречается много раз. Поэтому её надо увеличить на n-количество байт (смотри отладчик) 2. aobscan находит неверный адрес даже по уникальной сигне "89 91 F4 04 00 00" 3. Адрес по сигне находится правильный, но какие-то другие баги...
-
1. Останавливаешь процесс 2. Включаешь скрипт 3. Берешь любой 64 разрядный дизассемблер, лучше IDA 4. Идешь на адрес "address0", на адрес "newMem" и проверяешь все ли инструкции правильные. Если неправильные, то значит CE ассемблирует с ошибкой. Если правильно, то идешь в дизассемблер в CE на адрес address0 ставишь бряк F5 и идешь по шагам до выхода на returnHere. Если ошибок не было и в [rcx+000004F4] действительно записалось целое десятичное 999, то инъекция ассемблирована верно и причину нужно будет искать в чем-то другом. Можешь попробовать поставить другой тип отладчика в настройках CE (или попробовать это сделать сначала)
-
Господа, прекращаем оффтопить, иначе буду наказывать. Никаких тегов оффтопа нет и не было. Если у одного пользователя вылетает игра, а у других нет, то это очень странно. Автор темы, нужно максимально подробно описать действия, которые приводят к вылету игры. Иначе я закрою тему.
-
Ну, тут надо пробовать искать lua код с шифрованием и дешифрованием. Вот я нарыл в тырнете Вот так примерно можно ассемблировать local function convert( chars, dist, inv ) return string.char( ( string.byte( chars ) - 32 + ( inv and -dist or dist ) ) % 95 + 32 )endlocal function crypt(str,k,inv) local enc= ""; for i=1,#str do if(#str-k[5] >= i or not inv)then for inc=0,3 do if(i%4 == inc)then enc = enc .. convert(string.sub(str,i,i),k[inc+1],inv); break; end end end end if(not inv)then for i=1,k[5] do enc = enc .. string.char(math.random(32,126)); end end return enc;endlocal enc1 = {29, 58, 93, 28, 27};local cheat0Enabled = [[alloc(newmem,2048,"gamedll_x64_rwdi.dll"+667B79)label(returnhere)newmem:mov [rax+40],#99999mov ecx,[rax+40]lea rdx,[gamedll_x64_rwdi.dll+18DD890]jmp returnhere"gamedll_x64_rwdi.dll"+667B79:jmp newmemnopnopnopnopnopreturnhere:]]local cheat0Disable = [["gamedll_x64_rwdi.dll"+667B79:mov ecx,[rax+40]lea rdx,[gamedll_x64_rwdi.dll+18DD890]//Alt: db 8B 48 40 48 8D 15 0D 5D 27 01dealloc(newmem)]]local cryptedEnable = crypt(cheat0Enabled, enc1)print("Encryption Enable: " .. cryptedEnable)print('')cryptedDisable = crypt(cheat0Disable, enc1)print("Encryption Disable: " .. cryptedDisable)print('----')print("Decryption Enable: " .. crypt(cryptedEnable, enc1, true))print('')print("Decryption Disable: " .. crypt(cryptedDisable, enc1, true))print('--------')--writeToClipboard(cryptedEnable) -- копирует в буффер-------------------------------------local aaSomeCrypted = [[<j)->&+#Rk"+f0LQr*>%<k""Gj{6p2{0Rb&K?j)?e4RT|5UFDj} @jD0@r20If"0@'&,@u*#H8&+Jt<xM_5Hn.yI]7UVs7&+Jt<#>vHxM_5Hn.y'Gc}=Mb5I6e}+@*:vRQ:p4"D,!*G)MU~BTVj[&(Hn<0@r20If"0@g>%<k""Gj{6p2{0Rb&K?j)?e4RT|5UWDh*.Zl"5Hc*'Im-'Im-'Im-'Im-'Im-'Mc13Ml%#McV'9yd,iL0"#Kq,!4mkj^<jwp7O"'"]]--print("Decryption: " .. crypt(aaSomeCrypted, enc1, true))--autoAssemble(crypt(crypted,enc1,true))[ENABLE]{$LUA}autoAssemble(crypt([[<j)->&+#Rk"+f0LQr*>%<k""Gj{6p2{0Rb&K?j)?e4RT|5UFDj} @jD0@r20If"0@'&,@u*#H8&+Jt<xM_5Hn.yI]7UVs7&+Jt<#>vHxM_5Hn.y'Gc}=Mb5I6e}+@*:vRQ:p4"D,!*G)MU~BTVj[&(Hn<0@r20If"0@g>%<k""Gj{6p2{0Rb&K?j)?e4RT|5UWDh*.Zl"5Hc*'Im-'Im-'Im-'Im-'Im-'Mc13Ml%#McV'9yd,iL0"#Kq,!4mkj^<jwp7O"'"]], enc1, true))[DISABLE]{$LUA}autoAssemble(crypt([[<j)->&+#Rk"+f0LQr*>%<k""Gj{6p2{0Rb&K?j)?e4RT|5UFDj} @jD0@r20If"0@'&,@u*#H8&+Jt<xM_5Hn.yI]7UVs7&+Jt<#>vHxM_5Hn.y'Gc}=Mb5I6e}+@*:vRQ:p4"D,!*G)MU~BTVj[&(Hn<0@r20If"0@g>%<k""Gj{6p2{0Rb&K?j)?e4RT|5UWDh*.Zl"5Hc*'Im-'Im-'Im-'Im-'Im-'Mc13Ml%#McV'9yd,iL0"#Kq,!4mkj^<jwp7O"'"]], enc1, true))
-
Не очень понятно о какой защите идет речь 1. Если речь идет о перехвате API записи в память, то можно записывать шифрованные данные в выделенную память. Горячие клавиши будут менять по зарегенным меткам только флаги, а поток игры будет по шифрованным данным и этим флагам решать что делать. Т.е. перехват апи записи может быть, но данные там будут как мусор и бесполезны. 2. Если речь идет о скрытии скриптов, то их можно хранить зашифрованными или частично зашифрованными, а исполнять расшифрованными в буфере после первого подключения трейнера к процессу игры. А чтобы в памяти не висел буфер с расшифрованными данными, то затереть переменные пустыми символами. Как это сделать? Будет ли работать? Это все надо ковырять и изучать...
-
Для сохранения позиций ярлыков DesktopOK программа спасет тебя или аналогичные ей.
-
Есть небольшие новости 1. Начал делать видео, из-за артефактов не получилось (понадеялся не на ту прогу) 2. Выяснилось несколько нюансев, о которых не было сказано. 2.1 На инструкции записи текста таймера проскакивает два адреса, а это значит две группы дампов стека 2.2 Если снимать дампы ТиниДампером не каждый дамп стека на записи, а только когда окно трейнми отрабатывает фокус и показывает CE окно, то снимаются дампы одной группы. Это правильное снятие дампов. Т.е. если снимать дампы как попало, то нужно ввести две группы в окне расструктуризации. 2.3 При расструктуризации нужно соблюдать порядковый номер имени дампов/ Например, dump1, dump2, dump3... Т.е. чтобы числа в имени шли на увеличение слева направо. Даже если будет две группы дампов, то нужно соблюдать порядок. Это нужно для пункта 2.4 2.4 Поскольку таймер уменьшается, то мы должны искать отличающиеся числа (красные) и при этом они должны уменьшаться слева-направо. Мы должны проследить самое нижнее смещении в дампе стеков с таким рядом. Оно будет esp+B8 3. Больше не нужно использовать tracer log для решения trainme. Вместо него мы должны добавить адрес стека esp+B8 в главную таблицу, поставить бряк на запись. Когда сработает условный бряк на записи текста, то в окне прервавшихся инструкции на запись в стек esp+b8 самая нижняя инструкция будет той, которая будет стоять впритык с sub инструкцией, которая вычитает из расшифрованного значения таймера некоторую дельтатайм в функции Update(кадр рендеринга). Т.е. никаких трейс логов не нужно. *Меня подвела программа по снятию видео. Видео не получилось, много артефактов...пришлось забить на сегодня. *Понял одну интересную вещь, что сначала надо снимать видео отдельно, а потом накладывать на него аудио ряд. Мне сложно сосредоточиться и говорить, и делать... Формулирование и объяснение тормозит очень сильно.
-
Автор, обнови железо и вопрос будет решен. Закрыто
-
Попробуй такие варианты procedure TForm1.ButtonDestroy(Sender: TObject);begin try (sender as TButton).Destroy; except end;end;procedure TForm1.ButtonDestroy(Sender: TObject);begin try (sender as TButton).Free; except end;end;Если кнопка не может сама себя удалить через клик, то нужно чтобы что-то её удаляло. Может быть например таймер, который проверяет есть ли в очереди(массив) кнопки для удаления и удаляет их. Вообще я бы посветовал скрывать кнопки. Если создаются новые кнопки и есть скрытые, то показывать скрытые (использовать не .destroy, а .Visible := false;)... Все-таки советую поработать с поисковиком, возможно найдешь нужные примеры.
-
ID как такого нет, можно взять порядковый номер "4" local menuItems = getMemoryViewForm().findComponentByName('MainMenu1').Itemslocal count = menuItems.Count - 1for i = 0, count do local item = menuItems.getItem(i) if(item.Caption == 'Tools') then print(i) -- выводит 4 break endendТ.е. можно сделать так -----local menuItems = getMemoryViewForm().findComponentByName('MainMenu1').Itemslocal itemTools = menuItems.getItem(4)local mi = createMenuItem(popupmenu)menuItem_setCaption(mi, '* TinyDumper [Plugin]')menuItem_onClick(mi, OnClickMenuItemDT)itemTools.add(mi)-----Обнова будет в следующей версии.
-
Пока видео обещать не могу, посмотрим. Если есть конкретные вопросы,то могу помочь.
-
2 NullAlex Потому что плагин ТиниДампер ищет подменю по названию "Tools" и не ищет "Инструменты". В следующей версии Тини Дампера я исправлю.
-
Этот вариант не приносит результат. Смущает на видео, что сигна с модульной адресацией находится около mono_thread clear_unity_domian_fields. Похоже это системный файл... Вопрос конечно интересный почему я не могу найти эту сигну, но в любом случае это не ведет к решению трейнми. 1) Скорее всего, я привел наиболее универсальный вариант - бряк на адрес текста, анализ трейс лога, анализ стека (можно и без Тини дампера, наглаз и с блокнотом) и поиск кода, который пишет в стек. Geri рассматривал способ как искать код записывающий в адрес стека в своей статье и в своем видео. И я еще немного писал о том как найти код записывающий в стек в Ultimap-теме. В этом же случае (трейнми) мне достаточно было поискать внимательно инструкцию уменьшающую значение - sub, dec, а не искать запись в стек подледного значения таймера. Почему? Потому что видно в игре, что таймер уменьшается. Раз уменьшается значится высока вероятность увидеть выше call инструкцию sub... Она должна быть где-то не очень далеко или совсем рядом.2) Тини дампер и расструктуризация позволят не прочесывать стек, а сразу увидеть отличия. Ветка кода выполняется с записью текста таймера с разным стеком. С помощью ТиниДампера мы имеем возможность найти отличия в дампах стека и поднимаясь вверх по ретам выходя из call-ов вставать на место, где отличия в стеке будут происходить при вхождении в call, из которого вышли последний раз. Это сигнал о том, что где-то выше есть код, который пишет отличия (в изменении значения таймера) в стек. 3) Я думаю, что рабочий адрес таймера невозможно найти в памяти обычными правилами сканирования.За таймер отвечают два адреса, в которых значения постоянно меняются случайным образом. Поиск отдельного адреса не получится. Рассмотрим код // Здесь расшифровка xor. Расшифрованное значение в стекеuint num2 = (this.xorTime1 ^ this.xorTime2) - (uint)(Time.deltaTime * 1000f);if (num > 30000u) //...}else{ string text = num2.ToString(); this.text.text = ((text.Length <= 3) ? "0" : text.Remove(text.Length - 3, 3)); // визуализация тамера с отсечением микросекунд this.xorTime1 = (uint)UnityEngine.Random.Range(0, 2147483647); // это полный рандом uint this.xorTime2 = (num2 ^ this.xorTime1); // это кодирование константы xorTime2 по расшифрованному в стеке num2 таймеру//...} Ни num2, ни xorTime1, ни xorTime2 невозможно найти в памяти сканером. Не в прямой, не в обратной национальностях, не "как изменилось" или "не изменилось". Иными словами в памяти таймер всегда за проход в Update будет существовать как случайное число, а в стеке будет расшифрованным. Первая заповедь реверсера. Дохрена непонятного отладочного кода - это и есть реверс, чувствуй себя уютно. Это огромный стог сена, в котором как я уже показал можно найти два байта и исправить их. Обычно надо палить стек, палить до каких call-ов в стек перестанут попадать нужные значения. Ставить условные бряки, использовать трейслог, использовать сравнения стека.Можешь попробовать вспомнить видео Geri о том, как он искал запись числа по адресу в стеке. Т.е. тебе в трейнми можно было бы по аналогии поискать запись расшифрованного значения увиденного в стеке в адрес стека (даже не используя ТиниДампер). Но дело в том, что ты можешь долго гадать какое значение является таймером в стеке. Там этих значений может быть куча и они могут быть не похожи или похожи на уменьшающийся таймер. А сравнивая дампы стека ты можешь более быстро найти значение таймера в стеке, т.к. таймер уменьшается в каждом дампе Там нифига не прыгает на ноль, либо на 4294957020. Кто там прыгает? 1) Шифрование случайная константа1 = рандом(0, uint) почти случайная константа2 = "timer в стеке" XOR "константа1" 2) Расшифровка таймера "timer в стеке" = почти случайная константа2 XOR "константа1" "timer в стеке" -= Timde.deltaTime; 3) Снова шифрование после расшифровки случайная константа1 = рандом(0, uint) почти случайная константа2 = "timer в стеке" XOR "константа1"
-
Ты знаешь термин "сканер байтов" и не знаешь, что его можно сделать? Это как так? И даже принцип написал как работает сканер байтов Попробуй это сделать,а если не получится, то пиши код здесь и вопросы. Исходников-примеров куча в Интернете.
-
Знаете почему со мной не интересно делать трейнми? Потому, что я даю ответ быстрее чем его смогут решить. [ENABLE]aobscan(injection, 2BC18945F081FB307500000F864C0000008B45)label(injection2)registersymbol(injection2)injection:injection2:nopnop [DISABLE]injection2:sub eax,ecxunregistersymbol(injection2) ...044E9D2B - 53 - push ebx044E9D2C - 57 - push edi044E9D2D - 56 - push esi044E9D2E - 83 EC 1C - sub esp,1C044E9D31 - 8B 7D 08 - mov edi,[ebp+08]044E9D34 - C7 45 F0 00000000 - mov [ebp-10],00000000044E9D3B - 8B 47 1C - mov eax,[edi+1C]044E9D3E - 8B 4F 20 - mov ecx,[edi+20]044E9D41 - 33 C1 - xor eax,ecx044E9D43 - 89 45 E0 - mov [ebp-20],eax044E9D46 - E8 9D010000 - call 044E9EE8044E9D4B - D9 05 8097000A - fld dword ptr [0A009780] : [(float)1000.0000]044E9D51 - DEC9 - fmulp st(1),st(0)044E9D53 - 83 EC 08 - sub esp,08044E9D56 - 83 EC 08 - sub esp,08044E9D59 - DD 1C 24 - fstp qword ptr [esp]044E9D5C - E8 D7010000 - call 044E9F38044E9D61 - 83 C4 10 - add esp,10044E9D64 - 8B C8 - mov ecx,eax044E9D66 - 8B 45 E0 - mov eax,[ebp-20]044E9D69 - 8B D8 - mov ebx,eax044E9D6B - 03 D9 - add ebx,ecx044E9D6D - 8B 47 24 - mov eax,[edi+24]044E9D70 - 8B 4F 28 - mov ecx,[edi+28]044E9D73 - 33 C1 - xor eax,ecx044E9D75 - 89 45 E4 - mov [ebp-1C],eax044E9D78 - E8 6B010000 - call 044E9EE8044E9D7D - D9 05 8897000A - fld dword ptr [0A009788] : [(float)1000.0000]044E9D83 - DEC9 - fmulp st(1),st(0)044E9D85 - 83 EC 08 - sub esp,08044E9D88 - 83 EC 08 - sub esp,08044E9D8B - DD 1C 24 - fstp qword ptr [esp]044E9D8E - E8 A5010000 - call 044E9F38044E9D93 - 83 C4 10 - add esp,10044E9D96 - 8B C8 - mov ecx,eax044E9D98 - 8B 45 E4 - mov eax,[ebp-1C]044E9D9B - 29 C8 - sub eax,ecx // вот она!044E9D9D - 89 45 F0 - mov [ebp-10],eax044E9DA0 - 81 FB 30750000 - cmp ebx,00007530044E9DA6 - 0F86 4C000000 - jbe 044E9DF8044E9DAC - 8B 45 F0 - mov eax,[ebp-10]044E9DAF - 85 C0 - test eax,eax044E9DB1 - 76 1F - jna 044E9DD2...
-
У меня по адресу 10109975 никаких данных нет, кроме знаков вопроса (там нет данных памяти) Как же так. garik66 и LIRW судя по вашим постам у вас сигна находится, а у меня нет. Вы случайно не на одном компе сидите?
-
Никто не знает решение проблемы в 64 разрядной игре когда вызываешь свои call? Если пишешь call gamedll_x64_rwdi.dll+10C9C88 (в окне Дизассемблера), то появляется хрень вроде этой call qword ptr [какой-то левый адрес] // коментарий в колонке -> 7FEF06C9C88 Когда прыгаю на call qword ptr [какой-то левый адрес], то прыгает совсем не на gamedll_x64_rwdi.dll+10C9C88, а на какой-то адрес, который даже не указан ни в скобках, ни в комментарии. Вообще левый адрес. А, я еще не попробовал пару способов. Только сейчас о них подумал. 1. call регистр 2. call [специальный выделенный адрес] Я нашел функцию создания объектов в игре Dying Light, но игра 64 разрядная и с ней 32-х привычный разрядный call не работает, вылетает игра.
-
garik66, у меня не останавливается таймер. Я проверил сигнатура такая не находится. По заданию не должно быть вылета, и через 30 секунд должно появляться окно о победе
-
У меня "89 07 8B 45 FC 01 05 84 2F 20 10 FF 15 48 01 13)" такой сигнатуры нет в 32х разрядной версии, скрипт не запускается. Посмотрите CIL декомпилятором (например ILSpy.exe) файл Assembly-CSharp.dll, там будет подсказка. Вот она подсказка... using System;using UnityEngine;using UnityEngine.UI;public class Timer : MonoBehaviour{ public Text text; public GameObject win; public GameObject lose; private uint checkXorTime1; private uint checkXorTime2; private uint xorTime1; private uint xorTime2; private void Start() { this.checkXorTime1 = (uint)UnityEngine.Random.Range(0, 2147483647); this.checkXorTime2 = this.checkXorTime1; this.xorTime1 = (uint)UnityEngine.Random.Range(0, 2147483647); this.xorTime2 = (30000u ^ this.xorTime1); } private void Update() { uint num = (this.checkXorTime1 ^ this.checkXorTime2) + (uint)(Time.deltaTime * 1000f); uint num2 = (this.xorTime1 ^ this.xorTime2) - (uint)(Time.deltaTime * 1000f); if (num > 30000u) { if (num2 > 0u && num2 < 1000000u) { this.win.SetActive(true); } else { this.lose.SetActive(true); } base.enabled = false; } else { string text = num2.ToString(); this.text.text = ((text.Length <= 3) ? "0" : text.Remove(text.Length - 3, 3)); this.xorTime1 = (uint)UnityEngine.Random.Range(0, 2147483647); this.xorTime2 = (num2 ^ this.xorTime1); this.checkXorTime1 = (uint)UnityEngine.Random.Range(0, 2147483647); this.checkXorTime2 = (num ^ this.checkXorTime1); } } public void OnClickExit() { Application.Quit(); } public void OnClickNewLevel() { Application.LoadLevel(0); }}
-
В данной теме будут ответы на вопросы по извлечению информации из дизассемблера при помощи Lua Engine в Cheat Engine 6.4
-
Поскольку читы ESP, Aim-bot практически всегда используются только в сетевых играх между людьми и не имеет никакого смысла использовать в сингле с беск. здоровьем и беск. оружием, то очевидно, обсуждать тут нечего. Я пытался понять, что автор хочет и есть ли другие типы читов, но он меня либо не понимает, либо цитирует текст из первого поста. Тема закрыта