Foro de elhacker.net

Foros Generales => Dudas Generales => Mensaje iniciado por: Mudereded401 en 27 Febrero 2021, 17:59 pm



Título: ¿Que es LUA?
Publicado por: Mudereded401 en 27 Febrero 2021, 17:59 pm
  Estaba mirando la inicialización que tienen varios juego creados en Source, y me di cuenta de que hay una parte en la que aparece "Initializing LUA". Entonces simplemente busqué y me encontré con que es un lenguaje de programación.

  Entonces quería saber para que propósito exactamente lo utilizarían... ¿Para que sirve el LUA y en qué se podría usar mejor?

  Esta pregunta siempre me la hago a la hora de iniciar un lenguaje pero ahora mismo, no tengo ni idea de para que servirá este extraño lenguaje. (Capaz y no es un lenguaje pero bueh, eso es lo que me dijo wikipedia xd)


Título: Re: ¿Que es LUA?
Publicado por: el-brujo en 27 Febrero 2021, 18:47 pm
Si, LUA, es un lenguaje de programación, muy usado sobretodo para añadir "plugins" (funciones extras) en aplicaciones, para añadir módulos de exportación.

Por ejemplo, Suricata tiene módulo LUA para exportar datos. Ntopng usa LUA.

En el desarrollo de videojuegos, los programadores de juegos utilizan ampliamente Lua como lenguaje de scripting, tal vez debido a su facilidad percibida para integrar, ejecución rápida y curva de aprendizaje corta.

Citar
Lua es un lenguage de programación extensible diseñado para una programación procedimental general con utilidades para la descripción de datos. También ofrece un buen soporte para la programación orientada a objetos, programación funcional y programación orientada a datos. Se pretende que Lua sea usado como un lenguaje de script potente y ligero para cualquier programa que lo necesite. Lua está implementado como una biblioteca escrita en C limpio (esto es, en el subconjunto común de ANSI C y C++).

Siendo un lenguaje de extensión, Lua no tiene noción de programa principal (main): sólo funciona embebido en un cliente anfitrión, denominado programa contenedor o simplemente anfitrión (host). Éste puede invocar funciones para ejecutar un trozo de código Lua, puede escribir y leer variables de Lua y puede registrar funciones C para que sean llamadas por el código Lua. A través del uso de funciones C, Lua puede ser aumentado para abarcar un amplio rango de diferentes dominios, creando entonces lenguajes de programación personalizados que comparten el mismo marco sintáctico. La distribución de Lua incluye un programa anfitrión de muestra denominado lua, que usa la biblioteca de Lua para ofrecer un intérprete de Lua completo e independiente.





Título: Re: ¿Que es LUA?
Publicado por: @XSStringManolo en 28 Febrero 2021, 07:55 am
Puedes descargarte Lua 5.X o Lua Jit para interpretar código LUA.

Lua Rocks para bajarte módulos.

No tiene mucho módulo, tiene poca documentación, muchos errores y demás que tienes que subsanar por tu cuenta. Necesitas conocimientos intermedios-avanzados de sistemas para ir arreglando y configurando cosas muy básicas como puedan ser las rutas en las que se buscan los módulos usando un sistema virtual de ficheros.

El lenguaje en sí tiene un montón de cosas muy sencillas, pero también tiene otras cosas poco friendly para newbies como las patterns (las expresiones regulares de lua), lua sockets(no es ni librería std, por defecto no tiene modulo de red lua y es poco amigable el uso de sockets, las iteración de tablas, comprobaciones constantes para evitar que variables y tablas tengan nil, el stack de C tampoco es demasiado amigable, asique escribir módulos en C para lua tampoco es algo que aprendas a hacer en 2 minutos si no estás acostumbrado...

El lenguaje en sí es muy bueno y potente. El problema es la falta de soporte y la poca comunidad que hay.

A pesar de todo esto, se usa en un montón de programas. Principalmente suele usarse como "añadido" a juegos para tener una consola con la que configurar cosas del juego, hacer chats in-game y cosas similares.

También se usa mucho como lenguaje de scripting para todo tipo de programas. A parte de los que te comenta El Brujo, otro muy popular es Nmap y Ncat.
Nmap te permite agregar scripts para configurar el scanner o hacerle plugins para que haga otras cosas. Lo mismo con Ncat, donde puedes programar un montón de utilidades como podría ser el caso de un pequeño proxy ftp, dns, un scanner, etc.

Otro uso común es el de chicle entre diversas tecnologías y lenguajes. Dado su pequeño tamaño y su integración total con C, es común que se use para hacer de intermediario entre lenguajes o para unir componentes de un mismo lenguaje.

Una de las mayores ventajas es que corre en todos lados. Está bastante cerca del programa una vez, corre en todos los sitios, no tienes que andar haciendo condicionales y defines raros.

Es un lenguaje que dentro de lo que cabe, se aprende en muy muy poco tiempo, pero a pesar de ser un lenguaje potente, no es un javascript con 1000 metodos distintos de fábrica para unir strings, buscar texto, darle la vuelta... Está diseñado para traer lo mínimo indespensable y que tu personalmente le añadas exactamente lo que necesites usando librerías de tercero o las tuyas propias.

Yo lo suelo utilizar para servidores web y scripts para netcat, aunque no estoy muy contento con la librería de luasockets y todas las comprobaciones extra que acabo haciendo para cosas simples.

Este código son 3 funciones que hice para un servidor web y que comparto para poder comentar peculiaridades de la sintaxis y del lenguaje:

Código
  1. function split(string, pattern)
  2.  if string == nil or pattern == nil then return "" end
  3.  local lines = {}
  4.  for i in string.gmatch(string, pattern) do
  5.    lines[i] = i
  6.  end
  7.  return lines
  8. end


Las funciones se definen con la palabra clave funcion.
Los condicionales no requieren parámetros.
Nil es literlamente nada. Viene del latín y en la práctica es similar al Null de otros lenguajes.
then y end se utilizan en lugar de los típicos corchetes de apertura y cierre respectivamente.
Local limita el alcance de las variables a la función en la que se encuentra
{} crea una tabla, que es un contenedor que sirve para muchas cosas distintas.
string.gmatch acepta un string y una pattern de lua para ir retornando el siguiente resultado de la búsqueda en cada iteración.

Código
  1. function read_config()
  2.  package.path =  "./config/?.config;" .. package.path
  3.  local fd = io.open("./config/config.config", "r")
  4.  if not fd then
  5.    print("[debug]File not found")
  6.  end
  7.  local lines = fd:read "*a"
  8.  fd:close()
  9.  --print("File Content:\n" .. lines)
  10.  lines = split(lines, "([^\n]*)\n?")
  11.  for key, val in pairs(lines) do
  12.    val = string.lower(val)
  13.    if val == "use_static_headers[true]" then
  14.      print("[debug]Getting getting static headers")
  15.      server_headers = require("static_headers")
  16.      --[[for k, v in pairs(server_headers) do
  17.         print(k .. ": " .. v)
  18.       end]]--
  19.    elseif val == "custom_methods[true]" then
  20.      print("[debug]Getting getting custom methods")
  21.      server_methods = require("custom_methods")
  22.      --[[for i = 1, #server_methods do
  23.         print(server_methods[i])
  24.       end]]--
  25.    end
  26.  end
  27. end
En esta función declaro de forma explicita la ruta que quiero añadir para que se busque en el sistema y le concateno el resto de package.path para que pieda seguir cargando módulos en las path originales.
A continuación leo todo el fichero con la opción *a.
Utilizo el método split que definí previamente usando una pattern para obtener todo lo que hay entre 2 saltos de linea.
Itero la tabla con pair para ptener el iterador y el valor.
Un poco más abajo hay un comentario multilinea.
El # es para obtener el length de un elemento.


[code=LUAfunction splitHeader(header)
  local aux = ""
  local index = 1
  local key = ""
  local value = ""
  for i = 1, #header do
    if header:sub(i, i) ~= ":" then
      if aux == nil then
   aux = header:sub(i, i)
      else
        aux = aux .. header:sub(i, i)
      end
    else
      index = i
      key = aux
      break
    end
  end
  for index = index + 1, #header do
    value = value .. header:sub(index, index)
  end
  --print("KEY:" .. key .. "\nVALUE:" .. value)
  -- value:match is removing leading/trailing spaces
  return key, value:match("^%s*(.-)%s*$")
end[/code]

Espero que sirva mi explicación!


Título: Re: ¿Que es LUA?
Publicado por: BloodSharp en 28 Febrero 2021, 15:11 pm
Entonces quería saber para que propósito exactamente lo utilizarían... ¿Para que sirve el LUA y en qué se podría usar mejor?

Yo lo utilizo en mis cheats para añadir funcionalidad extra sin tener que re-compilar el cheat de nuevo, o para permitir a terceros que añadan funcionalidad personalizada...

Este es un ejemplo de un aimbot que funciona en mi cheat externo (un poco desactualizado) para Counter-Strike 1.6 (version build 4554), claro está que tiene la librería ImGui (https://github.com/ocornut/imgui) y funciones extras agregadas por mí que trabajan para añadirle Callbacks...

Código
  1. --[[
  2.     Author: BloodSharp
  3.     Description: Custom Aimbot for Crianosfera Hack v5 External edition
  4. ]]
  5.  
  6. -- Main default settings
  7. local bCustomAimbot = false
  8. local bRenderOrigin = false
  9. local bPrioritizeIfSomeOneIsAtShortDistance = true
  10. local iAimingMethod = 0 -- Field of View: 0 / Distance: 1
  11. local iAimTeam = 0 -- Enemies: 0 / Teammates: 1 / All: 2
  12. local colorNonTarget = ImColor(255, 255, 255, 255) -- White color
  13. local colorAimTarget = ImColor(0, 255, 0, 255) -- Green color
  14.  
  15. local iTargetAimbot = -1
  16.  
  17.  
  18. -- I need to write W2S function this way because the wrapper that I use don't support arguments as references
  19. local function WorldToScreen(vInput, vOutput)
  20. if Utils.ConvertToScreen(vInput) then
  21. local vConverted = Utils.GetLastConvertedToScreenVector()
  22. vOutput.x = vConverted.x
  23. vOutput.y = vConverted.y
  24. return true
  25. end
  26. return false
  27. end
  28.  
  29. local function DotProduct(vFirstVector, vSecondVector)
  30.    return (vFirstVector.x * vSecondVector.x + vFirstVector.y * vSecondVector.y + vFirstVector.z * vSecondVector.z)
  31. end
  32.  
  33. local function AngleBetween(vForward, vDifference)
  34.    local vNormalizedForward = vForward:Normalize()
  35.    local vNormalizedDifference = vDifference:Normalize()
  36.    return (math.acos(DotProduct(vNormalizedForward, vNormalizedDifference)) * (180 / math.pi))
  37. end
  38.  
  39. local function VectorAngles(forward, angles)
  40. local tmp
  41. local yaw
  42. local pitch
  43.  
  44. if forward.y == 0 and forward.x == 0 then
  45. yaw = 0
  46. if forward.z > 0 then
  47. pitch = 270
  48. else
  49. pitch = 90
  50. end
  51. else
  52. yaw = (math.atan(forward.y, forward.x)) * 180 / math.pi
  53. if yaw < 0 then
  54. yaw = yaw + 360
  55. end
  56.  
  57. tmp = math.sqrt(forward.x * forward.x + forward.y * forward.y)
  58. pitch = (math.atan(-forward.z, tmp)) * 180 / math.pi
  59. if pitch < 0 then
  60. pitch = pitch + 360
  61. end
  62. end
  63.  
  64. angles.x = pitch
  65. angles.y = yaw
  66. angles.z = 0
  67.  
  68. while angles.x < -89 do
  69. angles.x = angles.x + 180
  70. angles.y = angles.y + 180
  71. end
  72. while angles.x > 89 do
  73. angles.x = angles.x - 180
  74. angles.y = angles.y + 180
  75. end
  76. while angles.y < -180 do
  77. angles.y = angles.y + 360
  78. end
  79. while angles.y > 180 do
  80. angles.y = angles.y - 360
  81. end
  82. end
  83.  
  84. local function VerifyTeam(index)
  85.    if (iAimTeam == 0) and (LocalPlayer.GetTeam() ~= EntityManager.GetTeam(index)) then
  86.        return true
  87.    elseif (iAimTeam == 1) and (LocalPlayer.GetTeam() == EntityManager.GetTeam(index)) then
  88.        return true
  89.    elseif (iAimTeam == 2) then
  90.        return true
  91.    end
  92.    return false
  93. end
  94.  
  95. -- Inside the Lua Scripts tab...
  96. local function OnRenderMenu()
  97.    if ImGui.TreeNode("Custom Aimbot##CUSTOM_AIMBOT", true) then
  98.        bCustomAimbot = ImGui.Checkbox("Enable##CUSTOM_AIMBOT", bCustomAimbot)
  99.        ImGui.BeginGroup()
  100.        bRenderOrigin = ImGui.Checkbox("Show origin##CUSTOM_AIMBOT", bRenderOrigin)
  101.        bPrioritizeIfSomeOneIsAtShortDistance = ImGui.Checkbox("Prioritize short distance##CUSTOM_AIMBOT", bPrioritizeIfSomeOneIsAtShortDistance)
  102.        colorAimTarget.Value = ImGui.ColorEdit4("AimOrigin##CUSTOM_ESP", colorAimTarget.Value, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_AlphaBar)
  103.        ImGui.EndGroup()
  104.  
  105.        ImGui.SameLine()
  106.        ImGui.BeginGroup()
  107.        ImGui.PushItemWidth(120)
  108.        iAimingMethod = ImGui.Combo("Aiming method##CUSTOM_AIMBOT", iAimingMethod, "Field of View\0Distance\0\0")
  109.        iAimTeam = ImGui.Combo("Aim team##CUSTOM_AIMBOT", iAimTeam, "Enemies\0Teammates\0All\0\0")
  110.        colorNonTarget.Value = ImGui.ColorEdit4("NonAimOrigin##CUSTOM_ESP", colorNonTarget.Value, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_AlphaBar)
  111.        ImGui.PopItemWidth()
  112.        ImGui.EndGroup()
  113.  
  114.        ImGui.NewLine()
  115.        ImGui.TreePop()
  116.    end
  117. end
  118.  
  119. -- Rendering at the screen...
  120. local function OnRenderBackground()
  121.    if bRenderOrigin then
  122.        for index = 1, 32 do
  123.            if index ~= LocalPlayer.GetIndex() then
  124.                if EntityManager.IsAlive(index) then
  125.                    local vOrigin = EntityManager.GetOrigin(index)
  126.                    local vOrigin2D = Vector2D(0, 0)
  127.                    if WorldToScreen(vOrigin, vOrigin2D) then
  128.                        local originColor = ImColor(0, 0, 0, 0)
  129.                        if index == iTargetAimbot then
  130.                            originColor = colorAimTarget
  131.                        else
  132.                            originColor = colorNonTarget
  133.                        end
  134.                        ImGui.Render.AddRectFilled(ImVec2(vOrigin2D.x - 2, vOrigin2D.y - 2), ImVec2(vOrigin2D.x + 2, vOrigin2D.y + 2), originColor:ToImU32(), 0, ImDrawCornerFlags_All)
  135.                    end
  136.                end
  137.            end
  138.        end
  139.    end
  140. end
  141.  
  142. -- At update function, use only logical functions here...
  143. local function OnUpdate()
  144.    iTargetAimbot = -1
  145.    if bCustomAimbot then
  146.        if LocalPlayer.IsAlive() then
  147.            local flBestFOV = 360
  148.            local flBestDistance = 8192
  149.            local vForward = LocalPlayer.GetForwardVector()
  150.            local vEye = LocalPlayer.GetEyePosition()
  151.  
  152.            if bPrioritizeIfSomeOneIsAtShortDistance then
  153.                for index = 1, 32 do
  154.                    if index ~= LocalPlayer.GetIndex() then
  155.                        if EntityManager.IsAlive(index) then
  156.                            if VerifyTeam(index) then
  157.                                local flPlayerDistance = EntityManager.GetActualDistance(index)
  158.                                -- 220 Units equals 10 Units from EntityManager.GetDistance(index)
  159.                                if (flPlayerDistance <= 220) and (flPlayerDistance < flBestDistance) then
  160.                                    flBestDistance = flPlayerDistance
  161.                                    iTargetAimbot = index
  162.                                end
  163.                            end
  164.                        end
  165.                    end
  166.                end
  167.            end
  168.  
  169.            if iTargetAimbot == -1 then
  170.                for index = 1, 32 do
  171.                    if index ~= LocalPlayer.GetIndex() then
  172.                        if EntityManager.IsAlive(index) then
  173.                            if VerifyTeam(index) then
  174.                                if iAimingMethod == 0 then
  175.                                    local vPlayerOrigin = EntityManager.GetOrigin(index)
  176.                                    local vDifference = vPlayerOrigin - vEye
  177.                                    local flPlayerFOV = AngleBetween(vForward, vDifference)
  178.                                    if flPlayerFOV < flBestFOV then
  179.                                        flBestFOV = flPlayerFOV
  180.                                        iTargetAimbot = index
  181.                                    end
  182.                                elseif iAimingMethod == 1 then
  183.                                    local flPlayerDistance = EntityManager.GetActualDistance(index)
  184.                                    if flPlayerDistance < flBestDistance then
  185.                                        flBestDistance = flPlayerDistance
  186.                                        iTargetAimbot = index
  187.                                    end
  188.                                end
  189.                            end
  190.                        end
  191.                    end
  192.                end
  193.            end
  194.  
  195.            if iTargetAimbot ~= -1 then
  196.                local vAimAngles = Vector(0, 0, 0)
  197.                local vAimTargetOrigin = EntityManager.GetOrigin(iTargetAimbot)
  198.  
  199.                VectorAngles(vAimTargetOrigin - vEye, vAimAngles)
  200.  
  201.                if (LocalPlayer.GetButtons() & IN_ATTACK) == IN_ATTACK then
  202.                    LocalPlayer.SetViewAngles(vAimAngles)
  203.                end
  204.            end
  205.        end
  206.    end
  207. end
  208.  
  209. local function OnLoadSettings(szFile)
  210.    bCustomAimbot = Utils.LoadBooleanInSection(szFile, "CustomAimbot", "Enable")
  211.    bRenderOrigin = Utils.LoadBooleanInSection(szFile, "CustomAimbot", "Origin")
  212.    bPrioritizeIfSomeOneIsAtShortDistance = Utils.LoadBooleanInSection(szFile, "CustomAimbot", "PrioritizeShortDistance")
  213.    iAimingMethod = Utils.LoadIntegerInSection(szFile, "CustomAimbot", "Method")
  214.    iAimTeam = Utils.LoadIntegerInSection(szFile, "CustomAimbot", "Team")
  215.    colorNonTarget = Utils.LoadColorInSection(szFile, "CustomAimbot", "ColorNonTarget")
  216.    colorAimTarget = Utils.LoadColorInSection(szFile, "CustomAimbot", "ColorTarget")
  217. end
  218.  
  219. local function OnSaveSettings(szFile)
  220.    Utils.SaveBooleanInSection(szFile, "CustomAimbot", "Enable", bCustomAimbot)
  221.    Utils.SaveBooleanInSection(szFile, "CustomAimbot", "Origin", bRenderOrigin)
  222.    Utils.SaveBooleanInSection(szFile, "CustomAimbot", "PrioritizeShortDistance", bPrioritizeIfSomeOneIsAtShortDistance)
  223.    Utils.SaveIntegerInSection(szFile, "CustomAimbot", "Method", iAimingMethod)
  224.    Utils.SaveIntegerInSection(szFile, "CustomAimbot", "Team", iAimTeam)
  225.    Utils.SaveColorInSection(szFile, "CustomAimbot", "ColorNonTarget", colorNonTarget)
  226.    Utils.SaveColorInSection(szFile, "CustomAimbot", "ColorTarget", colorAimTarget)
  227. end
  228.  
  229. Hooks.RegisterCallback(CH5_CALLBACK_AT_RENDERING_MENU, OnRenderMenu)
  230. Hooks.RegisterCallback(CH5_CALLBACK_AT_RENDERING_BACKGROUND, OnRenderBackground)
  231. Hooks.RegisterCallback(CH5_CALLBACK_AT_UPDATE, OnUpdate)
  232. Hooks.RegisterCallback(CH5_CALLBACK_AT_LOAD_SETTINGS, OnLoadSettings)
  233. Hooks.RegisterCallback(CH5_CALLBACK_AT_SAVE_SETTINGS, OnSaveSettings)


B#