 先是今天的主角,极路由。 <p>获取root权限然后拿到web源码,找到对应文件</p> <p><img src="https://xiaokou.top/usr/uploads/md/1569651204062.png" alt="" /></p> <p><img src="https://xiaokou.top/usr/uploads/md/1569651262766.png" alt="" /><br /> <img src="https://xiaokou.top/usr/uploads/md/1569651242403.png" alt="" /></p> <p><img src="https://xiaokou.top/usr/uploads/md/1569651287367.png" alt="" /><br /> 确认了是lua 5.1以后,google找到了<a target="_blank" rel="noopener" href="http://ju.outofmemory.cn/entry/356320">文章</a>,根据内容操作发现了一些问题,最后也都解决了,在这里做一个记录。<br /> 首先</p> <ol> <li class="lvl-3"> <p>Lua有一种预编译机制,能够把文本代码预编译成Bytecode/Opcode 提高解析、执行速度,降低内存占用</p> </li> <li class="lvl-3"> <p>原版Lua(Vanilla Lua)默认的Bytecode的字节结构和OpenWrt的并不相同,因为OpenWrt为了一系列需要,在截止我写此文时候, 在Lua5.1.5的版本主线上 , 对原版的LUA引擎打了补丁 , 导致其产生的字节码和原版的Lua产生的并不一样 ,( <a target="_blank" rel="noopener" href="http://lua-users.org/lists/lua-l/2012-06/msg00065.html">http://lua-users.org/lists/lua-l/2012-06/msg00065.html</a> ),因此也不能使用原版的Lua引擎解释,会报类似 bad header in precompiled chunk 的错误</p> </li> <li class="lvl-3"> <p>本机尝试逆向原版的Lua产生的LuaC, 使用这个 luadec 项目 无任何问题 ,但是逆向Openwrt上的luaC失败, 所以需要在Openwrt的Patch过的Lua lib的基础上 ,编译luadec</p> </li> </ol> <p>如果是常规的lua文件 使用Unluac就可以。<br /> 但是我们的这个luac文件是openwrt处理后的,也就不能使用常规的unluac,需要手动打补丁。</p> <ol start="4"> <li class="lvl-3"> <p>过程</p> </li> </ol> <pre class="line-numbers language-none"><code class="language-none"> #安装依赖 sudo apt install libncurses-dev libreadline-dev #获得luadec源码 git clone https://github.com/viruscamp/luadec cd luadec git submodule update --init lua-5.1 #下面开始不同 ref=master patch_dir=patches.$ref mkdir $patch_dir && cd $patch_dir #如下命令需要grep支持pcre正则,如果不支持,请自己手动处理把。 patchs=$(curl -sSL -H 'Accept: application/vnd.github.v3+json' 'https://api.github.com/repos/openwrt/openwrt/contents/package/utils/lua/patches?ref='"$ref" |grep -oP 'name"s*:s*".*.patch' |grep -oP 'd+.*.patch') #下载补丁文件 #这里的补丁如果下载不成功,可以访问https://github.com/openwrt/openwrt/tree/master/package/utils/lua/patches-host 手动下载替换。 for p in $patchs;do wget 'https://github.com/openwrt-mirror/openwrt/raw/'"$ref"'/package/utils/lua/patches/'${p} -O $p; done cd ../lua-5.1 #打上补丁 for i in ../${patch_dir}/*.patch; do patch -p1 <$i ; done make linux<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre> <p>根据原文内的提示:<br /> <code>需要修改Makefile 给CFLAGS加上 -fPIC 选项 另外,为了使得Patch过后生成的so文件带版本号,还需要加上版本,最终生成的是如下的lua-5.1/src/Makefile的补丁 </code></p> <p>这里修改的是lua-5.1/src下的Makefile</p> <pre class="line-numbers language-none"><code class="language-none">--- Makefile.bak 2018-05-29 18:04:44.979014076 +0800 +++ Makefile 2018-05-29 18:21:35.110112120 +0800 @@ -8,7 +8,7 @@ PLAT= none CC= gcc -CFLAGS= -O2 -Wall $(MYCFLAGS) +CFLAGS= -fPIC -O2 -Wall $(MYCFLAGS) AR= ar rcu RANLIB= ranlib RM= rm -f @@ -18,7 +18,7 @@ MYLDFLAGS= MYLIBS= # USE_READLINE=1 - +PKG_VERSION = 5.1.5 # == END OF USER SETTINGS. NO NEED TO CHANGE ANYTHING BELOW THIS LINE ========= PLATS= aix ansi bsd freebsd generic linux macosx mingw posix solaris #由于openwrt中的lua默认情况下是通过动态链接库进行编译,会出现找不到函数体的错误,参考源码中的设置,将对lua库的连接改为静态: $(LUA_T): $(LUA_O) $(LUA_A) $(CC) -o $@ -L. -llua $(MYLDFLAGS) $(LUA_O) $(LUA_A) $(LIBS) $(LUAC_T): $(LUAC_O) $(LUA_A) $(CC) -o $@ -L. -llua $(MYLDFLAGS) $(LUAC_O) $(LUA_A) $(LIBS) <span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre> <p>做完这些以后,执行一下操作完成编译<br /> make linux<br /> export LD_LIBRARY_PATH=<code>pwd</code>/src/<br /> cd …/luadec<br /> make LUAVER=5.1</p> <ol start="5"> <li class="lvl-3"> <p>反编译luci-indexcache<br /> <img src="https://xiaokou.top/usr/uploads/md/1569652208101.png" alt="" /></p> </li> </ol> <p>