简介
在进行C#代码注入的过程中,写的比较复杂的逻辑,但是reflector注入只能一个个函数来进行,而且添加paramter非常复杂,这里做了一个简单的代码分析器,帮助所有代码集中到一个函数中。
虽然感觉上比较简单,但做的过程中,花费了大半天的时间,这里把遇到的问题总结一下,给大家后续开发一些启示。
理论上C语言格式的都可以用这个解析把多个函数包含在一个函数里面
Reflector注入过程
- 1 导入相应的dll
- 2 tools decompile。 点右键 replaceWithCode。
- 3 子类添加函数基类,然后写函数。
- 4 在dll上右键Reflexil -> SaveAs相关dll即可。
遇到的问题
因为relector一次只支持注入一个函数,而我们写的显示代码是有多个函数的。
即使新加入一个类,也需要在这个类里面单独加入各个函数。
同时代码里面有互相的嵌套,而且有返回值和各个参数,如果单个的加非常的麻烦,而且reflector不支持返回值,相关的值只能放入输出参数,和原有的代码就大大违背了。
所以这里写了一个简单的代码分析器,用这个解析把多个函数包含在一个函数里面。
代码格式
首先读入的代码要编译通过
需要一些简单的约束:
- 1子函数必须有返回值,且返回值不能用和次子函数的参数相同。只有一个返回的出口。上支持上任意返回类型,只是父函数必须调用一下子函数返回的值。
- 2 调用函数的参数中不支持嵌套调用自己写的函数。
- 3 除非是返回值,否则临时变量需要自行设的是unique的。否则会重复定义。
- 4 “{}”这种单独占一行,一般C#编辑器会自动解析成这样。
- 5 函数不能循环调用,解析会进入循环。
- 6 目前只支持+=和+,如果需要其他运算符,在tpl_func_split中加。 特殊的运算序列没有做支持,当时这个分析器只是为了输出日志方便用的。
输入格式
//(joint为已知的Joint数据结构)
public string A(string p)
{
string tmpA = "add a" + p;
return tmpA;
}
public string B(Jointjoint, string c)
{
string tmp = "add b\n";
tmp += A(joint.format) + joint;
return tmp;
}
public void Jump()
{
string tmp = "start ===\n";
//tmp += "A " + A("12");
//tmp += B("34", "12");
tmp += " A B" + A("12") + B(joint, "c") + A("34");
}
输出格式
会经过代码分析器分析为:
public void Jump()
{
string tmp ="start ===\n";
string _result_6_ ="add a"+"12";
string _result_7_ ="add b\n";
string _result_8_ ="add a"+joint.format;
_result_7_ +=_result_8_+joint;
string _resul