0x01定位开心消消乐lua的解析引擎在libhegame.so中,用IDA分析,发现很多函数并没有符号,包括所使用的OpenSSL和Lua的第三方库,增加了逆向的难度。不过字符串并没有加密,可以通过查找".lua""load"这些字符串找到关键地方,通过字符串可以快速定位到加载lua文件的地方。
void__fastcalllua_load(inta1)
{
intv1;//r0
1intv2;//r3
1int*v3;//r0
3intv4;//r0
3signedintv5;//r7
3intv6;//r0
4intv7;//r0
6intv8;//r5
6intv9;//r6
12intv10;//r5
12intv11;//r0
15intv12;//r4
15intv13;//r5
17intv14;//r4
18intv15;//r5
7intv16;//r0
30intv17;//r6
30intv18;//r0
30intv19;//r0
30intv20;//r0
30intv21;//r0
30intv22;//r0
30intv23;//r0
30intv24;//r0
30intv25;//r6
30intv26;//r0
30intv27;//r0
31intv28;//r0
31int*v29;//r0
33constchar*v30;//r1
33intv31;//r0
16intbuf;//[sp+8h][bp-h]
4intv33;//[sp+Ch][bp-h]
3intv34;//[sp+10h][bp-h]
1intv35;//[sp+1Ch][bp-F4h]
1charv36;//[sp+20h][bp-F0h]
2intv37;//[sp+24h][bp-ECh]
3charv38;//[sp+28h][bp-E8h]
3charv39;//[sp+2Ch][bp-E4h]
3charv40;//[sp+30h][bp-E0h]
3intv41;//[sp+34h][bp-DCh]
3unsignedintlen;//[sp+38h][bp-D8h]
6intv43;//[sp+3Ch][bp-D4h]
18intout;//[sp+40h][bp-D0h]
3intv45;//[sp+44h][bp-CCh]
1charv46;//[sp+48h][bp-C8h]
32v34=a1;
v1=sub_30E();
sub_30D((int)v35,v1,(int)v45);
v2=sub_30D6B0(v35,".lua",0);
if(v2==*(_DWORD*)(v35-12)-4)
{
sub_30D(v36,v35,0,v2);
sub_30D(v35,v36);
sub_30D((int)v36);
}
sub_30D((int)v38,(int)".",(int)out);
sub_30D((int)v39,(int)"/",(int)v45);
sub_C(v40,v35,v38,v39);
v3=(int*)sub_30D(v40,".lua");
v37=*v3;
*v3=(int)unk_3F3A68;
sub_30D((int)v40);
sub_30D((int)v39);
sub_30D((int)v38);
v4=sub_74CD8(v41,"src/",v37);
v33=2;
v5=0;
do
{
v6=sub_BC(v4);
buf=(*(int(**)(void))(*(_DWORD*)v6+16))();
if(buf)
{
v7=sub_EC();
v8=len;
if(v7)
{
sub_74CD8(v45,"
",v37);v15=sub_30E(v34,buf,v8,v45);//读取lua文件
sub_30D((int)v45);
if(v15)
v5=3;
}
elseif(len=0x10)//这里可以知道这个变量是文件的长度
{
sub_("load_lua","cannotgetenoughfiledataof%s",v41);
v5=5;
}
else
{
if(!(dword_3EC1)sub_30D(dword_3EC))
{
byte_3E=0xE9u;
byte_3E=0x74;
byte_3E=0x92u;
byte_3E=0xCCu;
byte_3E=0x32;
byte_3E=0x2E;
byte_3E=0x2E;
byte_3EA=0x7C;
byte_3EB=0x34;
byte_3EC=0x51;
byte_3ED=0xD7u;
byte_3E2=0x7D;
byte_3E7=0x7D;
byte_3EE=0xB3u;
byte_3E8=0x11;
byte_3EF=0x6A;
sub_30D((int)dword_3EC);
}
v9=len-16;
out=0;
v45=0;
v10=aes_cbc_decrypt((int)byte_3E,buf,buf+16,len-16,out);//第一个参数为keyaes解密IV为文件开头的16个字节
if(v10
(v10=aes_cbc_decrypt((int)byte_3E,buf,buf+16,v9,out))!=0)
{
zib_de