微擎 goto + 混淆加密, 反向解密思路

2021-01-04 18:15:29

写在前面(一堆废话着急请略过)

defined("IN_IA") or exit("Access Denied"); class yzxcpt_sunModuleWxapp extends WeModuleWxapp {public function doPageactivitylist() { goto ZBpAU; Yykb9: foreach ($res as $key => $value) { goto B8RTV; TUI2i: $allzan = pdo_fetchcolumn("select count(id) as count from" . tablename("yzxcpt_sun_activityzan") . " where uniacid = " . $_W["uniacid"] . " and aid = " . $value["id"]); goto XEsex; gjDMe: goto ubQkx; goto Aq3KL; FRAU3: DRIM_: goto BXJiV; u0xtV: ubQkx: goto TUI2i; XEsex: $res[$key]["zan"] = $value["xnzan"] + $allzan["count"]; goto FRAU3; riKrf: $res[$key]["iszan"] = 1; goto u0xtV; w07AK: $zan = pdo_get("yzxcpt_sun_activityzan", array("uniacid" => $_W["uniacid"], "uid" => $uid, "aid" => $value["id"])); goto V5M1X; V5M1X: if ($zan) { goto BB6x7; } goto k8F2e; k8F2e: $res[$key]["iszan"] = 0; goto gjDMe; B8RTV: $res[$key]["time"] = date("Y-m-d", $value["time"]); goto w07AK; Aq3KL: BB6x7: goto riKrf; BXJiV: } goto V7iyu; e8HwJ: $where .= " and type = " . $type; goto hDwoK; c9NgR: $this->return_msg(1, $res, "success"); goto wztqM; sMfnF: $type = $_GPC["type"]; goto Vl90R; pggxy: $where = " where uniacid = " . $_W["uniacid"] . " and status = 2"; goto UmOHV; c2hzE: $res = pdo_fetchall("select * from " . tablename("yzxcpt_sun_activity") . $where . " order by sort asc " . $limit); goto Yykb9; Vl90R: $uid = $_GPC["uid"]; goto j3k3y; bjheH: $limit = " limit " . $start . "," . $length; goto pggxy; j3k3y: $page = $_GPC["page"] ? $_GPC["page"] : 1; goto kY_oM; Z4LTa: $start = ($page - 1) * $length; goto bjheH; hDwoK: lMF7r: goto c2hzE; UmOHV: if (!$type) { goto lMF7r; } goto e8HwJ; V7iyu: Gtn_w: goto c9NgR; ZBpAU: global $_GPC, $_W; goto sMfnF; kY_oM: $length = $_GPC["length"] ? $_GPC["length"] : 10; goto Z4LTa; wztqM: }}
  • 1

这样就很难受,google 了一下有很多微擎 解密 的网站,都是按 kb 收费的,emmm,犹豫了一下没有剁手。
想着自己学着玩也没人给报销,并且这次掏钱包解决了,下次遇到还是不会。。。
索性研究研究吧。找了挺多相关帖子,奈何水平有限,那些文章提到的工具之类都不会用。只好用笨方法。
搜索论坛关键词,还没有人发过类似帖子。倒有不少求助解密的。授人以鱼不如授人以渔。
我这算是抛砖引玉吧,希望能有大佬写出脚本自动执行。节省人工。

准备工作
PHP goto 知识
PHP.net
PHP中文网
格式化代码

推荐工具

online PHP and Javascript Decoder
这个站点对变量值的混淆解析有用
缺点是不能解析goto

加密特征

目前发现微擎的加密主要是两种
变量值混淆
用 goto 语法 打乱正常代码顺序
根据上面的特征,就方便做出反向解密
变量值混淆
上面的工具可以解决,你可能好奇是怎么解析出来的
其实用 echo | var_dump( ) | print_r( ) 同样可以达到一样的效果
注意要用 " 双引号 " php 才会解析
具体是什么编码混淆的,因为本人能力有限。就不得而知了。有知道的大佬可以帮忙解惑。先谢谢啦。
goto 打乱正常代码顺序
目前我用的笨方法,就是一句一句找
按照 goto 顺序 重新剪切还原
缺点就是太浪费时间,目前还没有好的思路。想用正则可是不知道怎么写。。。。
希望大佬能有高效解决方案

调试过程
小技巧
微擎的方法多数以 global $_W, $_GPC; 开始。
(初始化两个全局变量)
微擎小程序的结尾多数是 $this->result( );
等理顺所有 goto 的时候,你会发现正好和最后一个 goto 标记相对
微擎还对条件判断语句做了加密。可以通过特征识别
只有一个 if( ){ } 的条件判断语句会取反。
if( ) { }else{ } 因为条件判断语句不能取反,所以按正常解析即可
if( ){ }elseif( ){ }elseif( ){ }… // 注意是没有 else{ }结尾的, 其中的最后一个 elseif( ) { }可能会取反
if( ){ } | elseif( ){ }… 开始特征 & 结束特征
else{ } 特征
特征在代码注释找吧,注释在 ----> // 去掉goto思路
我太困了.马上两点了。我要睡了zzz
格式化代码之后,清爽了很多。也更有耐心看下去啦。

defined("IN_IA") or exit("Access Denied");
class yzxcpt_sunModuleWxapp extends WeModuleWxapp
{
    public function doPagecoupontlist()
    {
        goto RJq8z;
        RJq8z: global $_GPC, $_W;
        goto Fd00u;
        Fd00u: $sid = $_GPC["sid"];
        goto zEa5k;
        zEa5k: $page = max(1, intval($_GPC["page"]));
        goto h9fAf;
        h9fAf: $size = intval($_GPC["length"]) ? intval($_GPC["length"]) : 10;
        goto pZcKj;
        pZcKj: $coupon = pdo_fetchall("select a.* from " . tablename("yzxcpt_sun_coupon") . "a left join " . tablename("yzxcpt_sun_shop_coupon") . "b on b.cid = a.id where b.sid = {$sid} and a.status=1 and a.checks = 1 and a.state!=1 and a.uniacid = " . $_W["uniacid"] . " and b.uniacid = " . $_W["uniacid"] . " limit " . ($page - 1) * $size . "," . $size);
        goto vffZo;
        vffZo: foreach ($coupon as $key => $value) {
            goto H8EAI;
            H8EAI: if ($value["state"] == 1) {
                goto Yn0N_;
            }
            goto sCZQr;
            sCZQr: if ($value["state"] == 2) {
                goto h23aY;
            }
            goto UDLmI;
            UDLmI: $coupon[$key]["shop"]["name"] = "通用";
            goto aaTT8;
            aaTT8: goto KEerh;
            goto OdbV7;
            OdbV7: Yn0N_: goto dMffH;
            dMffH: $coupon[$key]["shop"] = pdo_get("yzxcpt_sun_shop", array("uniacid" => $_W["uniacid"], "id" => $value["sid"]), array("name", "iscoupon"));
            goto x3KQl;
            x3KQl: goto KEerh;
            goto weAfu;
            weAfu: h23aY: goto s8Iqg;
            s8Iqg: $coupon[$key]["shop"]["name"] = "限部分商家使用";
            goto PQvO4;
            PQvO4: KEerh: goto oyZDv;
            oyZDv: IyHnC: goto Gzoio;
            Gzoio:
        }
        goto Fcg6E;
        Fcg6E: I1y9r: goto GoLNC;
        GoLNC: $info["coupon"] = $coupon;
        goto k3btY;
        k3btY: $info["set"] = pdo_get("yzxcpt_sun_vipcard_set", array("uniacid" => $_W["uniacid"]));
        goto vGEBd;
        vGEBd: $info["user"] = pdo_get("yzxcpt_sun_user", array("id" => $_GPC["uid"], "uniacid" => $_W["uniacid"]));
        goto UkXDm;
        UkXDm: $this->return_msg(1, $info, "success");
        goto GF5Hz;
        GF5Hz:
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
// 使用工具解析混淆 + 理顺 goto

defined("IN_IA") or exit("Access Denied");
class yzxcpt_sunModuleWxapp extends WeModuleWxapp
{
    public function doPagecoupontlist()
    {
        goto RJq8z;
        RJq8z: global $_GPC, $_W;
        goto Fd00u;
        Fd00u: $sid = $_GPC["sid"];
        goto zEa5k;
        zEa5k: $page = max(1, intval($_GPC["page"]));
        goto h9fAf;
        h9fAf: $size = intval($_GPC["length"]) ? intval($_GPC["length"]) : 10;
        goto pZcKj;
        pZcKj: $coupon = pdo_fetchall("select a.* from " . tablename("yzxcpt_sun_coupon") . "a left join " . tablename("yzxcpt_sun_shop_coupon") . "b on b.cid = a.id where b.sid = {$sid} and a.status=1 and a.checks = 1 and a.state!=1 and a.uniacid = " . $_W["uniacid"] . " and b.uniacid = " . $_W["uniacid"] . " limit " . ($page - 1) * $size . "," . $size);
        goto vffZo;
        vffZo: foreach ($coupon as $key => $value) {
            goto H8EAI;
            H8EAI: if ($value["state"] == 1) {
                goto Yn0N_;
            }
            goto sCZQr;
            sCZQr: if ($value["state"] == 2) {
                goto h23aY;
            }
            goto UDLmI;
            UDLmI: $coupon[$key]["shop"]["name"] = "通用";
            goto aaTT8;
            aaTT8: goto KEerh;
            goto OdbV7;
            OdbV7: Yn0N_: goto dMffH;
            dMffH: $coupon[$key]["shop"] = pdo_get("yzxcpt_sun_shop", array("uniacid" => $_W["uniacid"], "id" => $value["sid"]), array("name", "iscoupon"));
            goto x3KQl;
            x3KQl: goto KEerh;
            goto weAfu;
            weAfu: h23aY: goto s8Iqg;
            s8Iqg: $coupon[$key]["shop"]["name"] = "限部分商家使用";
            goto PQvO4;
            PQvO4: KEerh: goto oyZDv;
            oyZDv: IyHnC: goto Gzoio;
            Gzoio:
        }
        goto Fcg6E;
        Fcg6E: I1y9r: goto GoLNC;
        GoLNC: $info["coupon"] = $coupon;
        goto k3btY;
        k3btY: $info["set"] = pdo_get("yzxcpt_sun_vipcard_set", array("uniacid" => $_W["uniacid"]));
        goto vGEBd;
        vGEBd: $info["user"] = pdo_get("yzxcpt_sun_user", array("id" => $_GPC["uid"], "uniacid" => $_W["uniacid"]));
        goto UkXDm;
        UkXDm: $this->return_msg(1, $info, "success");
        goto GF5Hz;
        GF5Hz:
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
 // 去掉goto思路

defined("IN_IA") or exit("Access Denied"); class yzxcpt_sunModuleWxapp extends WeModuleWxapp { public function doPagecoupontlist() { global $_GPC, $_W; $sid = $_GPC["sid"]; $page = max(1, intval($_GPC["page"])); $size = intval($_GPC["length"]) ? intval($_GPC["length"]) : 10; $coupon = pdo_fetchall("select a. from " . tablename("yzxcpt_sun_coupon") . "a left join " . tablename("yzxcpt_sun_shop_coupon") . "b on b.cid = a.id where b.sid = {$sid} and a.status=1 and a.checks = 1 and a.state!=1 and a.uniacid = " . $_W["uniacid"] . " and b.uniacid = " . $_W["uniacid"] . " limit " . ($page - 1) $size . "," . $size); foreach ($coupon as $key => $value) { goto H8EAI; H8EAI: if ($value["state"] == 1) { goto Yn0N_; } goto sCZQr; sCZQr: if ($value["state"] == 2) { goto h23aY; }

        //
        /**
         * 上面的 H8EAI 紧跟 if代码块
         * 代码块结束后的 goto sCZQr;
         * sCZQr: 又是 if 代码块 
         * 并且 条件变量 $value["state"] 是一样的
         * 通过 代码结构 和 上下文语境 可以肯定 sCZQr 代表 elseif
         */
        goto UDLmI;
        UDLmI: $coupon[$key]["shop"]["name"] = "通用";
        goto aaTT8;
        aaTT8: goto KEerh;

        //
        /**
         * goto aaTT8;
         * aaTT8: 紧跟 goto KEerh; (goto标签)
         * 这种格式:
         *      goto 标签1;
         *      标记1: goto 标签2;
         * 这种代表条件判断语句的 结束
         * 条件结束有两种 
         *      一种是 if(){} | elseif(){} 结束
         *      另一种就是 else{} 结束
         * 那么上面的这段是 if | elseif 结束 还是 else 结束呢?
         * 下面有例子会更好理解
         * 
         * 
         */
        goto OdbV7;
        OdbV7: Yn0N_: goto dMffH;
        /**
         * goto 标签1;
         * 标记1: 花括号内标记Yn0N_: goto 标签2;
         * 这种格式
         *      goto 标签1;
         *      标记1: 花括号内标记x: goto 标签2;
         * 这种格式,表示 标签2 指向的 这段代码会是嵌套的代码
         * 也可以理解成
         * 从 花括号内标记x: goto标签2
         *      // 代码段;
         *      直到遇到结束特征。之间的内容, 都属于花括号内标记x
         * 
         */
        dMffH: $coupon[$key]["shop"] = pdo_get("yzxcpt_sun_shop", array("uniacid" => $_W["uniacid"], "id" => $value["sid"]), array("name", "iscoupon"));
        goto x3KQl;
        x3KQl: goto KEerh;
        /**
         * 又遇到
         *      goto 标签1;
         *      标记1: goto 标记2;
         * 上面知道了这种格式 代表结束
         * 分析这段代码
         *      goto OdbV7;
         *      OdbV7: Yn0N_:(花括号内的标记) goto dMffH; 
         *      dMffH:
         *          // 代码段;
         *      goto x3KQl;
         *      x3KQl: goto KEerh;  
         *  //
         * 其中的 `OdbV7: Yn0N_:(花括号内的标记) goto dMffH;`  代表了 if( ){ } 或者 elseif( ) { } 的起始特征
         * 并且这种结构像是代码结构中的嵌套,这种嵌套特征也适用于用在 foreach( ) { } 等循环的嵌套中
         *  //
         *  最后的 `x3KQl: goto KEerh;` 代表了上面嵌套内容的结束特征
         *  
         *  //
         * 再来看最早见到的,那一段带有结束特征的代码结构
         * goto UDLmI;
         * UDLmI: $coupon[$key]["shop"]["name"] = "通用";
         * goto aaTT8;
         * aaTT8: goto KEerh;
         * 他的结构上没有类似上面起始特征。只看到结束特征:
         *      goto 标签1;
         *      标记1: 花括号内标记: goto 标签2;
         * 所以由此判断这段 goto 代表 else
         *
         */
        goto weAfu;
        weAfu: h23aY: goto s8Iqg;
        s8Iqg: $coupon[$key]["shop"]["name"] = "限部分商家使用";
        goto PQvO4;
        PQvO4: KEerh: goto oyZDv;
        oyZDv: IyHnC: goto Gzoio;
        Gzoio:
    }
    goto Fcg6E;
    Fcg6E: I1y9r: goto GoLNC;
    GoLNC: $info["coupon"] = $coupon;
    goto k3btY;
    k3btY: $info["set"] = pdo_get("yzxcpt_sun_vipcard_set", array("uniacid" => $_W["uniacid"]));
    goto vGEBd;
    vGEBd: $info["user"] = pdo_get("yzxcpt_sun_user", array("id" => $_GPC["uid"], "uniacid" => $_W["uniacid"]));
    goto UkXDm;
    UkXDm: $this->return_msg(1, $info, "success");
    goto GF5Hz;
    GF5Hz:
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
// 最终成品
defined("IN_IA") or exit("Access Denied");
class yzxcpt_sunModuleWxapp extends WeModuleWxapp
{
    public function doPagecoupontlist()
    {
        global $_GPC, $_W;
        $sid = $_GPC["sid"];
        $page = max(1, intval($_GPC["page"]));
        $size = intval($_GPC["length"]) ? intval($_GPC["length"]) : 10;
        $coupon = pdo_fetchall("select a.* from " . tablename("yzxcpt_sun_coupon") . "a left join " . tablename("yzxcpt_sun_shop_coupon") . "b on b.cid = a.id where b.sid = {$sid} and a.status=1 and a.checks = 1 and a.state!=1 and a.uniacid = " . $_W["uniacid"] . " and b.uniacid = " . $_W["uniacid"] . " limit " . ($page - 1) * $size . "," . $size);
        foreach ($coupon as $key => $value) {
            if ($value["state"] == 1) {
                $coupon[$key]["shop"] = pdo_get("yzxcpt_sun_shop", array("uniacid" => $_W["uniacid"], "id" => $value["sid"]), array("name", "iscoupon"));
            }elseif ($value["state"] == 2) {
                $coupon[$key]["shop"]["name"] = "限部分商家使用";
            }else {
                $coupon[$key]["shop"]["name"] = "通用";
            }
        }
        $info["coupon"] = $coupon;
        $info["set"] = pdo_get("yzxcpt_sun_vipcard_set", array("uniacid" => $_W["uniacid"]));
        $info["user"] = pdo_get("yzxcpt_sun_user", array("id" => $_GPC["uid"], "uniacid" => $_W["uniacid"]));
        $this->return_msg(1, $info, "success");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

抄自于吾爱破解大佬,原文地址:https://www.52pojie.cn/thread-1177103-1-1.html

发表评论:

Powered by PHP 学习者(mail:517730729@qq.com)

原百度博客:http://hi.baidu.com/ssfnadn

备案号:闽ICP备17000564号-1

开源中国 PHPCHINA