viernes, 28 de octubre de 2011

lua2html script

Este es un pequeño script para pasar código de un archivo lua a html. El resultado puede ser retornado a un string, escrito en un file handler o en un archivo nuevo.

La marcación funciones son las que esten disponibles en el actual lua state desde donde se ejecuta así que es compatible con cualquier sdk.

Al dar el código fuente pueden modificarlo como quieran (como que sólo retorne cierto html, etc.) pero eso ya va de ustedes.


Link to pastebin: http://pastebin.com/73Hc2PHF

Aca el mismo script analizado por si mismo:


1   --[[lua2html by WeBuLtRa v0.9]]--
2   function lua2html(sFile, sFileOut)
3    local keywords = { "while", "function", "for", "require", "elseif", "if", "then", "else", "do", "repeat", "until", "end", "return", "true", "false", "and", "not", "or", "local", "nil", "break", "in"};
4    local functions = {":write", ":read", ":close", ":seek", ":gsub", ":find", ":gmatch", ":format", ":lower", ":upper", ":sub", ":byte", ":reverse", ":rep", ":len", ":dump", ":char"};
5    local operators = {"%+", "%#", "%-", "%*", "%=", "~", "%."};
6    local t = {};
7    local sF = io.open(sFile, "rb");
8    if sF then
9     local function print_r(a,b)
10      if b ~= _G then
11       if type(b) == "function" then
12        table.insert(t,a);
13        print(a);
14       elseif type(b) == "table" then
15        for x, y in pairs(b) do
16         if type(y) == "function" then
17          table.insert(t,a.."%."..x)
18          print(a.."."..x);
19         end
20        end
21       end
22      end
23     end
24     table.foreach(_G, print_r);
25     local function ParseScript(s)
26      local tFs, tVars = {}, {};
27      for key in string.gmatch(s, "function ([%w%._%:]+)") do
28       table.insert(tFs, #tFs+1, key)
29      end
30      for key in string.gmatch(s, "(%w+%.%w+) = function") do
31       table.insert(tFs, #tFs+1, key)
32      end
33      return tFs;
34     end
35     local function CheckKeywords(line, multi)
36      if not multi then
37      for x,y in pairs(keywords) do
38        line = line:gsub("([%W]+)("..y..")([%c%s%;%,%(%)]+)",
39         function(a,b,c)
40          return a.."<span style='color:blue;'>"..b.."</span>"..c
41         end
42        );
43        line = line:gsub("^"..y.."%s",
44         function(b)
45          return "<span style='color:blue;'>"..b.."</span>";
46         end
47        );
48      end
49      end
50      return line;
51     end
52     local function CheckOperators(line, operators, multi)
53      if not multi then
54       for x,y in pairs(operators) do
55         line = line:gsub(y, function(a) return "<span style='color:red;'>"..a.."</span>" end);
56       end
57      end
58      return line;
59     end
60     local function CheckFunctions(line, t, multi, color)
61      if not multi then
62       for x,y in pairs(t) do
63         line = line:gsub("("..y..")%(", function(a) return "<span style='color:"..color..";'>"..a.."</span>(" end);
64       end
65      end
66      return line;
67     end
68     local function CheckALL(line, multi,t, tFs, functions)
69      line = CheckKeywords(line, multi);
70      line = CheckFunctions(line, t, multi, "darkorange");
71      line = CheckFunctions(line, functions, multi, "darkorange");
72      line = CheckFunctions(line, tFs, multi, "red");
73      line = CheckOperators(line, operators, multi);
74      line = line:gsub("(&apos;[%w%d%s]-&apos;)", function(a) return "<span style='color:darkmagenta;'>"..a.."</span>" end);
75      return line;
76     end
77     local function CheckStrings(line,t,tFs,functions)
78      line = line:gsub("(.-)([\"].-[\"])", function(b,a) return CheckALL(b, multi,t, tFs, functions).."<span style='color:darkmagenta;'>"..a.."</span>" end);
79      line = line:gsub('(".+")(.+)', function(a,b)  return a..CheckALL(b, multi,t, tFs, functions) end);
80      line = line:gsub("(&apos;[.]+&apos;)", function(a) return "<span style='color:darkmagenta;'>"..a.."</span>" end);
81      return line;
82     end
83     local sText = "";
84     local sRaw = sF:read("*a");
85     local tFs = ParseScript(sRaw);
86     sF:seek("set");
87     local comment, multi, d = false, false, 0;
88     for line in sF:lines() do
89      d = d + 1;
90      local g = "<span style='background-color:yellow;' name='linea' >"..d.."</span><span name='linea' >  </span> ";
91      line = line:gsub("[^%w]", { ["<"] = "&lt;", [">"] = "&gt;", ["&"] = "&amp;", ["'"] = "&apos;", ["="] = "&equals;" }) or "";
92      if not comment then
93       if line:find("%-%-%[%[") then
94        line = line:gsub("%-%-%[%[", function(s) return "<span style='color:green;'>"..s; end);
95        if line:find("%]%]") then
96         line = line:gsub("%]%]", function(s) return s.."</span>"; end);
97        else
98         comment = true;
99        end
100        sText = sText..g..line;
101       else
102        local waka = false;
103        if line:find("%-%-") then
104         local a,b,c,e,f = line:find("(.-)(%-%-)(.+)");
105         if a then
106          if c:find("[\"].-[\"]") then
107           c = CheckStrings(c,t,tFs,functions);
108           waka = true;
109          else
110           waka = false;
111          end
112          if c:find("%[%[") and not c:find("%]%]") then
113           c = c:gsub("(.+)(%[%[.+)", function(a,s) return CheckALL(a, multi, t, tFs, functions).."<span style='color:darkmagenta;'>"..s; end);
114           multi = true;
115          end
116          if not waka then
117           c = CheckALL(c, multi, t, tFs, functions);
118          end
119          if not c:find("%[%[") and c:find("%]%]") then
120           c = c.."</span>";
121           multi = false;
122          elseif c:find("%[%[.+%]%]") then
123           c = c:gsub("%[%[.+%]%]", function(s) return "<span style='color:darkmagenta;'>"..s.."</span>"; end);
124          end
125         end
126         line = c.."<span style='color:green;'>"..e..f.."</span>";
127        else
128         if line:find("[\"].-[\"]") then
129          waka = true;
130          line = CheckStrings(line,t,tFs,functions,d);
131         else
132          waka = false;
133         end
134         if line:find("%[%[") and not line:find("%]%]") then
135          line = line:gsub("(.+)(%[%[.+)", function(a,s) return CheckALL(a, multi, t, tFs, functions).."<span style='color:darkmagenta;'>"..s; end);
136          multi = true;
137         end
138         if not waka then
139          line = CheckALL(line, multi, t, tFs, functions, d);
140         end
141         if not line:find("%[%[") and line:find("%]%]") then
142          line = line.."</span>";
143          multi = false;
144         elseif line:find("%[%[.+%]%]") then
145          line = line:gsub("%[%[.+%]%]", function(s) return "<span style='color:darkmagenta;'>"..s.."</span>"; end);
146         end
147        end
148        sText = sText..g..line;
149       end
150      else
151       if line:find("%]%]") then
152        sText = sText..g..line.."</span>";
153        comment = false;
154       else
155        sText = sText..g..line;
156       end
157      end
158     end
159     sF:close();
160     local sStart = [[<p>Archivo: %s<br/>
161      Total de lineas: %d<br/>
162      Total de funciones propias: %d (
163      <span style='color:gray;'>%s</span> )<br/>
164      <input type='button' id='b' onclick='expand();' value='Expandir/Contraer codigo'/>
165      <input type='button' onclick='hideLinea();' value='Esconder numero de linea'/>
166      <input type='button' onclick='ShowLinea();' value='Mostrar numero de linea'/></p>]];
167      sStart = sStart:format(sFile, d,#tFs, table.concat(tFs,', '));
168      local sFinish = [[<script>
169        var e = document.getElementById('formated');
170        var b = document.getElementById('b');
171        function expand(){
172         e.style.width = 'auto';
173         e.style.height = 'auto';
174         b.onclick = contraer;
175        }
176        function contraer(){
177         e.style.width = '800px';
178         e.style.height = '300px';
179         b.onclick = expand
180        }
181        function hideLinea(){
182         aL = document.getElementsByName('linea');
183         for(var i=0;i<aL.length;i++){
184          aL[i].style.display = 'none';
185         }
186        }
187        function ShowLinea(){
188         aL = document.getElementsByName('linea');
189         for(var i=0;i<aL.length;i++){
190          aL[i].style.display = 'inline';
191         }
192        }
193       </script>]];
194     local sRet = sStart.."<pre id='formated' style='text-align:left;width:800px;height:300px; overflow:scroll;'>"..sText.."</pre><h3>Raw code</h3><pre style='text-align:left;width:800px;height:120px; overflow:scroll;'><code>"..sRaw.."</code></pre>"..sFinish;
195     if not sFileOut then
196      return sRet;
197     elseif type(sFileOut) == 'userdata' and string.find(tostring(sFileOut), "file") then
198      sFileOut:write(sRet);
199     elseif type(sFileOut) == 'string' then
200      local sO = io.open(sFileOut, "wb");
201      if sO then
202       sO:write(sRet);
203       sO:close();
204       return true;
205      else
206       return nil, "Couldn't open destination file";
207      end
208     else
209      return nil, 'jeje';
210     end
211    else
212     return nil, "Couldn't open file";
213    end
214   end

martes, 25 de octubre de 2011

Direct Download link emuparadise.me

Parece que el día de hoy los sitios se empeñan en ponerme trabas y ahora fue el caso de emuparadise.me (sitio lleno de roms). Según tienes que resolver el captcha para obtener los direct download link pero a juzgar por el código sólo plantan una cookie en tu navegador. Nuevamente usando la consola web del firefox podemos brincarnos esa tediosa cosa del captcha. Sólo escriban esto en la consola y la página se recargará mostrando el link:

document.cookie = "downloadcaptcha=1"; window.location.reload();

Imagen de prueba:



Pueden haber más métodos para esto pero este es el más sencillo.

Desbloquear contenido (survey) de freemovierepublic.com

Bueno, el día de hoy entre al sitio freemovierepublic.com ya que dicen que tienen buenas películas online (recientes) pero mi sorpresa fue que al entrar a cada link para ver una película se mostraba un cartel bastante molesto solicitando visitar varios links para poder desbloquear al contenido y entonces ver la película.



La verdad es frustrante ver este tipo de sitio llenos de trackers, contadores y publicidad, y en partícular la publicidad que bloquea contenidos.

Así que pues simplemente ví el código fuente del sitio en lo que correspondía al bloqueador de contenidos y resultó ser un javascript proveniente de dollarade.com (como se ve en la imágen). Dicho javascript esta ofuscado de tal forma que resulta imposible leerlo simplemente pero nótese que usan la función eval de javascript para ejecutarlo. Así que lo único que hice fue copiar el contenido de ese js y cambiar la función eval por document.write en otro html nuevo. El resultado es el javascript des-ofuscado jajajaja.

Ya teniendo el javascript pleno sólo era leerlo para ver como se ejecutaba y aunque creí que iba a ser más difícil resultó no serlo. Ello porque tienen una funcion que te avisa cuando el contenido esta desbloqueado lanzando un dialogo (alert) con dicho mensaje (algo como your content has been unlocked). Lo interesante es que después de dicho dialogo hay una función cuyo nombre es bastante largo y que aparentemente no esta definida. Así es, BINGO. Dicha función es la que desbloquea el contenido y se me hace ridículo que la pongan casi al inicio del script (aunque creo es porque lo tenían ofuscado y no les interesó jajaja).

Para ejecutarla pueden usar la consola web de firefox (como en mi caso) ó si usan IE escribir en la barra de navegación:
javascript : nombredelafuncion(); //(reemplacen el nombredelafuncion por la que aparece en el js).

En mi caso la función se llama:

ivaie3i33mav93a8b8ghh7abnalkm34l35jal64naliy7an96atl5kajo8n69anlamlknja9(); 

Pero puede cambiar según sea el dominio que este usando el dollarade para bloquear su contenido.

Y listo, como verán en la siguiente imagen el contenido fue desbloqueado fácilmente. La verdad como ejercicio estuvo bueno pero sigo dudando de métodos de ofuscación como el presentado por dollarade que son muy sencillos de imprimir.



Otras formas de deshabilitar estos "surveys" es deshabilitando el javascript globalmente o para ciertos sitios en  particular, editando el archivo de hosts colocando el dominio de dollarade.com con ip local 127.0.0.1 y también usando add-ons de firefox que deshabilitan el javascript.

Ah por cierto, indagando un poco en la red dí con un link donde se muestra todo el código des-ofuscado de dollarade.com así que aquí les doy el link por si quieren echarle un vistazo y comprender un poco mejor lo anteriormente expuesto así el javascript que usa dicho sitio: http://pastebin.com/pS8jPKdX

Espero les agrade esta info.

lunes, 24 de octubre de 2011

jquery nl2br

Aunque en javascript podemos usar una función siguiente cuya finalidad sea cambiar los LF (line feed) por tags br de html:

function nl2br(value)
  return value.replace(/\n/g, ' < b r /> ');
end
Puede llegar a suceder que esta función no sirva cuando el valor al que vamos a aplicar el filtro proviene de un método ajax get o post de jquery como $.post() o $.get()  y es multilínea. Incluso usar la función de php nl2br retornaría un valor incorrecto. Así que deben aplicar una nueva función/filtro de la siguiente forma:

function nl2br(value)
   return value.replace(/\\n/gm, ' < b r / >' );
end
 
Nótese que se esta 'escapando' el caracter que representa el new line o line feed. Además se agrega el modificador /m para que afecte al valor dado aunque éste sea multilínea.