allinall 发表于 2023-7-23 19:54

大工程-快手分享服务apk逆向分析-附源码

前言:本次逆向分析已经过开发者允许
逛论坛的时候无意间看到一款快手外链提取的app直达原帖
几年前的东西啊,我测试发现时居然还能用
作者也是爽快,直接开源,软件也没任何混淆
但是他发的只有核心部分,本次逆向就尝试脱出全部的lua布局
软件逆向分析一般分为以下几个步骤
1.反编译:将apk文件转换为可读的代码文件。可以使用工具如apktool、dex2jar等来进行反编译操作。这样可以获得apk的资源文件、Java源代码以及编译后的dex文件
2.静态分析:对反编译得到的代码进行分析,查找关键函数、数据结构和逻辑等。可以使用工具如IDA Pro、Ghidra等进行静态分析,也可以手动查看反编译得到的代码
3.动态分析:通过运行apk文件并监视其行为来获得更多信息。可以使用工具如Android Studio的 Profiler、Xposed、Frida等进行动态分析。这可以帮助识别apk的网络请求、敏感信息传输、加密算法等
4.逆向工程:通过修改反编译后的代码或者hook函数来破解apk。这需要对Java和Android框架有一定的了解,并且可能需要使用工具如Xposed、Frida等来帮助hook函数

当然本次分析的app没有任何混淆,是基于fa的源生态写的,所以直接反编译试试,就不需要算法助手这些工具了
首先使用工具如apktool将apk文件反编译为smali代码或者dex文件,这样就可以查看软件的资源文件、布局文件以及Java源代码
https://p3.a.yximgs.com/ufile/atlas/NTcwNjA1MzEyXzI0MDc0NTQ4MzUyXzE1ODI2ODQ4NjM4NDk=_0.jpg
尝试用开发者工具看一下具体的页面布局是否属于整体的lua
属于一个简单的lua界面
功能界面是属于简单的button按钮控制事件
再使用老朋友mt打开

使用jeb分析一下
有点乱,用lua工具再次调试
https://p3.a.yximgs.com/ufile/atlas/NTcwNjA1MzEyXzI0MDc0NTQ4MzUyXzE1ODI2ODQ4NjM4NDk=_0.jpg
可以分析发现,这个是通过抓包,将快手的视频分享特征抓出来,从而得到外链
最后将所有的lua源码导出(已修复)
本页布局(添加了注释[本人见解])
require"import"
import "android.app.*"
import "android.os.*"
import "android.widget.*"
import "android.view.*"

mygpub=
--主框架
{
LinearLayout;--线性布局
layout_width='match_parent';--布局宽度
layout_height='match_parent';--布局高度
background='#388E3C';--布局背景颜色(或者图片路径)

--纵向滚动框架
{
    ScrollView,
    layout_width="match_parent";
    layout_height="match_parent";
    VerticalScrollBarEnabled=false;

    {
      LinearLayout;--线性布局
      Orientation='horizontal';--布局方向
      layout_width='match_parent';--布局宽度
      layout_height='match_parent';--布局高度
      background='#5D4037';--布局背景颜色


      -- -----------左边竖布局开始--------------
      --左线程框架
      {
      LinearLayout;
      orientation="vertical";
      layout_width="49%w";
      layout_height="match_parent";
      layout_marginLeft="1%w";


      --第一个卡片按钮
      {
          CardView;--卡片控件
          layout_margin='10dp';--卡片边距
          layout_gravity='center';--重力属性
          Elevation='6dp';--阴影属性
          layout_width='45%w';--卡片宽度
          layout_height='45%h';--卡片高度
          radius='8dp';--卡片圆角
          CardBackgroundColor='#616161';--卡片背景颜色
          {
            LinearLayout;--线性布局
            id="l1";
            Orientation='horizontal';--布局方向
            layout_gravity='right';--重力属性
            layout_width='match_parent';--布局宽度
            layout_height='match_parent';--布局高度
            {
            LinearLayout;--线性布局
            layout_width='9%h';--布局宽度
            layout_height='11%h';--布局高度
            {
                CircleImageView;--圆形图片
                layout_marginLeft='3%w';--布局左距
                src='https://p4.a.yximgs.com/ufile/atlas/NTIwNTU5ODI5NzY5MDQxMjAxMF8xNjU3ODkwNTk5OTIz_4.jpg';--图片路径
                layout_width='12%w';--图片宽度
                layout_height='12%w';--图片高度
                layout_gravity='left|center';--重力属性
            };
            };
            {
            LinearLayout;--线性布局
            Orientation='vertical';--布局方向
            layout_gravity='right';--重力属性
            layout_width='match_parent';--布局宽度
            layout_height='match_parent';--布局高度
            {
                LinearLayout;--线性布局
                layout_width='match_parent';--布局宽度
                layout_height='5%h';--布局高度
                {
                  TextView;--文本控件
                  layout_marginTop='2%h';--布局顶距
                  layout_width='match_parent';--文本宽度
                  layout_height='match_parent';--文本高度
                  Gravity='left|center';--重力属性
                  textColor='#FF000000';--文本颜色
                  text='KS分享服务';--显示的文本
                  textSize='16sp';--文本大小
                };
            };
            {
                LinearLayout;--线性布局
                layout_width='match_parent';--布局宽度
                layout_height='6.1%h';--布局高度
                {
                  TextView;--文本控件
                  layout_width='match_parent';--文本宽度
                  layout_height='match_parent';--文本高度
                  Gravity='left';--重力属性
                  textColor='#69000000';--文本颜色
                  text='快手分享服务,支持图片/视频/音频等外链,永久有效';--显示的文本
                  textSize='12sp';--文本大小
                };
            };
            };
          };
          {
            CardView;--卡片控件
            layout_margin='0dp';--卡片边距
            layout_gravity='bottom';--重力属性
            Elevation='0dp';--阴影属性
            layout_width='match_parent';--卡片宽度
            layout_height='2%h';--卡片高度
            radius='0dp';--卡片圆角
            CardBackgroundColor='#9E9E9E';--卡片背景颜色
          };
      };



      --第二个卡片
      {
          CardView;--卡片控件
          layout_margin='10dp';--卡片边距
          layout_gravity='center';--重力属性
          Elevation='6dp';--阴影属性
          layout_width='45%w';--卡片宽度
          layout_height='45%h';--卡片高度
          radius='8dp';--卡片圆角
          CardBackgroundColor='#FF6E40';--卡片背景颜色
          {
            LinearLayout;--线性布局
            id="l2";
            Orientation='horizontal';--布局方向
            layout_gravity='right';--重力属性
            layout_width='match_parent';--布局宽度
            layout_height='match_parent';--布局高度
            {
            LinearLayout;--线性布局
            layout_width='9%h';--布局宽度
            layout_height='11%h';--布局高度
            {
                CircleImageView;--圆形图片
                layout_marginLeft='3%w';--布局左距
                src='https://p4.a.yximgs.com/ufile/atlas/NTIwNTU5ODI5NzY5MDQxMjAxMF8xNjU3ODkwNTk5OTIz_5.jpg';--图片路径
                layout_width='12%w';--图片宽度
                layout_height='12%w';--图片高度
                layout_gravity='left|center';--重力属性
            };
            };
            {
            LinearLayout;--线性布局
            Orientation='vertical';--布局方向
            layout_gravity='right';--重力属性
            layout_width='match_parent';--布局宽度
            layout_height='match_parent';--布局高度
            {
                LinearLayout;--线性布局
                layout_width='match_parent';--布局宽度
                layout_height='5%h';--布局高度
                {
                  TextView;--文本控件
                  layout_marginTop='2%h';--布局顶距
                  layout_width='match_parent';--文本宽度
                  layout_height='match_parent';--文本高度
                  Gravity='left|center';--重力属性
                  textColor='#FF000000';--文本颜色
                  text='分享该应用';--显示的文本
                  textSize='16sp';--文本大小
                };
            };
            {
                LinearLayout;--线性布局
                layout_width='match_parent';--布局宽度
                layout_height='6.1%h';--布局高度
                {
                  TextView;--文本控件
                  layout_width='match_parent';--文本宽度
                  layout_height='match_parent';--文本高度
                  Gravity='left';--重力属性
                  textColor='#69000000';--文本颜色
                  text='把好东西分享给大家,快乐加倍';--显示的文本
                  textSize='12sp';--文本大小
                };
            };
            };
          };
          {
            CardView;--卡片控件
            layout_margin='0dp';--卡片边距
            layout_gravity='bottom';--重力属性
            Elevation='0dp';--阴影属性
            layout_width='match_parent';--卡片宽度
            layout_height='2%h';--卡片高度
            radius='0dp';--卡片圆角
            CardBackgroundColor='#FFFF2F00';--卡片背景颜色
          };
      };

      };--左总线程框架结束
      -- -----------左边竖布局结束--------------




      -- -----------右边竖布局开始--------------
      --右总线程框架开始
      {
      LinearLayout;
      orientation="vertical";
      layout_width="49%w";
      layout_height="match_parent";
      layout_marginRight="1%w";


      --第一个卡片按钮
      {
          CardView;--卡片控件
          layout_margin='10dp';--卡片边距
          layout_gravity='center';--重力属性
          Elevation='6dp';--阴影属性
          layout_width='45%w';--卡片宽度
          layout_height='45%h';--卡片高度
          radius='8dp';--卡片圆角
          CardBackgroundColor='#303F9F';--卡片背景颜色
          {
            LinearLayout;--线性布局
            id="r1";
            Orientation='horizontal';--布局方向
            layout_gravity='right';--重力属性
            layout_width='match_parent';--布局宽度
            layout_height='match_parent';--布局高度
            {
            LinearLayout;--线性布局
            layout_width='9%h';--布局宽度
            layout_height='11%h';--布局高度
            {
                CircleImageView;--圆形图片
                layout_marginLeft='3%w';--布局左距
                src='https://p4.a.yximgs.com/ufile/atlas/NTIwNTU5ODI5NzY5MDQxMjAxMF8xNjU3ODkwNTk5OTIz_3.jpg';--图片路径
                layout_width='12%w';--图片宽度
                layout_height='12%w';--图片高度
                layout_gravity='left|center';--重力属性
            };
            };
            {
            LinearLayout;--线性布局
            Orientation='vertical';--布局方向
            layout_gravity='right';--重力属性
            layout_width='match_parent';--布局宽度
            layout_height='match_parent';--布局高度
            {
                LinearLayout;--线性布局
                layout_width='match_parent';--布局宽度
                layout_height='5%h';--布局高度
                {
                  TextView;--文本控件
                  layout_marginTop='2%h';--布局顶距
                  layout_width='match_parent';--文本宽度
                  layout_height='match_parent';--文本高度
                  Gravity='left|center';--重力属性
                  textColor='#FF000000';--文本颜色
                  text='法律声明';--显示的文本
                  textSize='16sp';--文本大小
                };
            };
            {
                LinearLayout;--线性布局
                layout_width='match_parent';--布局宽度
                layout_height='6.1%h';--布局高度
                {
                  TextView;--文本控件
                  layout_width='match_parent';--文本宽度
                  layout_height='match_parent';--文本高度
                  Gravity='left';--重力属性
                  textColor='#69000000';--文本颜色
                  text='做应用慢原因:写应用花一天,读法规花一年。';--显示的文本
                  textSize='12sp';--文本大小
                };
            };
            };
          };
          {
            CardView;--卡片控件
            layout_margin='0dp';--卡片边距
            layout_gravity='bottom';--重力属性
            Elevation='0dp';--阴影属性
            layout_width='match_parent';--卡片宽度
            layout_height='2%h';--卡片高度
            radius='0dp';--卡片圆角
            CardBackgroundColor='#FF0088C2';--卡片背景颜色
          };
      };



      --第二个卡片
      {
          CardView;--卡片控件
          layout_margin='10dp';--卡片边距
          layout_gravity='center';--重力属性
          Elevation='6dp';--阴影属性
          layout_width='45%w';--卡片宽度
          layout_height='45%h';--卡片高度
          radius='8dp';--卡片圆角
          CardBackgroundColor='#FFF59D';--卡片背景颜色
          {
            LinearLayout;--线性布局
            id="r2";
            Orientation='horizontal';--布局方向
            layout_gravity='right';--重力属性
            layout_width='match_parent';--布局宽度
            layout_height='match_parent';--布局高度
            {
            LinearLayout;--线性布局
            layout_width='9%h';--布局宽度
            layout_height='11%h';--布局高度
            {
                CircleImageView;--圆形图片
                layout_marginLeft='3%w';--布局左距
                src='https://p4.a.yximgs.com/ufile/atlas/NTIwNTU5ODI5NzY5MDQxMjAxMF8xNjU3ODkwNTk5OTIz_2.jpg';--图片路径
                layout_width='12%w';--图片宽度
                layout_height='12%w';--图片高度
                layout_gravity='left|center';--重力属性
            };
            };
            {
            LinearLayout;--线性布局
            Orientation='vertical';--布局方向
            layout_gravity='right';--重力属性
            layout_width='match_parent';--布局宽度
            layout_height='match_parent';--布局高度
            {
                LinearLayout;--线性布局
                layout_width='match_parent';--布局宽度
                layout_height='5%h';--布局高度
                {
                  TextView;--文本控件
                  layout_marginTop='2%h';--布局顶距
                  layout_width='match_parent';--文本宽度
                  layout_height='match_parent';--文本高度
                  Gravity='left|center';--重力属性
                  textColor='#FF000000';--文本颜色
                  text='作者有些话';--显示的文本
                  textSize='16sp';--文本大小
                };
            };
            {
                LinearLayout;--线性布局
                layout_width='match_parent';--布局宽度
                layout_height='6.1%h';--布局高度
                {
                  TextView;--文本控件
                  layout_width='match_parent';--文本宽度
                  layout_height='match_parent';--文本高度
                  Gravity='left';--重力属性
                  textColor='#69000000';--文本颜色
                  text='作者的一些话';--显示的文本
                  textSize='12sp';--文本大小
                };
            };
            };
          };
          {
            CardView;--卡片控件
            layout_margin='0dp';--卡片边距
            layout_gravity='bottom';--重力属性
            Elevation='0dp';--阴影属性
            layout_width='match_parent';--卡片宽度
            layout_height='2%h';--卡片高度
            radius='0dp';--卡片圆角
            CardBackgroundColor='#FFFFE001';--卡片背景颜色
          };
      };



      };--右总线程框架结束
      -- -----------右边竖布局结束--------------



    };--线程布局框架
};--纵向滚动框架
};--总框架
activity.setContentView(loadlayout(mygpub))

--波纹函数
function 波纹(id,颜色)
import "android.content.res.ColorStateList"
local attrsArray = {android.R.attr.selectableItemBackgroundBorderless}
local typedArray =activity.obtainStyledAttributes(attrsArray)
ripple=typedArray.getResourceId(0,0)
Pretend=activity.Resources.getDrawable(ripple)
Pretend.setColor(ColorStateList(int.class{int{}},int{颜色}))
id.setBackground(Pretend.setColor(ColorStateList(int.class{int{}},int{颜色})))
end
分享页lua布局(添加了注释[本人见解])
shamrock=
--布局
{
LinearLayout;--线性布局
Orientation='vertical';--布局方向
layout_width='fill';--布局宽度
layout_height='fill';--布局高度
background='https://p4.a.yximgs.com/ufile/atlas/NTIwNTU5ODI5NzY5MDQxMjAxMF8xNjU3ODkwNTk5OTIz_1.jpg';--布局背景颜色(或者图片路径)
gravity='center';
{
    StackView;
    id='stack';
    layout_width='900';
    layout_height='900';
};
};
activity.setContentView(loadlayout(shamrock))
--分享文件
function Sharing(path)
import "android.webkit.MimeTypeMap"
import "android.content.Intent"
import "android.net.Uri"
import "java.io.File"
FileName=tostring(File(path).Name)
ExtensionName=FileName:match("%.(.+)")
Mime=MimeTypeMap.getSingleton().getMimeTypeFromExtension(ExtensionName)
intent = Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setType(Mime);
file = File(path);
uri = Uri.fromFile(file);
intent.putExtra(Intent.EXTRA_STREAM,uri);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
activity.startActivity(Intent.createChooser(intent, "分享到:"));
end

--分享文字
text="文本"
intent=Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, "分享");
intent.putExtra(Intent.EXTRA_TEXT, text);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
activity.startActivity(Intent.createChooser(intent,"分享到:"));
作者主页布局(添加了注释[本人见解])
shamrock=
--布局请写在这里
{
LinearLayout;--线性布局
Orientation='vertical';--布局方向
layout_width='fill';--布局宽度
layout_height='fill';--布局高度
background='https://p4.a.yximgs.com/ufile/atlas/NTIwNTU5ODI5NzY5MDQxMjAxMF8xNjU3ODkwNTk5OTIz_0.jpg';--布局背景颜色(或者图片路径)
gravity='center';
{
    StackView;
    id='stack';
    layout_width='900';
    layout_height='900';
};
};
activity.setContentView(loadlayout(shamrock))

item={
LinearLayout;--线性布局
Orientation='vertical';--布局方向
layout_width='fill';--布局宽度
layout_height='fill';--布局高度
background='#00000000';--布局背景颜色(或者图片路径)
{
    CardView;--卡片控件
    id='card';
    layout_gravity='center';--重力属性
    Elevation='0';--阴影属性
    layout_width='750';--卡片宽度
    layout_height='750';--卡片高度
    radius='50';--卡片圆角
    CardBackgroundColor='#ff7e5cf8';--卡片背景颜色
    {
      TextView;--文本控件
      id='text';
      layout_width='fill';--文本宽度
      layout_height='fill';--文本高度
      Gravity='center';--重力属性
      textColor='#ffffff';--文本颜色
      text='ONE';--显示的文本
      textSize='20sp';--文本大小
    };
};
};
--创建项目数组
text_table={'不准翻开!','说了不准翻开!','你!怎么不听话!','你是不是喜欢我???','翻吧翻吧,没有啦!'}
data={}
color_table={0xff7e5cf8,0xff7ef7f8,0xfff65cf8,0xff7e00f8,0xff135cf8}
data={}
--创建适配器
adp=LuaAdapter(activity,data,item)
--添加数据
for n=1,5 do
table.insert(data,{
    text={
      Text=text_table,
    },
    card={
      BackgroundColor=color_table,
    },
})
end
--设置适配器
stack.Adapter=adp

stack.onItemClick=function()
--这里输入点击卡片执行的代码
end
软件核心--提取外链功能(添加了注释[本人见解])
require "import"
import "android.app.*"
import "android.os.*"
import "android.widget.*"
import "android.view.*"
layout={
LinearLayout;
layout_height="fill";
orientation="vertical";
layout_width="fill";
{
    Button;
    text="注意事项及使用教程";
    id="bt1";
    layout_gravity="center";
};
{
    Button;
    text="点击获取外链";
    id="bt";
    layout_gravity="center";
};
{
    LuaWebView;
    layout_width="match_parent";
    id="webView2";
    layout_height="50%h";
    Visibility="2";
};
{
    TextView;
    id="txt";
    layout_width="match_parent";
};
{
    ListView;
    id="lv";
    layout_height="match_parent";
    layout_width="match_parent";
};
};


activity.setTheme(android.R.style.Theme_DeviceDefault_Light)--设置md主题
--activity.setTheme(R.AndLua1)
activity.setTitle("外链获取")
activity.setContentView(loadlayout(layout))



import "android.content.Intent"
import "android.net.Uri"



item={
LinearLayout;
orientation="vertical";
{
    TextView;
    id="tx";
    layout_width="match_parent";
};
};


data={}
adp=LuaAdapter(activity,data,item)
lv.Adapter=adp

bt1.onClick=function
--这里输入点击注意事项及使用教程的执行的代码
end

bt.onClick=function
adp.clear()

InputLayout={
    LinearLayout;
    orientation="vertical";
    Focusable=true,
    FocusableInTouchMode=true,


    {
      EditText;
      text="";
      hint="输入视频分享链接";
      layout_marginTop="5dp";
      layout_width="80%w";
      layout_gravity="center",
      id="ed1";
    };
    {
      TextView;
      text="不用去掉文字,仅快手";
      layout_width="match_parent";
    };

};

AlertDialog.Builder(this)
.setTitle("需要获取外链的链接")
.setView(loadlayout(InputLayout))
.setPositiveButton("确定",{onClick=function(v)

      n=0
      webView2.loadUrl(ed1.Text)
      webView2.setWebViewClient{

      onLoadResource=function(view,url)

          if (url:find'upic')or (url:find'ufile') then--嗅探关键词,可自行添加
            -- webView2.stopLoading()
            adp.add{tx=url}
            n=n+1
            txt.setText("已获取到"..tostring(n).."条外链,请自行辨认")
          end
      end }



    end})
.setNegativeButton("取消",nil)
.show()



end


import "android.content.Context"
lv.onItemClick=function(l,v,p,i)
url=v.Tag.tx.Text
activity.getSystemService(Context.CLIPBOARD_SERVICE).setText(url)
import "android.content.Intent"
import "android.net.Uri"
viewIntent = Intent("android.intent.action.VIEW",Uri.parse(url))
activity.startActivity(viewIntent)
return true
end

allinall 发表于 2023-7-23 19:58

图床不靠谱啊{:1_908:}咋无法加载{:1_924:}
页: [1]
查看完整版本: 大工程-快手分享服务apk逆向分析-附源码