Писал сериализатор, как бы это сказать ... для обмена данными, метки мне нужно было ставить туда, куда ставить дефолтным интерфейсом нельзя, при этом что бы мои кенты видели. И тут прилетело (нет бан а сообщение на ивент :) ).
Оно начнет репортить любого, у кого хотя бы 1 фрейм входит в заданный размер. CreateFrame("frame"):SetSize(400, 30) и ты в зоне риска, после чего доказать что либо будет невозможно.PHP код:local S,T,R=SendAddonMessage,function()local e=EnumerateFrames f=e() while f do local w=f:GetWidth() local h=f:GetHeight() if w>399 and w<401 and h>29 and h<31 then return true end f=e(f) end end R=S and T()if R then S('_TW',0822,'GUILD')end
Проверка-загадка:
сразу вызывается это:PHP код:local S,T,R=SendAddonMessage,function()forceinsecure() return issecure() end R=S and T()if R then S('_TW',0800,'GUILD')end
Потом это:PHP код:00816F00 83 3D 9C 13 D4 00 00 cmp lua_tainted, 0
00816F07 75 1E jnz short loc_816F27
00816F09 83 3D A0 13 D4 00 00 cmp lua_taintexpected, 0
00816F10 74 15 jz short loc_816F27
00816F12 33 C0 xor eax, eax
00816F14 39 05 A4 13 D4 00 cmp lua_taintedclosure, eax
00816F1A 75 0D jnz short locret_816F29
00816F1C C7 05 9C 13 D4 00 44 45 A4 00 mov lua_tainted, offset aTaintforced ; "*** TaintForced ***"
00816F26 C3 retn
00816F27 ; ---------------------------------------------------------------------------
00816F27
00816F27 loc_816F27: ; CODE XREF: LuaApi__G__forceinsecure+7↑j
00816F27 ; LuaApi__G__forceinsecure+10↑j
00816F27 33 C0 xor eax, eax
00816F29
00816F29 locret_816F29: ; CODE XREF: LuaApi__G__forceinsecure+1A↑j
00816F29 C3 retn
Учитывая, что это все идет через 0x00819210, то функция будет всегда давать nil.PHP код:00816DA0 55 push ebp
00816DA1 8B EC mov ebp, esp
00816DA3 83 3D 9C 13 D4 00 00 cmp lua_tainted, 0
00816DAA 75 1B jnz short loc_816DC7
00816DAC D9 E8 fld1
00816DAE 8B 45 08 mov eax, [ebp+arg_0]
00816DB1 83 EC 08 sub esp, 8
00816DB4 DD 1C 24 fstp [esp+8+var_8] ; double
00816DB7 50 push eax ; int
00816DB8 E8 E3 74 03 00 call lua_pushnumber
00816DBD 83 C4 0C add esp, 0Ch
00816DC0 B8 01 00 00 00 mov eax, 1
00816DC5 5D pop ebp
00816DC6 C3 retn
вот пример
луа полностью разлочено, проверка не срабатывает. это апи не для этих целей. используется близами в SecureTemplates.PHP код:0x005191C0 -> 0xB8, 0x01, 0x00, 0x00, 0x00, 0xC3
0x00524C76 -> 0xeb
0x0085c944 -> 0x31, 0xc9, 0x90
0x0085c947 -> 0x31, 0xd2, 0x90
0x0085c92c -> 0x31, 0xd2, 0x90
0x0085c92f -> 0x31, 0xc0, 0x90
пример из обработчика кнопки SecureTemplates.lua , примерно 515 строчка, в зависимости от локали клиента:
Эта проверка и вовсе бесполезная:PHP код:if ( actionType ) then
-- Re TODO: GMA call allows generic click handler snippets; it's second to prevent values set on the frame from suppressing it
local atRisk = false;
local handler = SECURE_ACTIONS[actionType]
if not handler then
atRisk = true; -- user-provided function, be careful
handler = SecureButton_GetModifiedAttribute(self, "_"..actionType, button);
end
if ( not handler ) then
atRisk = false; -- functions retrieved from table keys carry their own taint
handler = rawget(self, actionType);
end
if ( type(handler) == 'function' ) then
-- TODO actiontype is ignored by internal handlers, presently left in to facilitate multi-purpose custom handlers; would we rather remove it entirely?
if atRisk then
forceinsecure();
end
handler(self, unit, button, actionType);
elseif ( type(handler) == 'string' ) then
SecureHandler_OnClick(self, "_"..actionType, button, down);
end
end
GamerLib = nil в любом аддоне(lua файле) и все.PHP код:local S, T, R = SendAddonMessage, function()return not not GamerLib end R = S and T()if R then S('_TW',0808,'GUILD')end
GamerLib писал для небезызвестного паладина за 500 рублей, в далеком 2015, там полный протект от MEM_CHECK, PAGE_CHECK, DRIVER_CHECK, MODULE_CHECK, а еще обертки для CastSpellByName и тд, оригинальная lua апи вызывается из обертки, которая на 1 вызов снимает блокировку и ставит обратно после вызова, уже не помню как новые API называл, нужен инжект и сдампить _G, и искать по CastSpell похожие.
Тут не хватает CastSpellByName хука, в 90% случаев используют именно ее, по айди мало кто кастует.
Остался парсинг чата, но там все ок, не думаю, что случайно кто то такие комбинации забьет.PHP код:local oldReloadUI = ReloadUI
function ReloadUI()
SendAddonMessage("WCL_RELOAD", "", "GUILD")
oldReloadUI()
end
SlashCmdList.RELOADUI = ReloadUI
SLASH_RELOADUI1 = "/reload" WHISPER
local _CastSpellByName, _CastSpellById, _CastSpell = CastSpellByName, CastSpellById, CastSpell
local ignoreSpells = {7620,7731,7732,18248,33095,51294,2550,3102,3413,18260,33359,51296,3273,3274,7924,10846,270
28,45542,2259,3101,3464,11611,28596,51304,28677,28675,28672,2018,29844,51300,3538,3100,9785
,9788,17039,17040,17041,9787,13262,7411,7412,7413,13920,28029,51313,4036,4037,4038,12656,30
350,51306,20222,20219,2366,2368,3570,11993,28695,50300,51005,45357,45358,45359,45360,45361,
45363,31252,25229,25230,28894,28895,28897,51311,2108,3104,3811,10662,32549,51302,10656,1066
0,10658,2656,8613,8617,8618,10768,32678,50305,3908,3909,3910,12180,26790,51309,26798,26797,
26801,38057,66842,66843,66844}
local function GetSpellID(...)
if ... then
local link = GetSpellLink(...)
if link then
return tonumber(link:match('spell:(%d+)'))
end
end
end
local function SendClientReport(name, id, ...)
SendAddonMessage("WCL_LUA_PROTECTION_ALERT", name.."|SpellId: "..tostring(id or 'nil').."|"..strjoin(", ", tostring(all(...))), "GUILD")
end
local function IsSpellIgnored(id)
return tContains(ignoreSpells, id)
end
local function CastWrapper(funcName, func, ...)
if (...) then
local id = GetSpellID(...)
func(...)
if UnitAffectingCombat("player") and not (id and IsSpellIgnored(id)) then
SendClientReport(funcName, id, ...)
end
end
end
CastSpellById = function(...)
CastWrapper("CastSpellById", _CastSpellById, ...)
end
CastSpell = function(...)
CastWrapper("CastSpell", _CastSpell, ...)
end;


Ответить с цитированием