AndLua加密解密

AndLua加密解密Andlua 加密解密 解密 lua 进入关键函数 Lua loader buffer 首先判断第一个字符为 之后根据 base64 解码表映射解密 base64 其中将第一个字符替换为 0x1d 即为 0x1d 0x2b H 解码 base64 后的结果如下所示 如果第一个字符为 0x1c 进行异或解密

大家好,我是讯享网,很高兴认识大家。

Andlua加密解密

解密lua

进入关键函数Lua_loader_buffer首先判断第一个字符为=

之后根据base64解码表映射解密base64,其中将第一个字符替换为0x1d,即为0x1d+0x2b=H
在这里插入图片描述
讯享网

解码base64后的结果如下所示

如果第一个字符为0x1c进行异或解密

最后再将第一个字符0x1c替换为0x78,进行inflate解码,解码完成后将第一个字符替换为28(0x1c)

解密算法如下

import base64 import base64 import zlib fp=open("main.lua","rb") buffer=fp.read() buffer=b'H'+buffer[1:] buffer=base64.b64decode(buffer) init=0 buffer_dec1=[] for i in buffer: init=init^i buffer_dec1.append(init) buffer_dec1=bytes(buffer_dec1) buffer_dec2=b'\x78'+buffer_dec1[1:] decompressed = zlib.decompress(buffer_dec2) print(decompressed[0]) with open("main.lua_dec","wb") as f: f.write(b'\x1b'+decompressed[1:]) 

讯享网

得到Luas的文件,利用unluac反编译,提示错误的signature

看了下lua文件头,修改第一个字符为0x1b

讯享网java -jar unluac.jar main.lua_dec 

成功反编译,不过得到类似如下的文件 字符串都被加密

_ENV["u\229\136\006\133\020\186"]("o\024\148;\177G") _ENV["o\024\148;\177G"]("l\021\141*\169\\\199<\225\158-\229\016") _ENV["o\024\148;\177G"]("m\023\130&\174F\248$\024\151|\149") _ENV["o\024\148;\177G"]("q\239\150\022\186.\220\004\236d\026\136\004\166j\159") _ENV["o\024\148;\177G"]("o\019\136.\164R\2064\255\145\r\160i\156") _ENV["o\024\148;\177G"]("j\025\1472\1866") _ENV["i\018\174-\219~\244\144"]["{\230\138.\157\020\129\r" 

lua字符串解密

跟踪lua 5.3源码。

讯享网lua_load()@lapi.c |-lua_lock() |-luaZ_init() |-luaD_protectedparser() | |-luaZ_initbuffer() | |-luaD_pcall() # 实际调用的是f_parser() | | |-zgetc() # 获取第一个字符,判断是否已经编译 | | | #================= | | |-checkmode() # 1. 如果是二进制 | | |-luaU_undump() # 1.1 加载预编译的二进制代码 | | |-checkmode() # 2. 如果是文本 | | |-luaY_parser() | | | |-mainfunc() | | | |-luaX_next() | | | | |-llex() | | | |-statlist() # 词法解析主函数 | | | |-statement() # 根据相应的词法进行处理 | | | |-ifstat() # | | | |-whilestat() | | | #================= | | |-luaF_initupvals() | |-luaZ_freebuffer() # 释放一系列缓存 | |-... ... |-lua_unlock() 

发现load_string函数被魔改

static TString* LoadString(LoadState* S) { size_t size = LoadByte(S); if (size == 0xFF) LoadVar(S, size); if (size == 0) return NULL; else if (--size <= LUAI_MAXSHORTLEN) { /* short string? */ char buff[LUAI_MAXSHORTLEN]; LoadVector(S, buff, size); return luaS_newlstr(S->L, buff, size); } else { /* long string */ TString* ts = luaS_createlngstrobj(S->L, size); LoadVector(S, getstr(ts), size); /* load directly in final place */ return ts; } } 

解密算法大致如下

讯享网 int x=size-1; int v5=b.charAt(0)^x; int v6=x+v5; char v8=(char)x; for(int i=0;i<size-1;i++){ 
    v8=(char)((char)x%255); x+=v6; b.setCharAt(i,(char)(((char)b.charAt(i))^((char)v8))); } 

修改unluac LstringTypejava中的代码即可实现解密得到源码

require("import") import("android.app.*") import("android.os.*") import("android.widget.*") import("android.view.*") import("layout") activity.setTheme(R.Theme_Blue) activity.setTitle("HelloWorld") activity.setContentView(loadlayout(layout)) function start.onClick() print("thank") os.execute("/data/local/tmp/edh269") end 

参考链接

https://gohalo.me/post/lua-sourcecode.html

小讯
上一篇 2025-02-05 17:30
下一篇 2025-01-23 23:12

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/31342.html