Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - @XSStringManolo

#46
Siempre me veo en la necesidad de codificar entidades a mano y acabo mirando una tabla porque no me acuerda alguna entidad en concreto. Por lo tanto hice una función en javascript que lo haga.
En principio la hice con el pseudoprotocolo
Código (javascript) [Seleccionar]
avascript:r='replace';d=document;a=prompt()[r](/ /g,"&#38;#38;#32;")[r](/!/g,"&#38;#38;#33;")[r](/"/g,"&#38;#38;#34;")[r](/%/g,"&#38;#38;#37;")[r](/'/g,"&#38;#38;#39;")[r](/\(/g,"&#38;#38;#40;")[r](/\)/g,"&#38;#38;#41;")[r](/</g,"&#38;#38;#60;")[r](/>/g,"&#38;#38;#62;")[r](/`/g,"&#38;#38;#96;")[r](/a/g,"&#38;#38;#97;")[r](/A/g,"&#38;#38;#65;")[r](/e/g,"&#38;#38;#101;")[r](/E/g,"&#38;#38;#69;")[r](/i/g,"&#38;#38;#105;")[r](/I/g,"&#38;#38;#73;")[r](/o/g,"&#38;#38;#111;")[r](/O/g,"&#38;#38;#79;")[r](/u/g,"&#38;#38;#117;")[r](/U/g,"&#38;#38;#85;")[r](/{/g,"&#38;#38;#123;")[r](/}/g,"&#38;#38;#125;")[r](/'/g,"&#38;#38;#8216;")[r](/'/g,"&#38;#38;#8217")[r](/,/g,"&#38;#38;#8218;")[r](/"/g,"&#38;#38;#8220;")[r](/"/g,"&#38;#38;#8221;")[r](/,,/g,"&#38;#38;#8222;")[r](/′/g,"&#38;#38;#8242;")[r](/″/g,"&#38;#38;#8244;")[r](/‹/g,"&#38;#38;#8249;")[r](/›/g,"&#38;#38;#8250;")[r](/s/g,"&#38;#38;#115;")[r](/S/g,"&#38;#38;#83;");a=d.createTextNode(a);b=d.createElement('p');b.appendChild(a);d.writeln(b.innerHTML);

Pense que a alguien más le podría ser algo útil y no me costaba nada asique hice una aplicación/página web con una interfaz muy simple para hacer esta tarea de forma automatizada.

htmlEntities() es una función que codifica caracteres que puedan ser interpretados y/o peligrosos a sus respectivas entidades. Estás entidades son códigos que el navegador conoce y puede mostrar. Por ejemplo el caracter < es codificado como &lt;
Si en el código de tu página web permites que usuarios introduzcan caracteres como < podrían llegar a formar códigos que el navegador interprete como <img src="http://paginaporno.com/imagenPorno.jpg">, el navegador entiende la etiqueta imagen y muestra un imagen externa en tu página web sobre la que tu no tienes control. En vez de una imagen podría ser un código de javascript de un keylogger que te robase la cuenta. Otro caso común es que tu mismo quieras compartir un código para que los demás lo vean, pero el dichoso código en vez de mostrarse como texto, es interpretado por el navegador. O incluso en un ataque MITM interceptan una la respuesta a una petición por XHR. Para estes y otros casos una de las múltipes medidas que se toman es convertir los caracteres peligrosos en entidades. De esta forma el código no es interpretado por el navegador, en su lugar muestra el caracter correspondiente a dicha entidad.

Este programa que traigo hace precisamente esto. Le introduces un código o texto que no quieres que se interprete y te lo traduce a entidades html.

Solo debes copiar el código generado y lo pones en tu página web por ejemplo dentro de un div. En el blog que comencé hace unos días podeis ver que voy mostrando códigos. Para poder hacerlo codifico las entidades. Si no lo hiciese se ejecutaría y por lo tanto no podría compartir los códigos que creo.

Podeis copiar el código siguiente en un documento.html para abrirlo y utilizarlo o utilizar la función sin el resto de la página.
Código (javascript) [Seleccionar]
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>htmlEntities</title>
</head>
<body>
<h4 id="en" onclick="cambiarIdioma('en');" style="display:inline;font-size:40px">EN</h4>
<h4 style="font-size:40px;display:inline"> | </h4>
<h4 id="es" onclick="cambiarIdioma('es');" style="font-size:40px;display:inline;color:coral"> ES</h4>
<div style="width:100%;align:center">
<h1 style="color:coral;font-size: 60px;align:center;text-align:center;display: block; margin-right: auto; margin-left: auto;">htmlEntities()</h1>
<input type="text" id="codigo" placeholder="Introduce tu código a parsear" style="width:95%;font-size: 60px; display: block; margin-right: auto; margin-left: auto; outline-color:coral">
<br />
<button type="button" id="bt" onclick="Parsear()" style="width:47.5%;font-size: 50px;display: block; margin-right: auto; margin-left: auto; background-color: #fafafa;outline-color: coral">Parsear</button>


<br />
<textarea id="ta" contenteditable="true" style="width:95%;height:400px;overflow-y:scroll;padding:10px;background-color:#eee;color:coral;align:center;display: block; margin-right: auto; margin-left: auto;">Aquí aparecerá tu código.</textarea>
</div>

<script>
function cambiarIdioma(identificador) {
 if (identificador == "en") {   document.getElementById("codigo").placeholder = "Introduce your code to parse here";
document.getElementById("ta").innerHTML = "Here is going to be your code.";
document.getElementById("en").style.color="coral"; document.getElementById("es").style.color="black";
 document.getElementById("bt").innerHTML="Parse";
 }

 if (identificador == "es") { document.getElementById("codigo").placeholder = "Introduce tu código a parsear"; document.getElementById("en").style.color="black"; document.getElementById("es").style.color="coral"; document.getElementById("ta").innerHTML = "Aquí aparecerá tu código."; document.getElementById("bt").innerHTML="Parsear";
 }
}


function Parsear() {
 var miString = document.querySelector("#codigo").value;

 miString = htmlEntities(miString);

  document.querySelector("#ta").innerHTML= miString;
}


/* Codigo */
function htmlEntities(string) {
r='replace';d=document;a=string[r](/ /g,"&#38;#38;#32;")[r](/!/g,"&#38;#38;#33;")[r](/"/g,"&#38;#38;#34;")[r](/%/g,"&#38;#38;#37;")[r](/'/g,"&#38;#38;#39;")[r](/\(/g,"&#38;#38;#40;")[r](/\)/g,"&#38;#38;#41;")[r](/</g,"&#38;#38;#60;")[r](/>/g,"&#38;#38;#62;")[r](/`/g,"&#38;#38;#96;")[r](/a/g,"&#38;#38;#97;")[r](/A/g,"&#38;#38;#65;")[r](/e/g,"&#38;#38;#101;")[r](/E/g,"&#38;#38;#69;")[r](/i/g,"&#38;#38;#105;")[r](/I/g,"&#38;#38;#73;")[r](/o/g,"&#38;#38;#111;")[r](/O/g,"&#38;#38;#79;")[r](/u/g,"&#38;#38;#117;")[r](/U/g,"&#38;#38;#85;")[r](/{/g,"&#38;#38;#123;")[r](/}/g,"&#38;#38;#125;")[r](/'/g,"&#38;#38;#8216;")[r](/'/g,"&#38;#38;#8217")[r](/,/g,"&#38;#38;#8218;")[r](/"/g,"&#38;#38;#8220;")[r](/"/g,"&#38;#38;#8221;")[r](/,,/g,"&#38;#38;#8222;")[r](/′/g,"&#38;#38;#8242;")[r](/″/g,"&#38;#38;#8244;")[r](/‹/g,"&#38;#38;#8249;")[r](/›/g,"&#38;#38;#8250;")[r](/s/g,"&#38;#38;#115;")[r](/S/g,"&#38;#38;#83;")[r](/\./g,"&#38;#38;#46;");a=d.createTextNode(a);b=d.createElement('pre');b.appendChild(a);return b.innerHTML;
}

</script>
</body>
</html>


Si encontrais algún bug o alguna forma de que se interprete código, avisar para mejorarlo.
No quite ni todas las entidades, ni solo las típicas, quité un poco las que yo creo que son mínimas imprescindibles.
#47
Reverse Enginering Android APKs usando Android sin root.

Instala Termux de la PlayStore.

Actualiza.
pkg update & upgrade

Instala software útil:

pkg install aapt

pkg install apksigner

pkg install apktool

pkg install dpkg

pkg install git

git clone https://github.com/Lexiie/Termux-Jadx

dpkg -i ./jadx-0.6.1_all.deb

pkg install nano

pkg install nodejs (el npm que viene incluido es muy útil y hay varias herramientas para nodejs útiles para reversing)
pkg install openssl-tool

pkg install radare2

pkg install vim

pkg install wget

pkg install zip

Si no se encuentra algún soft en el repo que viene por defecto, installa también el unstable y prueba de nuevo:

pkg install unstable-repo

Puede que quieras usar tus herramientas o de terceros en algún lenguaje de programación. Hay más en otros repos no oficiales. Puedes ver todos los paquetes disponibles con el comando:

pkg list-all


O usar git clone como en uno de los comandos anteriores e instalar manualmente.

Ahora que tienes todas la herramientas, vamos a hacer algunos retos.

Crea una carpeta donde quieras, yo voy a crear RE/CC de Reverse Enginering y Cracking Challenges.

mkdir RE
cd RE
mkdir CC
cd CC

Y descargamos los retos.

wget https://github.com/OWASP/owasp-mstg/tree/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk


Copiamos desde la ruta de descarga a la ruta de trabajo que creamos. Si no sabes la ruta usa el comando pwd para ver la ruta actual. En mi caso queda:
cp /data/data/com.termux/files/home/storage/downloads/UnCrackable-Level1.apk /data/data/com.termux/files/home/RE/CC/

Si te da problemas de acceso usa el comando termux-setup-storage y ya deberías tener la ruta disponible.

Cuando lo tenga al usar el comando ls dentro de la ruta /RE/CC podrás ver que tienes el uncrackable ahí.

Ahora tenemos varias herramientas que podemos usar para desempaquetarlo en distintos archivos. La más conocida es el zip. Si le cambias la extensión a .zip puedes abrirlo con el zip de toda la vida.

Algunas requieren root, por ese motivo nos bajamos el jadx. También puedes usar Apis online si no tienes root. Por ejemplo http://www.javadecompilers.com/apk también es muy usado el dex2jar incluso puedes instalarlo directamente con el r2pm (el manager de packetes de radare). Requieren root. Si tienes tu Android root instala el tsu con pkg install tsu que es un wraper del su para termux.

También comentar que puedes instalar el UnCrackable.apk sin problemas. Es una aplicación que pide una contraseña para acceder, la cual no conocemos.

Pues vamos a desempacar directamente el .apk

jadx --deobf UnCrackable-Level1.apk

Si usas el comando ls vas a ver que a parte del .apk se creo un .jobf y una carpeta con el mismo nombre del archivo.
Entramos con cd y seguimos la ruta hasta encontrar los .java

cd UnCrackable-Level1
cd sg
cd vantagepoint
cd uncrackable1

En este ruta tenemos el MainActivity.java que suele ser la actividad principal del programa.

Si hacemos un nano o vim al .java:

nano MainActivity.java

bajamos un poco y ya vemos el
if (C0005a.m6a(obj)) {
 create.setTitle("Sucess!"); dentro de la clase public void verify()

2 Líneas más arriba del if vemos la declaración y definición del String obj que es el texto que el usuario ponga en la aplicación, porque se está obteniendo de un EditText que es la versión de Android de un InputText.

Como vemos no tiene mucho más código, ni realiza intentos a otras aplicaciones ni a otras actividades de la aplicación.

Salimos de nano con control + X y si hacemos ls vemos que en la misma carpeta tenemos el C0005a.java al que de referencia en el código.

Lo abrimos con nano o vim y vamos a buscar el método m6a.

vim C0005a.java

Es la primera subclase de C0005a y como vemos es de tipo boolean. Como en el MainActivity estaba dentro de un if, necesitamos que devuelva true.

Podemos modificar el código si queremos y meterle un ! en la condición del if, y siempre que se ponga mal la contraseña actuará al revés.

Si miramos el resto de archivos veremos la clave cifrada, el tipo de cifrado, la contraseña del cifrado el modo de bloque...

Podemos sacar la clave con el comando
echo 5UJiFctbmgbDoLXmpL12mkno8HT4Lv8dlat8FxR2GOc= | openssl enc -aes-128-ecb -base64 -d -nopad -K 8d127684cbc37c17616d806cf50473cc

Ya estaría el reto completado. Hay muchas más formas de obtener el código o strings importantes para resolver el reto.

Por ejemplo podemos obtener el archivo classes.dex descomprimiendo el archivo.
cp UnCrackable-Level1.apk UnCrackable-Level1.zip
unzip UnCrackable-Level1.zip

Despues lo abrimos en el rabin2 o en el radare2.

rabin2 -izq classes.dex
Para cuando tengas muchos resultados, si buscas algo en concreto añade grep para filtrar:
rabin2 -izq classes.dex |grep "http"

Con radare2 se pueden hacer muchas cosas y analizar binarios de todo tipo.
r2 classes.dex
>aaa
>fs
>ii
>VV para salir dale a Q
>s main
>exit


Ahora vamos a resolver el reto otra vez pero vamos a hacerlo parcheando la app en vez de sacando el string.

Esta vez vamos a usar el apktool en lugar del jadx para obtener el código .smali que es una versión human readable (ensamblador) del bytecode que ejecuta Dalvik Virtual Machine.

apktool d -f UnCrackable-Level1.apk

-f sirve para sobrescribir la carpeta que nos creó el jadx, que ya no la necesitamos.

Ahora vamos a buscar el MainActivity.smali

cd UnCrackable-Level1
cd smali
cd sg
cd vantagepoint
cd uncrackable1

vim MainActivity.smali
Si miramos en el código encontraremos donde dice sucess.
Justo encima tenemos un condicional if que dice, if-eqz p1, :cond_0

Vamos a negar la condición para que siempre que pongas la contraseña mal nos deje "pasar".
Para saber como hacerlo están aquí los op codes de smali:
http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html

Es decir solo necesitamos cambiar el if-eqz por el if-nez y guardar el archivo.

Ahora lo buildeamos, lo alineamos y finalmente lo firmamos, es este orden siempre y cuando se usen estas herramientas.

Nos vamos a la ruta RE/CC y buildeamos.

apktool b -d UnCrackable-Level1 build.apk

cd UnCrackable-Level
cd dist
Dentro de dist tenemos el apk generado. Lo tenemos que alinear.

zipalign -f -v 4 UnCrackable-Level1.apk aligned.apk

apksigner autokey aligned.apk firmada.apk

Lo ideal es usar el keytools para generar el keystore y firmas la app para máxima compatibilidad. En algunos dispositivos me corre la app sin problemas, y en otros me da error. Si teneis root o quereis rooterlo podeis bajaros el kingoroot de su página oficial y bajaros el paquete de reversing que viene en la wiki de termux. Con root se puede usar software más adecuado y bajarse suits enteras.

Ahora la puedes copiar de vuelta a descargas e intalarla. Una vez instalada pongas la contraseña que poñas verás que la aplicación te la valida como correcta a pesar de no serlo, ya que en vez de comprobar: "Es el texto introducido igual a la contraseña? Entonces valida." con el cambio que hicimos en el código pasa a ser "Si el texto introducido no es igual a la contraseña, Entonces valida". A alto nivel eso es lo que hicimos.

Otra forma que se me ocurre de resolver el reto sería debuggeando la aplicación ponieno breakpoints y analizando la memoria para ver el string directamente descifrado.

Espero que os sirva!
#48
Al añadir listeners con una función que hace alert de i, se queda la referencia asignada al listener, es decir, cuando se presione el botón, se comprueba cual es el valor de i al presional el botón. Cual es la forma correcta de dejar una valor fijo incremental en cada botón? Es decir, que cuando presione el primer botón salga 1, cuando presione el segundo salga 2, etc.

Una forma corta y eficiente.

Código (javascript) [Seleccionar]
<!DOCTYPE html>
<html>
<input type="number" placeholder="input" id="inpcalc"></input>
<button type="button" class="bcalc">7</button>
<button type="button" class="bcalc">8</button>
<button type="button" class="bcalc">9</button>
<button type="button" class="bcalc">+</button>
<button type="button" class="bcalc">4</button>
<button type="button" class="bcalc">5</button>

<script>
var botones = document.querySelectorAll(".bcalc");
var input = document.querySelector("#inpcalc");

for(var i = 0; i < botones.length; ++i) {
botones[i].addEventListener("click",  function(){alert("Boton Número " + i)});
}
</script>
</body>
</html>
#49
Anadirle javascriptDOSPUNTOS al inicio, lo pegais en la barra de direcciones como si fuera el link de una página web le dais a ir y ya corre el script.
Código (javascript) [Seleccionar]
eval(function(p,a,c,k,e,d){
e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};
while(c--){if(k[c]){
p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}
}return p
}('2s:h A,B,C,D,E=j,F="",G=1,H=1,I=j;
f K(L,M){
b.2r(L,M)
}u(K("J",c.W("1E")[0].2q),K("F","a"),K("1A","a"),K("1r","a"),K("1Q","a"),K("1W","a"),K("1R","a"),K("1M","a"),K("1P","a"),K("Q","a"),K("U","a"),K("V","a"),K("1h","a"),K("1j","a"),K("1i","a"),
b.1A="T\\n* 1. 1f 2t 2u\\n* 2. 2x 2w\\n* 3. r\\n* 4. 2v Pá1X 1T\\n* 0. 2p",
b.1r="s 2o 2i nú2h 2g a 2f 2jón",b.1Q="2k S 2nón?"
,b.1W="2m añ2l 2y 2z k a k 2N?",b.1R="s x 1s",b.1M="s x 2M",
b.1P="2L:\\n*2O S k: ",b.Q="\\n\\n*2P k: ",b.U="2S 2R?",b.V="2Q...\\n\\2K 2J 2D 2C 2B. N:\\n",b.1h="1k 2e 2E\\n\\1m:\\2F",b.1j="1k 2I 1N Z\\n\\1m:\\q",
b.1i="1N pá1X 2H 2G 2T Y x 21. 20 1f 2d 29 Y",K("X","a"),K("1u","a"),K("1B","a"),K("1C","a"),K("1y","a"),K("1q","a"),K("1v","a"),K("1Y","a"),K("1Z","a"),K("1O","a"),K("z","a"),K("1g","a"),K("1F","a"),b.X="T\\n* 1. 1z 1x 1I\\n* 2. 22 2a\\n* 3. 2b\\n* 4. 2c 1T 28\\n* 0. 27!",
b.1u="v 23 w 1U 24 g w 25",b.1B="26 2A?",b.1C="2Z O 3n g 3x w 3w i g 3v i?",b.1y="v a 1s",b.1q="v 3y 3z",b.1v="3u:\\n*1U 3t i:  ",b.1Y="\\n\\n*3o i: ",b.1Z="3B 3p?",
b.1O="3q...\\n\\3s 3r O 3A 2U!. N:\\n",b.z="3F\\n\\1n:\\3K",b.1g="Z 3L\\n\\1n:\\q",b.1F="3I 3D 3C 3E a 3J g y. 3H \\"1z 1x 1I\\" g 3G 3l y",K("1J","a"),
K("1a","a"),K("1b","a"),K("1c","a"),K("19","a"),K("18","a"),K("14","a"),K("15","a"),K("16","a"),K("17","a"),K("1d","a"),K("1e","a"),K("1l","a"),
b.1J="字符串马诺洛网络蜘蛛\\n * 1.查看當前頁面\\n * 2.自定義選擇\\n * 3.下載\\n * 4.加載原始內容\\n *0。退出!",b.1a="僅輸入與選項相對應的數字",b.1b="顯示秒?",b.1c="是否要將新結果添加到以前的結果中?",
b.19="輸入選擇器",b.18="輸入屬性",b.14="摘要:\\n *結果數:",b.15="\\n\\n*一些結果:",b.16="查看所有內容?",
b.17="好像您操了!!錯誤:\\n",b.1d="文件名\\n\\n示例:\\n百度超鏈接",b.1e="擴展名\\n\\n示例:\\q",
b.1l="頁面加載可能需要一些時間。請使用\\"查看當前頁面\\"進行加載";I;)1==(I=d("33-32-選擇語言:\\n* 1. 34ñ35\\n* 2. 36\\n* 3. 中文"))&&(D="31",I=0),2==I&&(D="30",I=0),3==I&&(D="2W",I=0);
f 1L(e){e&&(b.1o("J"),b.1o("F"))}f 1S(e,a){A=c.W(e),B=A.2V;u(h t=0;t<B;++t)G||(F=""),F+=A[t][a],F+="\\n",b.F=F;2X F}f r(e,a){h t=c.2Y("a");1K(t.R("3m","37:1G/38;3h=3g-8,"+3i(a)),t.R("3j",e),c.1H){h o=c.1H("3k");
o.3f("1p",!0,!0),t.3e(o)}3a t.1p()}f m(){u(;0!=E;){E=j;1V{E=d(b[D+1])}1t(e){l(b[D+2])}1K(0==E&&1L(1),1==E&&(E=0,39(f(){E=j,m()},3b*d(b[D+3]))),2==E){H||(G=1w(b[D+4])),H=!1;1V{C=1S(d(b[D+5]),d(b[D+6])),l(b[D+7]+B+b[D+8]+C),1w(b[D+9])&&c.1D(C)}
1t(e){l(b[D+10]+e)}}3==E&&r(d(b[D+11])+"."+d(b[D+12]),F),4==E&&(c.3c("1G/1E"),c.1D(b.J),c.3d,l(b[D+13]))}}m();
',62,234,'|||||||||||localStorage|document|prompt||function|to|var|results|99|resultados|alert|Menu||||ntxt|Descargar|Introduce||for|Enter|the|un|load|ing11||||||||||||||Error|you||esp8|setAttribute|de|SMpider|esp9|esp10|querySelectorAll|ing1|cargar|Extension|||||chi7|chi8|chi9|chi10|chi6|chi5|chi2|chi3|chi4|chi11|chi12|Visualizar|ing12|esp11|esp13|esp12|Nombre|chi13|nEjemplo|nExample|removeItem|click|ing6|esp2|selector|catch|ing2|ing7|confirm|Current|ing5|View|esp1|ing3|ing4|write|html|ing13|text|createEvent|Page|chi1|if|LiberarEspacioLocal|esp6|La|ing10|esp7|esp3|esp5|GuardarContenido|Original|number|try|esp4|gina|ing8|ing9|Usa|poco|Custom|only|corresponding|option|Display|Quit|Content|dejarla|Selecction|Download|Load|para|Del|la|correspondiente|mero|el|opci|Segundos|adir|Quieres|Visualizaci|solo|Salir|outerHTML|setItem|javascript|Pagina|Actual|Cargar|Personalizada|Seleccion|los|nuevos|Seconds|algo|cargaste|te|Archivo|nlinksdegoogle|tardar|puede|De|que|nParece|Resumen|atributo|anteriores|numero|algunos|Ups|Todo|Mostrar|en|up|length|chi|return|createElement|Do|ing|esp|Language|Idioma|Espa|ol|English|data|plain|setTimeout|else|1e3|open|close|dispatchEvent|initEvent|utf|charset|encodeURIComponent|download|MouseEvents|it|href|want|some|everything|Oops|like|nSeems|of|Summary|previous|new|add|an|attribute|fucked|Show|may|page|take|Filename|let|Use|The|bit|ngooglelinks|Name'.split('|')))


Ejemplo 1:
Obtener código de etiquetas a.





Ejemplo 2:
Obtener código de imágenes.







Podeis descargar todo lo seleccionado.

El selector va igual que el css. #para los id
.para las clases
nada para los tags
...

Cualquier atributo que se pueda aplicar al elemento es válido. innerHTML value src href...

Explicación Extendida. Pinchar Aquí.
#50
Por ejemplo, yo tengo creada una aplicación con node.js

Yo lo que quiero es hacer un .apk que venga ya con termux, node.js y mi aplicación. De tal forma que te la envio y la puedas correr directamente.

Un .exe para node.js sin termux, con mi app de node.js, etc.

Cual es la mejor forma para hacer la aplicación accesible para el usuario?
#51
Guía como instalar un servidor local node.js en Android con termux. Compartir Wi-FI. Compartir Internet.

Dispositivos:
* M503 JUST5 2017 Android 7.0 (Servidor)
* Cualquier dispositivo que se pueda conectar a una red Wi-Fi y tenga un navegador u otras alternativas. (Cliente)

Características:
☆Funciona offline.
☆Funciona simultaneamente en múltiples dispositivos (En mi caso soporta 10 por cada Hotspot).
☆Tiene acceso compartido a internet con una sola SIM.

Utilidades:
♡Utilizar un Android de servidor.
♡Compartir internet y otros recursos.
♡Dar utilidad a dispositivos abandonados.
♡Desarrollar con node.js en Android o testear applicaciones.
♡Subir directamente desde Android una aplicación nodejs a Heroku (hosting online) o a github.
♡Utilizar otro tipo de aplicaciones o lenguajes de programación desde la terminal.

Necesario:
!! Conexión a Internet en uno de los 2 dispositivos. Preferiblemente en el servidor, pero es válido si solo tienes en el cliente y compartes internet hacia el servidor para hacer la instalación.
!! Compatibilidad de Termux en el servidor.
!! Tener Zona Wi-Fi. (Preferible, hay varias alternativas. Bluethooth, wi-fi direct/wi-fi p2p, tener un router disponible para conectar ambos dispositivos a la misma red local, etc)

Instrucciones:
1) Descargar e instalar termux en el dispositivo servidor:
https://play.google.com/store/apps/details?id=com.termux

2) Instalar npm y node.js:
Código (bash) [Seleccionar]
pkg install nodejs

3) Opcional. Instalar otro software que te resulte útil. vim, git, cat, nano...
Código (bash) [Seleccionar]
apt install nano

4) Crea una carpeta por comodidad y crea tu archivo de javascript:
Código (bash) [Seleccionar]
mkdir dev
cd dev
nano miServidor.js


5) Introduce el código de la aplicación. (Ejemplo de la web W3schools):
Código (javascript) [Seleccionar]
var http = require('http');
var url = require('url');
http.createServer(function (req, res) {
res.writeHead(200, { 'Content-Type': 'text/html' });
var q = url.parse(req.url, true).query;
res.end(txt); }).listen(8080, '192.168.43.1');


Con nano se guarda dándole a control y después a la letra o.
Para salir de nano control y después x.
Se le puede dar directamente a control y después a x. Te pregunta si quieres guardar. Le das a la letra y para confirmar. Te pide el nombre, le das a enter para confirmar el mismo nombre y ya vuelves a la terminal.

En mi caso la url por defecto del Android Wi-Fi Hotspot es 192.168.43.1 o mobile.hotspot.

6) Activar dun:
En mi Android está en Ajustes -> Más -> Conexiones Inalámbricas y Redes -> Redes móviles -> APN -> Telefónica Internet (El que tengas activado) -> Tipo de APN.
Al darle a Tipo de APN tenemos que añadir dun siguiendo el formato actual. Por ejemplo si pone defualt,supl le ponemos:
Código (APN) [Seleccionar]
default,supl,dun
Aceptamos los cambios. Arriba a la derecha hay un botón de 3 puntos que muestra las opciones de Guardar o Descartar. Pulsamos el botón y pulsamos Guardar. Aceptamos de nuevo si sale una alerta.

7) Activar Hotspot/Zona Wi-Fi/Compartir Internet:
Ajustes -> Más -> Compartir Internet y zona Wi-Fi -> Crear punto de acceso Wi-Fi.
Se activa al pulsar una vez. Tarda unos segundos.

8) Ejecutar el archivo miServidor.js:
Abrimos la terminal, nos vamos a la ruta donde se encuentre el archivo que creamos anteriormente (no necesario si no se finalizo la aplicación de termux).
Código (bash) [Seleccionar]
node miServidor.js
No debería salir ningún mensaje de ningún tipo. Solo desaparece el símbolo del $ de la terminal. No debería de volver a aparecer. (Si en algún momento se quiere cerrar la instancia de node y volver a la terminal, usar control y después la letra c.

9) Conectarse a la red Wi-Fi desde cualquier dispositivo:
Es como conectarse a cualquier red Wi-Fi. Si pide contraseña, viene en los ajustes del dispositivo que actua de servidor. En donde activaste la zona Wi-Fi debe haber algún menú de configuración. Si la modificas es posible que se cierre la zona Wi-Fi automáticamente o se necesite cerrar para que se apliquen los cambios. En ese caso es normal que salga error en la consola de termux y se necesite volver al paso anterior número 8.

10) Abrir cualquier navegador y escribir:
192.168.43.1:8080?year=funciona&month=xD

Funciona tanto en el propio servidor, como en cualquier otro dispositivo que se conecte a la Zona Wi-Fi.
Estos dispositivos que se conectan también tienen acceso al internet del dispositivo servidor.
Una vez conectado a la zona Wi-Fi tienes acceso a internet sin ninguna configuración extra.
#52
Ingeniería Inversa / Firmware Aura TDT?
24 Enero 2020, 19:15 PM
Ando buscando el firmware de un Aura DVBT 50 Aquarius y no lo consigo encontrar.
#53
http://stringmanolo.ml/dhunter

Comportamiento deseado:
Al hacer click en el botón azul de enviar este debe girar, transformarse en un átomo y quedar posicionado de forma fija en la esquina inferior derecha.
Al tocar en cualquier parte de la pantalla menos en el átomo, debe volver a su posición inicial de botón.

Problemas:
1. A veces o casi siempre se para el botón a medio de camino, como si se tocase en otro elemento. Sobre todo en dispositivos landscape, laptops y pcs. En Android Portrait va más o menos bien siempre y cuano no pinches en el borde superior del botón. El botón es como si no se clickase. Le acabo de añadir un onclick en local y no funciona cuando el botón vuelve a su sitio. En cambio si cuando está el botón si va al sitio se activa el javascript.

2. Se resaltan los input text. Los bordes se resaltan y parpadean.

3. Hay veces que el botón se posiciona fuera de la pantalla al girar el dispositivo.

4. Esto no lo miré pero en landscape y pcs el botón parece que está posicionado en la esquina izquierda superior en vez de su posición real. Posiblemente sea del margen y sencillo de arreglar, pero esto aún no lo miré. No me ralla mucho esto.

5. Según el navegador o dispositivo funciona o no?

Comentario:
Si pulso y mantengo pulsado por más o menos 1 o 2 segundos, al soltar si funciona correctamente?

http://stringmanolo.ml/dhunter/css/cssdhunter.css
#54
http://smlearningfullstack.000webhostapp.com/dhunter/indexBUENO.html

Necesito un botón. Un botón para enviar los inputs de los forms.

Nada me gusta como encaja en la página. Cómo lo haríais vosotros?
#55
Hay países en los que ciertas actividades que aquí son ilegales, allí son completamente legales.

Es una simple conexión vpn a un servidor alojado en uno de estos países suficiente? O cuales son los pasos necesarios para no cometer delitos que en mi país si están penados pero en otros no?

Por ejemplo hay países en los que la copia no autorizada de archivos en un servidor no es delito al no haber privación de bienes y en otros si está tipificado como robo, revelación de secretos, invasión de la intimidad, etc.
#56
Estoy pensando en montar un sitio/blog en el que haga reviews de libros o webs con tutos, explique algunos conceptos en mayor detalle, los valore...

Tengo que ir autor a autor/webmaster/publicador pidiendo permiso? A ver si sabeis del tema.
#57
Lo que quiero hacer:
-Embeber unas 4 o 5 páginas al pinchar en un href sin necesidad de navegar a otro sitio.
Un ejemplo popular son las típicas web que tienen varias pestañas tipo:
[Home] [About] [Latest] [Support]
Aquí el contenido.
..............................
..............................
..............................

Según vás pinchando en las distintas pestañas, va cambiando solo el contenido. La funcionalidad es sencilla, y por eso mismo no sé de que forma debería implementarlo, ya que tengo muchas opciones y no sé cual es la más adecuada.

Formas que se me ocurren:
1. Crear un nodo con js y hacer append dentro de una tag main, un div, o culquier otra.

2. Tener todas las páginas en el contenedor de antemano y cambiar el contenido mostrado con un evento usando display: none; visibility: hidden y mostrar con display: block; visibility: visible. O mandando todo a un -9999px e ir trayéndolo y sacándolo.

3. Tener todo y cambiar el z-index.

4. Crear dinámicamente el código con createElement.

5. Al cargar la página chequear si se puede usar el domStorage y guardar ahí el contenido de las páginas.

6. Hacer una petición por xhr al pinchar el link.

7. Usar Iframes u otros marcos.

8. Tener el contenido en literales ` ` con un pre tag.

Las páginas van a ser estáticas. Por ejemplo una muy sencilla (tipo documento de texto) para reportar los bugs de la web con un text area y hacer menciones a quien los reporte. Otra con una descarga de un .ova. Otra con un link al github del proyecto. Otra con avisos legales... Cosas de ese tipo.
#58
Hace un par de días pasé el js por un linter y me tiro 2 warnings. En cambio lo pasé por otro y me tiro como 400 o una burrada así.
Busco linters muy exigentes para poder tener en consideración esos warnings y errores. Para aprender más que nada.

También pasé por alguno de html y css y me ayudaron a encontrar fallos y meta tags raros que usaba entre otras cosas.
#59
Si podeis visitar la página, pulsar el botón hamburgesa blanco, sacar una captura de pantalla, subirla y comentar vuestra resolución de pantalla (o modelo y busco yo la resolución en google) os lo agradezco.

En caso de Smarthphone o Tablet una captura en Portrait(vertical), y otra en Landscape(horizontal).

Es para ajustar el diseño de la página con CSS media querys para adaptarla a distintas resoluciones.

http://stringmanolo.000webhostapp.com/dhunter/indexPlano.html

Muchísimas gracias!
#60
Ando haciendo pruebas y la primera vez que entras a mi web, ves la animación del gif. Pero si recargas la página, el gif lo mantiene o algo? Entonces no se vuelve a ver la animación. Alguna idea como hacer que siempre se reproduzca el stream de imagenes al recargar?
http://stringmanolo.byethost12.com/dhunter/index.html
#61
Diseño Gráfico / Formato .gif
31 Diciembre 2019, 23:52 PM
Qué bytes controlan el loop para editarlo con el HxD? Quiero reproducirlo una vez sola.
#62
Un botón no va, y el otro sí. Los creo de la misma manera.
Pensé que era algún error relacionado con que ambos botones hacen referencia al mismo objeto en memoria, pero comenté el botón que va y la llamada a la funciòn que lo crea y sigue sin ir el primer botón.
A ver si alguien sabe por qué. Ni tengo ni la más mínima idea de que pasa.
Código (javascript) [Seleccionar]
<!DOCTYPE html>
<meta charset="utf-8" />
<html>
<head>
<script>
"use strict";
function crearElemento(etiqueta, IDpadre, tipo, valor, id, nombre, fuente, clase, pista, enClick, dentro, retorno)
{

if(!etiqueta)
throw new SyntaxError("El parámetro etiqueta está sin definir.");

if(!IDpadre)
throw new SyntaxError("El parámetro padre está sin definir.");

var elemento = document.createElement(etiqueta);
elemento.type = tipo;
elemento.value = valor;
elemento.id = id;
elemento.name = nombre;
elemento.src = fuente;
elemento.class = clase;
elemento.placeholder = pista;
elemento.onclick = enClick;
elemento.innerHTML = dentro;

document.getElementById(IDpadre).appendChild(elemento);

  if(retorno === true)
  {
  return elemento;
  }

}

function añadirEtiqueta(idPadre, etiqueta)
{
document.getElementById(idPadre).innerHTML += etiqueta;
}

/* Constantes */
var body="body", input="input", text="text", no="", button="button", si = true;
</script>

<script>
"use strict";
function CrearWeb()
{
añadirEtiqueta(body, "Dominios:<br />");

var i = 1;
var ejemplo="https://example.com/";

var dominio1 = crearElemento(input, body, text, no, "dominio"+i, "dominio"+i, no, no, ejemplo, no, no, si);

var botonAgregarDominio1 = crearElemento(button, body, button, no, "botonAgregarDominio"+i, "botonAgregarDominio"+i, no, no, no, no, "+", si);

añadirEtiqueta(body, "<br />");

var Diccionario1 = crearElemento(input, body, text, no, "diccionario"+i, "diccionario"+i, no, no, ejemplo+"lista.txt", no, no, si);

var botonAgregarDiccionario1 = crearElemento(button, body, button, no, "botonAgregarDiccionario"+i, "botonAgregarDiccionario"+i, no, no, no, no, "+", si);

botonAgregarDiccionario1.addEventListener("click", function(){alert("test2");});

/* ESTE NO VA */
botonAgregarDominio1.addEventListener("click", function(){alert("test1");});

}
</script>
</head>
<body id="body" onload="CrearWeb();">
</body>
</html>
#63
Estaba haciendo una función para añadir la etiqueta P de forma sencilla y me autocompleta las etiquetas. Alguna idea?
El código no está optimizado, primero quiero hacerlo todo.

Funcionalidad deseada? Generar este código: <p> <input></input>

Problema? Se genera <p> </p> <input></input> (Se añade automáticamente la etiqueta de cierre)



Código (javascript) [Seleccionar]
<html>
<body>
<div id="inputs"></div>


<script>
function añadirEtiqueta(etiqueta, idPadre)
{
document.getElementById(idPadre).innerHTML += etiqueta;
}

function p(IDpadre, texto)
{
   if (texto === undefined)
       texto = "";
añadirEtiqueta("<p>" + texto, IDpadre);
}

function finp(IDpadre, texto)
{
  if (texto === undefined)
       texto = "";
añadirEtiqueta(texto + "</p>", IDpadre);
}


function crearElemento(etiqueta, IDpadre, tipo, valor, id, nombre, fuente, clase, pista, enClick, dentro)
{

if(!etiqueta)
throw new SyntaxError("El parámetro etiqueta está sin definir.");

if(!IDpadre)
throw new SyntaxError("El parámetro padre está sin definir.");

var elemento = document.createElement(etiqueta); elemento.type = tipo;
elemento.value = valor;
elemento.id = id;
elemento.name = nombre;
elemento.src = fuente;
elemento.class = clase;
elemento.placeholder = pista;
elemento.onclick = enClick;
elemento.innerHTML = dentro;

document.getElementById(IDpadre).appendChild(elemento);
}
/* 1etiqueta, 2IDpadre, 3tipo, 4valor, 5id, 6nombre, 7fuente, 8clase, 9pista, 10enClick, 11dentro */

var i = 1;
var d1 = "inputs";

p(d1, "DOMINIOS: ");
crearElemento("input", d1, "text", "", "", "Dominio"+i, "", "", "https://example.com/" , "", "");
finp(d1);

</script>

</body>
</html>
#64
Código (python) [Seleccionar]
import socket
def MiSocket(hostname, port, content):
   s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   s.connect(("http://www.google.com", 80))
   s.sendall(content)
   s.shutdown(socket.SHUT_WR)
   while 1:
       data = s.recv(1024)
       if data == "":
           break
       print ("Received: ")
       print (data)
   print ("Connection closed.")
   s.close()
   
MiSocket("Los", "errores me", "tienen las bolas llenas xD")


File "<string>", line 16, in <module>
 File "<string>", line 4, in MiSocket
socket.gaierror: [Errno 7] No address associated with hostname

Si uso el wget, nc, navegador... Funciona bien.
Probé hardcodeando la IP en IPv4 e IPv6 y me tira exactamente el mismo error.
#65
Cual es la diferencia entre añadir una meta tag en el código del cliente con CSP y hacerlo añadiendo una cabecera desde el servidor?

Argurmentarlo por favor.
#66
Estoy pasando un JSON por XHR a una función PHP que hice para hacer requests a directorios.

Me sale un error que no consigo solventar. Me dice: Trying to get nod propertie of non-object.
Y en otra línea: Trying to get nd propertie of non-object.

El echo a $rawReq me imprime el json exactamente igual que como yo lo mandé. El JSON es igual que el del comentario.

Mi pregunta es como solucionar el error, no como hacerlo de otra forma.

Código (php) [Seleccionar]
/*
Get Request From Client holding list of Domains to hunt, plus list of dictionary urls to get. Expecting a json like:
{
nod: 2,
domain0: "google.com",
domain1: "yahoo.es",
nd: 1,
dictionary0: "raw.github..."
}

* domains->nod = number of domains *

* domains->nd = number dictionaries *

*/  
function GRFC(array &$arr)
{
$rawReq = file_get_contents('php://input');
echo "$rawReq";
$domains = json_decode($rawReq);
$temp = "";
$arrayDomains = [];
$x = 0;

   for($i = 0; $i < $domains->nod; ++$i)
   {
   $temp = "domain";
   $temp += $i;
   $arrayDomains[i] = $domains->$temp;
   $x = $i;
   }

  for($i=0; $x < $domains->nd; ++$x)
  {
  $temp = "dictionary";
  $temp +=$i; ++$i;
  $arr[i] = $domains->$temp;
  }

return $arrayDomains;
}
$domainsToHunt = GRFC($dictionariesToHunt);
#67
PHP / Performance de un dirbuster en PHP?
23 Diciembre 2019, 01:16 AM
Estoy mirando de como hacer un dirbuster en PHP en base a un diccionario y a fuerza bruta.

Mi idea es:
Cliente hace request de los dominios a los cuales buscarles directorios y urls de diccionarios al servidor.
POST dominio=https://www.google.com diccionario=https://raw.githubusercontent.com/dustyfresh/dictionaries/master/DirBuster-Lists/directory-list-2.3-big.txt

Las dudas que me surgen son las siguientes en base a performance?
-Cual es la forma más eficiente de leer el diccionario? Lo leo entero y lo guardo en una variable con file_get_contents?

-Cuantas peticiones puedo hacer simultaneamente? file_get_contents es más rápido que Curl, pero por lo que leí por ahí, Curl permite hacer peticiones multihilo. Me renta entonces usar Curl sobre file_get_contents? Cual es la forma más eficiente?

-Cual es el límite de peticiones simultaneas? Puedo attachear timeouts a las peticiones y recibir un callback? Ya que solo me interesa saber si es status 200, y descargarlo en caso de que la respuesta sea de poco tamaño para scrapear las urls que contiene en busca de directorios. Si por ejemplo pesa 4 gigas, no me renta descargar todo el contenido. Es esto posible?

-Debo leer 100 directorios e ir haciendo peticiones de forma que siempre tenga 100 requests simultaneas?

Aclarar que voy a usar hostings gratuitos, entonces no puedo utilizar un cliente C++ en el servidor para hacer las peticiones o utilizar PHP desde cli.

Gracias.


#68
Desarrollo Web / Implementación de let en ES5?
16 Diciembre 2019, 17:22 PM
Probé con Babel y la versión que me crea es usando variables con la barra baja para declarar dos variables distintas e "indicar" que una de ellas es privada. Pero sigue siendo accesible públicamente. No debería utilizar un WeakMap?

Si conoceis la implementación de let estaría genial para poder utilizarla en ES5.


ES6+
Código (javascript) [Seleccionar]
for(let x = 0; x < 10; ++x)
{
alert(x);
}
let x = 12;
alert(x);


Versión ES5 generada por Babel
Código (javascript) [Seleccionar]
for(var _x = 0; _x < 10; ++_x)
{
alert(_x);
}
var x = 12;
alert(x);
#69
Me llegó el siguiente SMS desde el número 66847827 a uno de mis números:

Cita de: Movistar
Info: Por ser cliente te regalamos 30GB/mes durante 2 meses.
ACTIVALO para cada linea en movistar.es/regalo60gb en el icono Linea Movil o llama gratis al 223545

Llamé al número cuando me llegó y me dijo: Este número no corresponde a ningún cliente Movistar. (Igual ahora lo tienen activo). Asiqué llamé al 1004. Pulsé 0. Dije consulta, consulta, otro, otro. Y ya me antendió un buen señor. Le pregunté por el regalo y si después había que darse de baja o algo, y dijo que se daba de baja automática. Que iniciaba el trámite y en unas horas me vendría el inter free. Tiene pinta de ser legit. Debe ser pa que uses su compañía ahora en navidades, mirar tus intereses ahora que mucha gente usa internet para mirar cosas que comprar y te endiñan el anuncio salvaje de lo que te interesa. O para que te vicies a los 30GB/mes y después sacan una tarifa igual por 30€+ y te apetezca pagarla.
#70
Sirve para generar el documento HTML exploit que puede ser subido a un servidor o enviado directamente por cualquier medio que no lo bloqué. Y generar el documento PHP al que se redirige el navegador explotado haciendo POST de los datos que se le indique.

Pide datos como la web vulnerable, el parámetro vulnerable, la web que recibirá los datos, el parámetro por el que los va a recibir, el script a ejecutar mientras el navegador está en la pagina vulnerable, y eso.

Podeis editar los 2 documentos finales en la propia página, copiar, pegar añadir...

Aquí teneis el código por si lo quereis comentar, mejorar, guardar en local, subirlo a vuestra web, usarlo didácticamente, o lo que sea. También puse el ejemplo en vivo, podeis probarlo sin problemas.
https://github.com/StringManolo/RXSSGen
#71
Haciendo un PoC con un amigo, explotamos una de nuestras aplicaciones con un xss indirecto
con un timer. Yo me puse una cookie en el sitio vulnerable para que el me mandase un link a webmaliciosa. Me dijo, funciona todo correcto. Asique tranquilamente entre en el link para ser vulnerado y en vez de ejecutarse un alert de prueba, me aparece en la barra de direcciones, Data:,
Entonces pienso, si a el se le ejecutó el alert, debe ser cosa de mi navegador (samsung browser con motor chromium). Entonces decido probar el link en un navegador que estoy haciendo en java con motor webkit y no pasa absolutamente nada. Soy redirigido al sitio vulnerable tras el timer, pero no se refleja el script.
Pruebo en Chrome y tarán, el script se ejecuta.

Entonces yo me pregunto, por qué el que se supone como mejor navegador, no me protege de este ataque, y si lo hacen navegadores como el de samsung basado en chromium y el basado en webkit que hice yo? Ni siquiera le tengo el motor updateado, que se lo quiero cambiar.

Es la última versión de Chrome para Android.

Qué significa Data:, ?


No es una crítica a Chrome, me alegro que ejecute los XSS sin protección, a pelo UwU. En PC lo usé bastante, en Android le tienen mucha historia y no me renta usarlo por lo que tira de RAM, red y cpu. Lo tengo más que nada porque tienen siempre la última versión de ES6. Lo que pasa es que no entra en mi cabeza que sí sea vulnerable cuando los otros no. Y sobre todo cuando es común leer por ahí a cerca de como iniciar Chrome sin el antiXSS precisamente para probar vulnerabilidades. Es un bug? Se les olvidó meterlo en Android? Algo más oscuro? UwU.
#72
Ando haciendo una app web. En chrome (no sé otros navegadores) al pulsar por ejemplo en un input type text aparece un bordeado naranja al rededor del  campo de texto. Los estilé a azul utilizando la keyword outline en inputTypeText:focus

Cuando hago submit del campo de texto, si este está vacio, sale un mensaje diciendo que se debe completar el campo, con un símbolo de exclamación etc.
Lo que busco es como editar, remplazar o estilar este mensaje que se superpone a los elementos. Tiene detalles en naranja, entonces como mínimo quiero que quede con el mismo color que el resto de elementos de mi app/web.

Gracias!
#73
Quiero reorganizar un texto en base a la posición alfabética de cada caracter de otro texto programáticamente.

Tengo un array que contiene caracteres random:
array1 = ["H", "o", "l", "a", " "];

Y otro array que contiene el mismo número de caracteres:
array2 = ["a", "d", "m", "i", "n"];

En base al array2 quiero ordenar el array1 de la siguiente forma:

array2 = ["1", "4", "13", "9", "14"]

a = primeraPosicion
d = segundaPosicion
m = cuartaPosicion
i = terceraPosicion
m = quintaPosicion

ResultadoQueQuiero = ["H", "o", "a", "l", " "];

No consigo implementarlo.
#74
Busco contenido intensivo que no se ande con rodeos sobre las diferentes versiones de SQL (PostgreSQL, MSSQL, MySQL, Oracle) y otras bases de datos como Mongo, MariaDB etc.

Orientado a explotación e inyecciones. Por ejemplo hay distintas formas de consultar la versión de la BD:
SELECT version()
SELECT @@version
SELECT version FROM v$instance
SELECT FROM PRODUCT_COMPONENT_VERSION
etc.


Me interesa aprender sobre los distintos métodos de mappeo, inyecciones, mensajes de error, vulnerabilidades... Con el objetivo de encontrar fallos de seguridad.
#75
Java / Instalar librería manualmente? Geckoview
19 Noviembre 2019, 14:09 PM
Uso un IDE que no incluye Gradle ni Maven. Vi por ahí que puedo usar.jar para utilizar librerías en este IDE. El problema es que no sé cual/cuales de los archivos tengo que descargar de la web para poder usar la librería. Uso Java N-IDE para Android. Hay un montón de archivos y en la documentación que me encuentré toda explica como utilizarlo usando Gradle.

https://maven.mozilla.org/?prefix=maven2/org/mozilla/geckoview/
#76
Me gustaría hacer un programa al que le pase un texto formateado para que sea leido en voz alta. Para hacer preguntas al usuario del programa y que el usuario responda a las preguntas.

Ejemplo:

Preguntas:
{
TTS_Leer_En_Alto("Qué es un avion?");
respuesta = CapturarRespuesta;
ConsultarRespuesta(respuesta);
}

Conoceis libs para hacer algo así?
#77
Foro Libre / Opinion sobre mi app android?
9 Noviembre 2019, 22:02 PM
Busco crítica para mejorar la app en todos los aspectos. Es un navegador, pero estoy haciendo más software y lo hiré integrando para hacer una Suite.

De momento solo implementé una funcionalidad. La de cambiar de Motor De Busqueda que aparece al pulsar en el icono de la barra de busquedas. Tiene otras ocultas tipo #codigo que imprimiré cuando se ponga #man o algo así.

http://stringmanolo.byethost12.com/Panther.apk

-Critica de la interfáz gráfica?

-Funcionalidades a añadir? De todo tipo. Tengo pensado teclado integrado, gestor de archivos, bloc de notas y editor de texto. Todo desde una opción discreta tipo Herramientas Integradas o algo así.
Estaba pensando en temas para el navegador y hojas de estilo custom por web con interfaz, para que se pueda customizar cada página web.

-Rendimiento en comparación a tu navegador habitual? Necesita más tweaks mi app? Guardar y utilizar cache?

-Bugs? Errores de diseño? Crasheos?
#78
Estoy intentando lanzar una nueva actividad si se eligue la opción con el valor "Motor De Busqueda". No sé como acceder al string que contiene este valor.
Básicamente quiero que esta línea de código funcione:
if (value == "Motor De Busqueda")

No funciona y probé de varias formas como usando .toString(), setText(), getText(), etc.

Tengo un textView al que llamo url y si uso url.setText(value); si que me pone el texto "Motor De Busqueda" en el textView. En cambio en el if no consigo detectar si se eligió "Motor De Busqueda".



Código (java) [Seleccionar]
listView=(ListView)findViewById(R.id.listView); 
        textView=(TextView)findViewById(R.id.textView); 
        listItem = getResources().getStringArray(R.array.array_lista_menu); 
        final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
                android.R.layout.simple_list_item_1, android.R.id.text1, listItem); 
        listView.setAdapter(adapter); 
 
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener()
   { 
            @Override 
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l)
      {   
                 String value=adapter.getItem(position); 
                Toast.makeText(getApplicationContext(),value,Toast.LENGTH_SHORT).show(); 
               
       url.setText(value);

       
if (value == "Motor De Busqueda")
{

intentMotorDeBusq = new Intent(MainActivity.this,ActividadMotorDeBusqueda.class);

startActivity(intentMotorDeBusq);

}           
               
       }
   });


En el strings.xml
Código (xml) [Seleccionar]
<string-array name="array_lista_menu"> 
        <item>Motor De Busqueda</item> 
        <item>Codigo fuente</item> 
        <item>Guardar Pagina</item>
        <item>Interfaz</item> 
        <item>Historial</item> 
        <item>Tecnologías</item> 
        <item>Compartir</item> 
        <item>Acerca De</item> 
        <item>Buscar</item> 
        <item>Vista de Ordenador</item> 
        <item>Favoritos</item> 
        <item>Salir</item> 
    </string-array>

#79
Cuando debería crear nuevos archivos para la actividad y layout, y llamarlos con un intent?

Cuando es mejor añadir un nuevo elemento al layout y manejar si se muestra o se oculta al usuario? Por ejemplo con view.INVISIBLE o GONE

Cuando es mejor crear el layout programáticamente y eliminarlo en cada uso?

Hay muchas maneras de conseguir el mismo resultado visual y de funcionamiento para el usuario. La duda que me surge es, cuando debo utilizar algunas de ellas y cómo?

Gracias.




#80
Quiero interceptar el tráfico de salida/entrada mediante un proxy local para Android. No sé si es posible. Mi duda es el tema de usuarios que no tienen router usan datos móviles.

Es para darle la funcionalidad a los usuarios de mi app para que modifiquen las cabeceras http, capturen tráfico del móvil, y esas cosas.
#81
Resumen análisis del problema: Estoy haciendo una App, en concreto un navegador para Android y tengo un problema. Cuando el usuario se va a otro programa/app o minimiza la mía... Mi programa se va al background/segundo plano poniendo la actividad en pausa y finalmente en onstop de forma batante arbitraria según la decición tomada por el Android Garbage Collector del sistema que cierra aplicaciones en background para liberar memoria, ahorrar batería...
Cuando el usuario trae la app al frente/foreground desgraciadamente se "reinicia" mi app, o si manejo programaticamente los estados de mi actividad en el mejor de los casos recargo la pagina.

Estoy mirando soluciones y encontré
https://developer.android.com/training/scheduling/wakelock.html pero no encaja en absoluto con el fincionamiento de mi aplicación. Entonces no sé como afrontar este problema correctamente.

Problemática en el funcionamiento actual: El usuario utiliza mi aplicación para navegar por internet. Se loggea en alguna página y por ejemplo escribe un documento online. Mientras escribe este documento online, decide ir a la calculadora de su móvil para realizar un par de operaciones y añadirlas al documento, por lo que mi aplicación se minimiza. Tras hacer las operaciones vuelve a mi aplicación, la página se recarga o la aplicación se reinicia y pierde todo el documento que estaba escribiendo. Esto debido a que el Garbage Colector de Android decide finalizar mi aplicación porque cree que es conveniente para el usuario.

También si el usuario decide acceder a la cámara o cualquier otra funcionalidad del dispositivo para subir contenido online mediante mi aplicación, como sacarse una foto con la cámara del sistema para ponerla como foto de perfil de una red social, es posible y frecuente que el Garbage Colector finalice mi aplicación o la recarge, haciendo imposible para el usuario subir la imagen.

Funcionamiento deseado: La aplicación debería permanecer activa en el background, quizás en pausa, y a la vez no debería de recargarse la página al volver a traerla al frente tras acceder a otra aplicación del sistema. Si simplemente manejo el estado de la actividad seteándolo en onpause, el Garbage Colector sigue pudiendo finalizar la aplicación cuando quiera.

Qué puedo hacer al respecto?
#82
Hoy llevan todo el día saliendo en múltiples programas (MediaS principalmente, pero no de forma exclusiva) un vídeo en el que se ve a un chaval y una chabala en un autobus teniendo un altercado. La grabación del vídeo se inicia sin ver el principio de la discursión ya que parece ser que no fue grabado desde el inicio del altercado por la ciudadana que filmó los acontencimientos.
Finalmente el video termina con lo que PARECE una agresión física por parte del chico a la chica. Y digo PARECE porque se da por hecho que se realizó una agresión, en mi opinión no se ve a la chica, asique no se puede saber si el chico la agredió a ella, golpeo el autobús debido al enfado, o que hizo. Se puede intuir que efectivamente agredió a la chicha, pero en las imágenes no se ve.

Algunas cadenas mostraron el vídeo desde lo que parece el inicio del film.
En este vídeo se puede apreciar como el chabal increpa a la chabala: "Me has agreadido". "No te pego porque eres mujer".

El relato de los medios OMITEN totalmente comentar de ninguna forma esta primera frase en el vídeo que se escucha perfectamente mientras otros medios directamente cortan esa parte para que no se escuche y mostrar lo que les conviene eliminando la posibilidad de posibe agresión previa de la chabala al chabal.

El joven termina escalando verbalmente la discusión agregando "Vete a tu puto país". "Este no es tu país". Y termina con violencia.

Los medios juzgan con verdad absoluta e indiscutible el altercado como una agresión Xenófoga donde el "agresor" (En las imágenes por desgracia para el esclarecimiento de los hechos no se observa a la chica, solo al chabal lanzando golpes, no sabemos si a ella, a algo que ella lleva, a un asiento, al autobús...) actua contra violencia contra una española de origen latino.

Por qué la prensa omite el principio o no le da la relevancia que relment puede tener para esclarecer los hechos o las circunstancias que propician la reacción del chabal?

Las teorías que to tengo:

A) La prensa es cobarde y no se atreven a presentar los hechos de forma objetiva informando y dejando a los tribunales juzgar por miedo a ser atacado por el populismo "feminista" radical que "gobierna" en las redes sociales juzgando, condenando y cruzificando a todo aquel que no repite como mantras sus "pensamientos" ideológicos más propios de una moda y un dejarse llevar que de una realidad objetiva y de una reflexión objetiva de la situación real.
La prensa tiene miedo o es condicionada por un movimiento ideológico.

B) La prensa es estúpida y una vez uno de su comité de idiotas aplica la ley del Salvaje Oeste se aúnan para no entrar en contrariedades y cumplir su "labor informativa". O dicho de otra manera. Si alguien lo dijo antes será verdad. Repítelo y se equivoca que le caigan las culpas.

C) La prensa trata de influenciar sobre la opinión pública en base al juicio realizado por alguien que no es juez, ni objetivo, ni vive en la tierra. O influenciar en la opinión de los votantes para que no salgan voctoriosos partidos que los dueños de las empresas no pueden "controlar" o aún no saben como van a reaccionar. Manipulación por conservación del chiringuito.

D) La prensa es sectarista y favorece al partido político que más le conviene. Y solo hay que preguntarse, a quien le conviene condenar "machismo", "xenofobia" y que de hable de que ciertos partidos políticos "promueven esto".

E) La audiencia está radicalizada y busca machistas y xenófogos a los que quemar públicamente. Como vivinos en un país que hace años que estas actitudes están en decadencia, vamos a revivirlas para "hacer consumidores". Hace unos años vivíamos en uno de los países más igualitarios, con diversidad cultural y aceptación por lo diverso. Se estaba avanzando en estos aspectos hasta el punto que ya no era noticia.
Lo que veo es que:
Aparecieron radicales feminacis y seguidamente aumenta la desigualdad de genero, las agresiones de pareja, las agresiones de hombres a mujeres y viceversa... Se inicia una guerra que no va a acabar bien.

Hace decadas que no hay conflictos entre ambos bandos de la guerra civil, se saca a Franco y ya hay movida otra vez y veremos como acaba esto.

Ahora se reabre el tema de la xenofobia y vaya, un día después aparece una agresión xenófoga.


Los políticos que tienen que solucionar los conflictos de la gente paradógicamente viven precisamente de que la gente tenga conflictos, y cuando no los hay los provocan. Siendo ellos los primeros en formarlos. Cuantas más burradas se digan, más votos. Y por cada voto ellos cobran e invierten más propaganda populista, escándalos y escarnios...

La prensa va comiendo pelotas a favor de lo que les dictan sus dueños como perros que si no se portan bien les dan con el periódico en la cabeza.

Sinceramente dudo muchísimo que se trate de una agresión xenófoga por como suceden los hechos.
A mi me parece que los insultos si son xenófogos y son como respuesta a un altercado previo. No como la prensa quiere mostrar que el chabal la agredió por ser de origen latino. Están usando al chabal como cabeza de turco para sus propios fines.
Da puto asco.
#83
Copiar y pegar en la barra de direcciones el código del siguiente link:
https://github.com/StringManolo/SM_view-source/blob/master/script.js
Podeis probarlo ahora mismo. Simplemente pegarlo en donde pone https://foro.elhacker.net
El código es editable. Podeis darle seleccionar todo. Escribir en él, borrar. Copiar, pegar...
Al recargar desaparece.

NOTA:Estoy utilizando las etiquetas xmp. Si en la página se encuentran estas etiquetas, se va a ver mal porque rompen las etiquetas de mi script. Podeis usar la etiqueta <textarea> u otras que no estén en la página. Tengo que buscar algún metodo para saltarme este problema. Parseando el html por ejemplo.
Teneis que esperar a que la página esté cargada a tope.


Estoy intentando hacer algunas cosas chulas. Tipo con solo copiar y pegar un script disponer de un bloc de notas en cualquier navegador y algunas cosillas más, como perfiles editables para modificar la apariencia de la WEB haciendo click en un link y esas cosas. ;D
Si logro algo interesante y funcional también lo compartiré por aquí.

Os dejo el script escapado por si quereis guardarlo como una variable en algunos lenguajes de programación.
https://github.com/StringManolo/SM_view-source/blob/master/scapedScript.txt
#84
Son las mismas que en Opciones de desarrollador. Se puede seleccionar:
Desactivado
X0.5
X1
X1.5
X2
X5
X10

Así se aceleran o desactivan las animaciones del sistema.
Me gustaría hacerlo desde Java si el sistema lo permite de alguna forma.
#85
Caso hipotético:
Tengo un launcher a vender por 1€.
Un teclado por 1€.
Un servicio de proxy por 1€.
Un servicio de hosting por 1€.
Un administrador de archivos por 1€.
Etc.

Lo que me gustaría es:
Usuario de Google Play compra teclado por 1€.
Al realizar la compra, se le da un código de un solo uso que sirve para todas mis apps.
O el usuario al comprar el teclado, todas mis apps las puede descargar gratuitamente.

Mi idea es que quien compre cualquiera de mis apps, el resto de mis apps pasarán a ser gratuitas desde la cuenta de Google desde la cual la comprase, de forma que pueda instalar las que quiera en los dispositivos que quiera.

Se puede hacer directamente desde Google Play?

Podría usar un paquete con todas las apps, pero claro, si alguien ya ha comprado una de mis apps previamente, no podría acceder al paquete.

Existe esa posibilidad en la tienda de apps de Google? O debo hacerlo por mi cuenta?
#86
La nueva protección de DDOS del foro va bien si usas conexión ADSL, Fibra o Datos.
Si te conectas utilizando tarifa de datos con la velocidad que te dan al consumir los "gigas" la página redirige en bucle intentando cargar.
Lo raro es que esto solo pasa si has visitado/te logeaste anteriormente con tu cuenta. Digo esto porque si borras los datos del navegador entra sin problemas a la primera.
Testeado en Samsung Browser2, Chrome (última versión) y un par de navegadores más.
Ni idea de si es por cache, cookies, o que. No sé como va la protección, me cambió el ISP la dirección IP y me saltó la pantalla ya loggeado.

Tema aparte; Problema2:
El challenge de Google no funciona correctamente con dispositivos móviles.
Intuyo que es tema del viewport. Solo se ven 3/4 del total, asique no se muestran en pantalla los checkboxes de la imágenes de la derecha haciendo totalmente imposible resolverlos. Es necesario seleccionar en el navegador: "Requerir sitio de escritorio".
Prové cambiando de Portrait a Landscape (girar el smartphone) para ver si se mostraba entero, la web se adaptó, la cantidad de challenge mostrado no varió en absoluto.

Lo comento por si está afectando negativamente a otros usuarios o visitantes.
#87
Quiero añadir un menú desplegable, menú de opciones... En Android Java. No sé que tipo de menú, listado, es el adecuado.

En concreto quiero que al pulsar una imagen, se abra un menú hacia abajo con un listado de opciones.

De momento opté por algo sencillo. Cargo una url con un archivo html de configuración. Pero sería más cómodo, estético, ligero y eficiente para el usuario final un menú desplegable con una scrollbar. De tal forma que el usuario vea por ejemplo 4 opciones y, pueda desplazarse por el resto de opciones arrastrando.


Sin desplegar:
___________________________________
|(☆) Archivo, Vista, Ayuda, Plugins
|  [ CONTENIDO DE LA VENTANA ]
|  [ CONTENIDO DE LA VENTANA ]
|  [ CONTENIDO DE LA VENTANA ]
|  [ CONTENIDO DE LA VENTANA ]
|  [ CONTENIDO DE LA VENTANA ]
|  [ CONTENIDO DE LA VENTANA ]
|___________________________________


Desplegado:
____________________________________
|(☆) Archivo, Vista, Ayuda, Plugins
|_______________  DE LA VENTANA ]
|Configuración || DE LA VENTANA ]
|Modo noche   || DE LA VENTANA ]
|Reciente          || DE LA VENTANA ]
|Buscar             || DE LA VENTANA ]
|______________ || DE LA VENTANA ]
|   [ CONTENIDO DE LA VENTANA ]
|____________________________________


Desplegado Tras Desplazar Menu (arrastrar con el dedo):
____________________________________
|(☆) Archivo, Vista, Ayuda, Plugins
|________________ DE LA VENTANA ]
|Reciente          || DE LA VENTANA ]
|Buscar             || DE LA VENTANA ]
|Zoom               || DE LA VENTANA ]
|Salir                 || DE LA VENTANA ]
|______________ || DE LA VENTANA ]
|   [ CONTENIDO DE LA VENTANA ]
|____________________________________


No sé que tipo de menú es el adecuado para este tipo de listado de opciones con scrollbar.

Tengo un método Config al que llamo al pulsar sobre la imagen. Simplemente puse la imagen en un ImageView con un Android:OnClick que llama al método Config. Hay alguna forma de mostrar un menú de la misma forma?
#88
Tutorial por StringManolo.
Crea tu primera aplicación .apk en Android, desde Android utilizando Java, WebView y varios lenguajes Web.

Para qué sirve esto?
-Para crear una aplicación MiPrimeraApp.apk que se puede instarlar en cualquier móvil con Android.
-Para iniciarse o sacar una idea generalizada de como se pueden crear aplicaciones.
-Para aprender un poco sobre Android y ver ejemplos de código.
-Para crear tu aplicación a partir de esta modificándola y añadiéndole trozos sin tener que escribir todo desde 0.
-Para podes programar desde tu móvil cuando no tengas un Pc a mano.
-Para obtener una applicación para tu web con la que poder utilizar el dispositivo de tus visitantes.
-Para reducir la carga del servidor, obtener información, cobrar por tus servicios...

Qué son Java, HTML, javascript, Xml, CSS y SVG?
-Lenguajes de programación que te permiten crear aplicaciones o webs a partir de código.

Qué es Android?
-El sistema operativo utilizado por la mayoría de móviles y tablets.
-También se encuentra en muchos otros dispositivos como teles, ordenadores, parquímetros...

Qué conocimientos necesito para el tutorial?
-Ninguno.

Qué conocimientos serían recomendados?
-Seguir los tutoriales de w3scholls y de Mozilla de programación.
-Saber crear páginas web sencillas con código.
-Un poco de POO(Programación orienta a objetos) preferiblemente en javascript, Java o Kotlin.

Necesito algo para hacer mi aplicación o mi web?
-Software necesario:
Java N-IDE https://play.google.com/store/apps/details?id=com.duy.compiler.javanide

Java N-IDE será el editor de texto, manager de proyectos y compilador.

*Para Windows, Mac o Linux podeis usar Android Studio.
En pdfdrive.com hay un montón de libros si buscas "Java Android" en los que se explica todo, empezando por instalar Android Studio.

Supongo que Linux es la única plataforma que se os puede complicar la instalación.
Apunté hace basante tiempo todos los pasos de la instalación, (Orientado a programar en Android con C++) puede que cambiasen cosas.
Yo usé Xubuntu 64 bits.

Quizas sea mejor que para Linux busqueis una guía más actual.
Aún así os dejo los pasos de instalación por si sirven de algo.
Cita de: Pasos:
Descargar Android Studio desde su web.
Extraer .zip en /home

Terminal:
$sudo su
$cd SDKinstallfolder
$cd bin
$./studio.sh

No import
Next -> Custom -> Next
Android SDK directory -> /home/Desktop new folder
Finish. Close.

Download NDK
Ir a la web.
older versions -> Agree terms.
Android NDK Revision 10e(May 2015) (Las hay más recientes pero no eran compatibles, no sé si ahora hay una versión más reciente sin errores de compatibilidad.)

Download Java SE Dev Kit
Ir a la web.
Java SE8u181 Linux-x64.tar.gz

Desktop make new folder to install NDK
Desktop make " " "
Download QT (ir a la web y darle a : Go open source - autodect download)
Extract JDK.gz file
Extract NDK
Extract QT installer using :$ chmod +x qt... (Darle a Tab y se completa la ruta)
$./qt.run

Next -> Skip -> Next
Select installation folder -> Desktop QT
QT -> checkbox QT 5.11.2 (La versión que quieras, aqui nl hay problemas de compatibilidad)
Tools -> QT installer framework 3.0
Next, agree, install.


Empezemos:

Una vez tenemos instalado y abierto el Java N-IDE:

Le damos a File -> New -> New Android Project

Se abre una nueva ventana que cubriremos con lo siguiente:
Nombre de la aplicación.
Nombre del paquete.
Nombre de la actividad.
Nombre de diseño.

Por ejemplo la app de facebook podría ser algo así:
Facebook
com.facebook.katana
MainActivity
activity_main.xml

En este ejemplo pondremos:
MiPrimeraApp
com.mimarca.MiPrimeraApp
ActividadPrincipal
principal_actividad.xml

Y le damos a Aceptar.

Se creará el proyecto con código básico, con un montón de carpetas y archivos.

Arriba tenemos una flecha como la flecha de PLAY. Sirve para compilar.
Al darle nos mostrará un error debido a que en el ejemplo vienen configurados nombres por defecto.

El error está en la línea 13 del archivo ActividadPrincipal.java
El código que da error es:
setContentView(R.layout.activity_main);

Tiene el nombre que se asigna por defecto R.layout.activity_main
Nosotros le llamamos al layout principal_actividad.xml
Asique substuimos el nombre y nos queda:
setContentView(R.layout.principal_actividad);

Le damos a compilar y ya se nos creará nuestra primera aplicación en Android.

El sistema por seguridad nos bloqueará la instalación si no tenemos checkeado instalar desde fuentes desconocidas.
Le damos a Ajustes.
Marcamos fuentes desconocidad tocando la caja.
Aceptamos.
Le damos a instalar.
Abrir.

Ya tenemos la aplicación instalada.
De momento al abrirla solo muestra un mensaje de saludo HELLO WORLD. (Hola mundo).

Ya podemos cerrarla.

Ahora lo que vamos a hacer es mostrar una página web en el WebView de Android en el lugar de ese mensaje.

Lo primero que necesitamos es programar nuestra página web.
1 - Podemos hacerlo directamente en el Java N-IDE.
2 - Movernos con nuestro gestor de ficheros del telefono y otro editor o web descargada.
3 - O habilitar permisos de acceso a internet y poner la url de una página web.


En el Java N-IDE localizamos la carpeta assets que se encuentra dentro de:
MiPrimeraApp - app - src - assets
Le damos al símbolo más(+) que se encuentra a la derecha de assets.

Le damos a crear un archivo XML (ya que no nos sale opción de html)
De nombre le pondré A.html y se crea el archivo.

El archivo creado es A.html.xml asique más tarde vamos a renombrarlo a webinterfaz.html
Como el editor no reconoce archivos html, escribiremos el html directmente en el A.html.xml y después
lo renombramos.

Le damos al A.html.xml para abrirlo en el editor.
Trae por defecto una o dos líneas que borramos.

Escribimos nuestra página web.
Iré añadiendo comentarios entre <!-- --> o /* */ para el tutorial y explicar cada línea de código.
No entraré en mucho detalle, explicaré para que sirve, sin más.


Código (html4strict) [Seleccionar]
<!DOCTYPE html>
<!-- Indica que es un documento de HTML5 -->

<meta content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0' name='viewport'/>
<!-- Fija la vista para Android -->

<meta charset="UTF-8">
<!-- Indica el encoding del documento para que el navegador lo reconozca. -->

<html>
<!-- Inicio de la página web -->


<head>
<!-- Inicio de la cabecera, se usa para codigo que no va a ver el usuario directamente sobre la página -->

<title>Interfaz</title>
<!-- Indica el título de la página, por ejemplo Nueva Pestaña es un título por defecto -->

<script>
/* A partir de aquí deja de ser código HTML y pasa a ser código javascript */

function CambiarColorRectangulo()
/* Se crea un función(Es como un programa nuevo) y se le da un nombre.
Entre los paréntesis ( ) pueden ir datos para función. En este caso no le puse */

{
/* Todo lo que esté dentro de estos paréntesis pertenece a la función.
Es lo que la función va a hacer. */

var Rectangulo1 = document.getElementById('Rectangulo1');
/* Guarda con el nombre Rectangulo1 un rectángulo que se encuentra más adelante.
Por si no te queda claro y por simplificar, todo este código javascript de la función se ejecutará
mucho más adelante. */

var Rectangulo2 = document.getElementById('Rectangulo2');
/* Lo mismo que lo anterior pero con otro rectángulo */

var r = Math.floor(Math.random() * 255);
/* Se guarda un número aleatorio entre 0 y 255. */

var g = Math.floor(Math.random() * 255);
/* Se guarda otro número aleatorio*/

var b = Math.floor(Math.random() * 255);
/* Se guarda otro número aleatorio */

Rectangulo1.style.fill = 'rgb(' + r + ', ' + g + ' , ' + b + ')';
/* Se le añade un estilo al rectángulo1 con los 3 númeos aleatorios.
Cada número equivale a un color. Se mezclan los 3 colores para obtener un color nuevo.
La r (red) equivale a la cantidad de rojo. 0 = Sin rojo, 255 = Mucho Rojo.
La g (green) lo mismo pero para el color verde.
La b (blue) lo mismo pero para el azul.
*/

Rectangulo2.style.fill = 'rgb(' + r + ', ' + g + ' , ' + b + ')';
/* Los mismos colores pero para otro rectángulo */

}
/* Se acaba lo que hace la función.

Como resumen, esta función lo que va a hacer es:
Cada vez que le toques con el dedo a un rectángulo, se pintarán
los 2 rectángulos de un color aleatorio.
*/

</script>
<!-- Ya se acabó el código de javascript, asique estamos otra vez en el HTML. -->

</head>
<!-- Se cierra la cabecera -->

<body>
<!-- Se abre el cuerpo del documento donde se define todo lo que se va a ver -->

<div class="Web" id="Banner_StringManolo" style="text-align:center;">
<!-- Se crea un contenedor, le damos varios nombres identificadores e indicamos que todo
lo que pongamos dentro se centre -->

<div class = "BannerFijadoAbajo">
<!-- Otro contenedor para otro Banner(El rectángulo de adorno) -->

<svg style = "display:block" width="100%" height="20">
<!-- Svg son imágenes que crea el navegador y crecen automáticamente con el zoom -->

<rect width="100%" height="22" style="fill:rgb(0,0,0);stroke-width:1%;stroke:rgb(0,0,0)" id="Rectangulo2"
onclick="CambiarColorRectangulo();vibrate(100);"/>
<!-- Crea un rectángulo que ocupe todo el ancho de pantalla, lo pintamos de negro y le ponemos borde también negro
En el onclick(Tras hacer click en el rectángulo), se activa el javascript que acabamos de ver, para cambiar el color por uno aleatorio.
Al hacer click también llamamos a otro código de javascript que veremos más adelante.
-->

</svg>
<!-- Acabamos de usar SVG -->

</div>
<!-- Cerramos el contenedor del banner de la parte inferior. -->

<div class = "BannerFijado">
<!-- Contenedor para el banner de arriba -->

<svg style = "display:block" width="100%" height="40">
<!-- Iniciamos el area límite de SVG sobre la que crear gráficos -->

<g>
<!-- Contenedor para agrupar varios SVG distintos. En concreto para poder dibujar texto sobre el rectángulo -->
<rect width="100%" height="42" style="fill:rgb(0,0,0);stroke-width:1%;stroke:rgb(0,0,0)" id="Rectangulo1"
onclick="CambiarColorRectangulo();vibrate(50);"/>


<!-- Desactivado para conexiones lentas y testeos. Lo dejo como ejemplo de fuente custom.
<defs>
<style>
@import url("http://fonts.googleapis.com/css?family=Audiowide");
<text x="50%" y="50%" font-family="Audiowide" font-size="30%" fill="white">MiPrimeraApp</text>
</style>
</defs>
-->

<style><![CDATA[svg text{stroke:none}]]></style>
<!-- Elimina los bordes del texto SVG -->

<text x="50%" y="50%" font-size="90%" fill="white" dominant-baseline="middle" text-anchor="middle">MiPrimeraApp</text>
<!-- Crea texto SVG (escala junto al rectángulo) -->
</g>
<!-- La g sirve para meter el texto dentro del rectángulo -->

 Tu navegador no soporta Scalable Vector Graphics.
<!-- Si el navegador o WebView no pudiese mostrar los SVG se mostraría este mensaje -->
</svg>
<!-- Se acabó el SVG -->

</div>
</div>
<!-- Cerrando contenedores en los que creamos gráficos SVG -->

<br><br><br>
<!-- Saltos de línea -->

<div id="content-window" class="WebIncrustada">
</div><br>
<!-- Contenedor en el que se cargará una página web -->

<input type="text" id="url_a" value="http://www.example.com"><br>
<!-- Un input para escribir una URL -->

<input id="btn" type="button" value="Ver" />
<!-- Un botón que se usará para ver una Web -->

<input id="btn_a" type="button" value="Visitar" />
<br><br>
<!-- Un botón que se usará para ir a una Web -->


<div class="ContenidoDelSitio" >
<br><br><br><br><br>

<!-- Estilos para hacer más bonita y ordenada la web -->
<style>
.BannerFijado{
position: fixed;
left: 0;
right: 0;
top: 0;
}

.BannerFijadoAbajo{
position: fixed;
left: 0;
right: 0;
bottom: 0;
}

.ContenidoDelSitio{
margin: auto;
width: 50%;
height: 50%;
padding: 10px;
text-align: center;
bottom: 0
margin-left: auto;
margin-right: auto;
}

.WebIncrustada{
width: 100%;
height: 200%;
text-align left;
border: 1px solid green;
}
</style>

<script>
/* javascript: */


btn.onclick =
function(){
var temp = document.getElementById("url_a").value;
document.getElementById("content-window").innerHTML='<object type="text/html" data="'+temp+'"></object>';
/* Si se hace click en el botón Ver, se pega el HTML de la página web que ponga el usuario.
Necesita mejoras para compatibilidad. */


btn_a.onclick =
function()
{
window.location = temp;
}
/* Si se le da al botón Ir, se abre la página en el WebView */

}
</script>

<script>
/* Con esta función haremos vibrar el Smartphone. */

function vibrate(milliseconds)
{
Android.Vibrate(milliseconds);
} /* Llama al Vibrate en Java */

</script>
</body>
</html>


Puedes copiar y pegar todo el código con los comentarios, funciona sin problemas.


Ahora tocamos el nombre del archivo. Le damos a File. Seleccionamos Save as.
Ahí abajo del todo borramos el nombre A.html.xml y le ponemos en su lugar webinterfaz.html

Arriba de todo a la izquierda volvemos a las carpetas.
Hay varios símbolos. Le tenemos que dar a la flecha que forma un círculo para actualizar
los archivos. Así detectará el nuevo archivo webinterfaz.html
Aún existe el A.html.xml asique lo eliminamos dándole a la X que está a su derecha.
Nos preguntará si estamos seguros que es el archivo que queremos borrar. Aceptamos.


Ahora añadiremos el WebView

En el archivo ActividadPrincipal.java escribimos los imports correspondientes:
Código (java) [Seleccionar]
import android.webkit.WebView;
import android.webkit.WebSettings;
import android.webkit.WebViewClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.annotation.TargetApi;


Aquí os dejo links con toda la documentación por si quereis ver lo que podeis hacer:
https://developer.android.com/reference/android/webkit/WebView
https://developer.android.com/reference/android/webkit/WebSettings
https://developer.android.com/reference/android/webkit/WebViewClient
https://developer.android.com/reference/android/webkit/WebResourceError
https://developer.android.com/reference/android/webkit/WebResourceRequest
https://developer.android.com/reference/android/annotation/TargetApi

En el archivo ya tenemos
Código (java) [Seleccionar]
import android.app.Activity;
import android.os.Bundle;


Aqui la documentación:
https://developer.android.com/reference/android/app/Activity
https://developer.android.com/reference/android/os/Bundle

El código que tenemos ahora en el archivo es:
package com.mimarca.MiPrimeraApp;

Código (java) [Seleccionar]
import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebSettings;
import android.webkit.WebViewClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.annotation.TargetApi;

import com.mimarca.MiPrimeraApp.R;

public class ActividadPrincipal extends Activity
{
  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.principal_actividad);
   }
}


El import nos sirve para poder utilizar código y recursos que se encuentran en otros
archivos para poder usarlos en el archivo que tenemos los imports.

Los archivos que tienen la letra R. son generados automáticamente por el compilador.
Hace referencia a múltiples recursos como puedan ser imágenes, estilos, strings...

Creamos la clase ActividadPrincipal que se hereda de Activity.
Si no entiendes este código, aquí está muy bien explicado:
https://desarrolloweb.com/articulos/android-que-es-una-activity-o-actividad.html

Ahora vamos a crear el webview dentro de la clase con la Keyword Private para que solo sea accesible desde ella:
Código (java) [Seleccionar]
private WebView MiWebView;

Dentro de la clase añadimos lo siguiente:
Código (java) [Seleccionar]
MiWebView  = new WebView(this);
Así creamos un nuevo objeto. This hace referencia al propio objeto.

También obtenemos una referencia a los ajustes de nuestro WebView para poder manjarlos:
Código (java) [Seleccionar]
WebSettings webSettings = MiWebView.getSettings();

El primer ajuste que haremos será activar javascript que viene desactivado por defecto:
Código (java) [Seleccionar]
webSettings.setJavaScriptEnabled(true);

Un ejemplo de lo que podemos hacer es definir un nuevo User-Agent.
Por ejemplo:
Código (java) [Seleccionar]
String MiUserAgent = "MiPrimeraApp";
MiWebView.getSettings().setUserAgentString(MiUserAgent);

Esto nos sirve por ejemplo para identificar en nuestra página web, si un usuario
nos visita desde Google Chrome, Mozilla, Opera, WebView o en este caso nuestra App.

Si creamos una web en PHP podríamos hacer lo siguiente:
Código (php) [Seleccionar]
$VisitanteDesdeMiApp = 'MiPrimeraApp';
$UserAgentVisitante=$_SERVER['HTTP_USER_AGENT'];
if ($UserAgentVisitante == $VisitanteDesdeMiApp)
{
MostrarWebEspecial();
}

else
{
MostrarWebNormal();
}


Aquí vamos a crear una interfaz para poder exponer código escrito en Java de nuestra aplicación, a javascript desde una web.
Código (java) [Seleccionar]
MiWebView.addJavascriptInterface(new JSInterface(this), "Android");
JSInterface.java lo crearemos después.
La cadena de texto "Android" es la que utilizamos en javascript para llamar a Java.
Como vimos en la web que creamos:
Código (javascript) [Seleccionar]
function vibrate(milliseconds)
{
Android.Vibrate(milliseconds);
}


Añadimos lo siguiente para tema Versiones:
Código (java) [Seleccionar]
MiWebView.setWebViewClient(new WebViewClient()
{
@TargetApi(android.os.Build.VERSION_CODES.M)
@Override
public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr)
{
onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString());
}});


Y por último la URL que queremos cargar en el WebView:
En este caso un archivo HTML local, pero puedes perfectamente poner cualquier link como https://www.example.com/index.php
Código (java) [Seleccionar]
MiWebView.loadUrl("file:///android_asset/webinterfaz.html");

Y lo mostramos:
Código (java) [Seleccionar]
setContentView(MiWebView);


Todo junto nos quedaría de la siguiente forma el archivo ActividadPrincipal.java:
Código (java) [Seleccionar]
package com.mimarca.MiPrimeraApp;

import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebSettings;
import android.webkit.WebViewClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.annotation.TargetApi;


import com.mimarca.MiPrimeraApp.R;

public class ActividadPrincipal extends Activity
{

private WebView MiWebView;

  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.principal_actividad);

 
  MiWebView  = new WebView(this);

  WebSettings webSettings = MiWebView.getSettings();

  webSettings.setJavaScriptEnabled(true);

  String MiUserAgent = "MiPrimeraApp";
  MiWebView.getSettings().setUserAgentString(MiUserAgent);

  MiWebView.addJavascriptInterface(new JSInterface(this), "Android");


 
  MiWebView.setWebViewClient(new WebViewClient()
  {
  @TargetApi(android.os.Build.VERSION_CODES.M)
  @Override
  public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr)
  {
  onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString());
  }
  });
 

MiWebView.loadUrl("file:///android_asset/webinterfaz.html");

setContentView(MiWebView);
}}




Ahora en el administrador de archivos de la izquierda le damos al + para crear un nuevo archivo .java para la interfaz de javascript:
Justo encima del archivo ActividadPrincipal.java tenemos la carpeta
que lo contiene llamada MiPrimeraApp. A la derecha le damos al + para crear un nuevo archivo:
Seleccionamos Java File.
En class name nombramos el archivo como JSInterface y aceptamos.

Se nos crea un archivo JSInterface con el siguiente contenido:
Código (java) [Seleccionar]
package com.mimarca.MiPrimeraApp;

public class JSInterface {

}


Añadiremos los siguientes imports:
Código (java) [Seleccionar]
import android.content.Context;
import android.os.Vibrator;
import android.webkit.JavascriptInterface;


Hay muchos otros interesantes, como por ejemplo:
Código (java) [Seleccionar]
import android.telephony.SmsManager;
Que nos permite leer los SMS del Smartphone, o enviar SMS entre otras muchas cosas.
El resultado de enviar un SMS es el mismo que si lo hiciésemos normalmente, asique hay que tener
cuidado al escribir código, ya que podríamos llegar a enviar SMS en bucle por error y agotar el saldo o
recibir una factura muy alta.

Dentro de nuestra Interfaz pondremos:
Código (java) [Seleccionar]
Context mContext;
JSInterface(Context c)
{
mContext = c;
}


El contexto nos sirve para acceder a funciones de Android y exponerlas a la interfaz.
https://developer.android.com/reference/android/content/Context


Ahora podremos añadir la función del sistema a la que queremos acceder.
Para este tutorial, haremos algo simple, como hacer vibrar el SmartPhone.

Código (java) [Seleccionar]
@JavascriptInterface
public void Vibrate(long milliseconds)
{
Vibrator v = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
v.vibrate(milliseconds);
}



El resultado del archivo JSInterface.java es el siguiente:
Código (java) [Seleccionar]
package com.mimarca.MiPrimeraApp;

import android.content.Context;
import android.os.Vibrator;
import android.webkit.JavascriptInterface;

public class JSInterface
{

Context mContext;
  JSInterface(Context c)
  {
 
  mContext = c;
  }

  @JavascriptInterface
  public void Vibrate(long milliseconds)
  {
  Vibrator v = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
  v.vibrate(milliseconds);
  }

}



Ahora abrimos el archivo principal_actividad.xml y lo dejamos de la siguiente forma:
Código (xml) [Seleccionar]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical">

       <WebView  xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/webview"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
/>
</LinearLayout>


De esta forma añadimos el WebView que usaremos de interfaz y decimos que ocupe toda la pantalla.


Por último el AndroidManifest.xml que dejamos de la siguiente manera:
Código (xml) [Seleccionar]
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.mimarca.MiPrimeraApp"
   android:versionCode="1"
   android:versionName="1.0">

   <uses-sdk
       android:minSdkVersion="14"
       android:targetSdkVersion="25" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />
   <application
       android:allowBackup="true"
       android:icon="@drawable/ic_launcher"
       android:label="@string/app_name"
       android:theme="@style/AppTheme">

       <activity android:name="com.mimarca.MiPrimeraApp.ActividadPrincipal">
           <intent-filter>
               <action android:name="android.intent.action.MAIN" />
               <category android:name="android.intent.category.LAUNCHER" />
           </intent-filter>
       </activity>

   </application>

</manifest>


En este archivo las líneas más interesantes de conentar son:
Código (xml) [Seleccionar]
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />

Con estas lineas pedimos al usuario que permita estas funcionalidades a nuestra app.
Acceso a internet y control a la vibración.

Código terminado. Tras darle al botón de Play se contruirá la aplicación.
Ya podemos instalarla y probarla.
Al darle al rectángulo superior que pone MiPrimeraApp el móvil vibrará y el rectángulo cambiará
de color. Si te fijas también cambia el rectángulo de abajo. Si le tocas al de abajo, el móvil vibrará de
forma distinta.


Esto funciona de igual forma en un página en la Web. Por lo que si ya tienes una
página web, puedes hacer una versión especial para Android que controle funciones del Smartphone.
Hacer llamadas, mandar mensajes, reproducir música y efectos de sonido, obtener lista de contactos,
manejar archivos, obtener imágenes... Todo lo que se te ocurra.

#89
Hay una campaña activa que envia archivos de audio .wav por correo, webs de descargas de música...

Una nueva campaña de ataques que esconde código malicioso en archivos .wav fue descubierto por investigadores.
Algunos de los archivos WAV infectados reproducen música sin errores, mientras que otros solo generan ruido.

Los archivos WAV se observó que contenían un componente para descodificar y el programa malicioso se encontraba por medio de los datos de audio. Esos archivos puede ser distribuídos mediante correos o páginas web de descarga haciéndose pasar por contenido pirateado.

Análisis de la campaña:

La campaña distribuye 2 payloads, XMRig Monero CPU miner(Un código que mina criptomonedas) y un código de Metasploit para establecer una consola remota.

El descubrimiento de esos dos payloads en el mismo entorno puede golpear con ganancia financiera y acceso remoto a la red de la víctima.

Esta campaña utiliza estenografía, el proceso de esconder un archivo en otro archivo para evadir detección. El código malicioso está escondido en el archivo de audio utilizando la técnica del Bit Menos Significativo (LSB). El uso de estenografía y otras técnicas de codificación en esta campaña la hacen difícil de detectar. El análisis muestra que los loaders usados son de tres tipos distintos-Uno que utiliza estenografría basada en Bit Menos Significante(LSB) para decodificar y ejecutar un archivo PE(.exe), uno que decodifica el archivo PE para su ejecución utilizando un algoritmo rand(), y otro que decodifica Shellcode para su ejecución utilizando un algoritmo rand(). El uso de estos tres loaders y los dos payloads indica un gran nivel de innovación en esta campaña de ataques.

"Cualquier método permite al atacante ejecutar código desde otro archivo con extensión benigna. Estas técnicas demuestran que el contenido ejecutable puede ser ocultado en archivos con cualquier extensión, tras observar que el atacante no estropea la estructura y el funcionamiento del formato contenedor" dicen los investigadores.


Atribución:

Los investigadores encontraron coincidencias entre la autoría de estos ataques y los de Waterbug/Turla. Pero, existe la posibilidad de diferentes actores reutilizando el loader disponible públicamente. También podría ser intencionado para evadir atribución directa según los investigadores.

Fuente: https://cyware.com/news/musical-malware-how-attackers-are-spreading-malicious-wav-audio-files-c345e314
#90
Foro Libre / Competición CTF en Valencia
18 Octubre 2019, 13:19 PM
Las personas interesadas en ponerse a prueba en esta actividad podrán registrarse hasta el día 30 de octubre

El Instituto Nacional de Ciberseguridad (INCIBE) ha abierto el plazo de inscripción para participar en la competición CTF individual de CyberCamp 2019, el evento de ciberseguridad que se celebrará del 27 al 30 de noviembre en Valencia.

CTF individual es una de las diferentes competiciones que se llevan a cabo en el marco del evento, junto al Hackathon yCyberOlympics. Su objetivo es identificar nuevas promesas en ciberseguridad, poniendo a prueba sus conocimientos y habilidades en el área de seguridad de sistemas y aplicaciones, mediante una serie de retos.

La competición consta de dos fases: la fase online y clasificatoria que se realizará del 8 al 10 de noviembre, y la final presencial que se celebrará durante CyberCamp 2019, el 30 de noviembre en Valencia. En ambas fases, los participantes pondrán a prueba sus conocimientos, de manera individual, resolviendo diferentes retos y pruebas técnicas de ciberseguridad sobre ingeniería inversa, análisis forense, criptografía, esteganografía, sistemas operativos, reconocimiento y exploiting...
https://cybercamp.es/competiciones/CTF

Fuente:https://cybercamp.es/sobre/noticias/abierto-el-plazo-de-inscripcion-para-participar-en-la-competicion-ctf