微擎 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
发表评论: