[休闲代码]自己输出自己,路过有分 刚才在水区看到一个有点意思的题目:程序运行后输出的结果就是程序本身一模一样的源代码第一个调试通过的30分,之后通过的10分,最简短的加10分,有创意的加10分余下散掉(限C#代码,最好是控制台程序) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 //输出自己//VC6下通过#include <iostream>#include <fstream>using namespace std;int main(){ ifstream ifs(__FILE__); cout << ifs.rdbuf(); ifs.close(); } to codeloveforever:自己输出自己的源代码文件属于犯规,因为源代码本身不是执行程序的一部分。to hm7921936:逻辑?你是怎么推理的?如果没有答案这个题目就没有意思了...多谢关注,大家继续 Reflector...Reflector...Reflector...不过俺这么懒...是不愿动脑筋写这个代码的... static void Main(string[] args) { string path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase; path = path.Replace("\\bin\\Debug", "") + "Program.cs"; if (System.IO.File.Exists(path) == true) { System.IO.StreamReader stream = new System.IO.StreamReader(path); string mystring; mystring = stream.ReadToEnd(); Console.Write(mystring); } System.Console.ReadKey(); } static void Main(string[] args) { string path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase; path = path.Replace("\\bin\\Debug", "") + "Program.cs"; if (System.IO.File.Exists(path) == true) { System.IO.StreamReader stream = new System.IO.StreamReader(path); string mystring; mystring = stream.ReadToEnd(); Console.Write(mystring); stream.Close(); } System.Console.ReadKey(); } 呵呵,已经说过,自己读自己的源代码是犯规我先把自己写答案贴在这里,采用base64贴出觉得没什么好的想法或不怕被限制思路,可以解开看dXNpbmcgU3lzdGVtOw0KdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQp1c2luZyBTeXN0ZW0uVGV4dDsNCm5hbWVzcGFjZSBDb25zb2xlQXBwbGljYXRpb24xDQp7DQogICAgY2xhc3MgUHJvZ3JhbQ0KICAgIHsNCiAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQ0KICAgICAgICB7DQogICAgICAgICAgICBzdHJpbmdbXSBjb2RlTGluZXMgPSBuZXcgc3RyaW5nW10gew0KICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW07IiwNCiAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7IiwNCiAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLlRleHQ7IiwNCiAgICAgICAgICAgICAgICAibmFtZXNwYWNlIENvbnNvbGVBcHBsaWNhdGlvbjEiLA0KICAgICAgICAgICAgICAgICJ7IiwNCiAgICAgICAgICAgICAgICAiICAgIGNsYXNzIFByb2dyYW0iLA0KICAgICAgICAgICAgICAgICIgICAgeyIsDQogICAgICAgICAgICAgICAgIiAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKSIsDQogICAgICAgICAgICAgICAgIiAgICAgICAgeyIsDQogICAgICAgICAgICAgICAgIiAgICAgICAgICAgIHN0cmluZ1tdIGNvZGVMaW5lcyA9IG5ldyBzdHJpbmdbXSB7IiwNCiAgICAgICAgICAgICAgICAiIiwNCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgfTsiLA0KICAgICAgICAgICAgICAgICIgICAgICAgICAgICBmb3JlYWNoIChzdHJpbmcgY29kZUxpbmUgaW4gY29kZUxpbmVzKSIsDQogICAgICAgICAgICAgICAgIiAgICAgICAgICAgIHsiLA0KICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgaWYgKGNvZGVMaW5lID09IHN0cmluZy5FbXB0eSkiLA0KICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgeyIsDQogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGNvbnN0TGluZSBpbiBjb2RlTGluZXMpIiwNCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICB7IiwNCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gMTY7IGkrKykiLA0KICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgoY2hhcikweDIwKTsiLA0KICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKChjaGFyKTB4MjIpOyIsDQogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoY29uc3RMaW5lKTsiLA0KICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKChjaGFyKTB4MjIpOyIsDQogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKChjaGFyKTB4MkMpOyIsDQogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgfSIsDQogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICB9IiwNCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGNvZGVMaW5lKTsiLA0KICAgICAgICAgICAgICAgICIgICAgICAgICAgICB9IiwNCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgQ29uc29sZS5SZWFkS2V5KCk7IiwNCiAgICAgICAgICAgICAgICAiICAgICAgICB9IiwNCiAgICAgICAgICAgICAgICAiICAgIH0iLA0KICAgICAgICAgICAgICAgICJ9IiwNCg0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBjb2RlTGluZSBpbiBjb2RlTGluZXMpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKGNvZGVMaW5lID09IHN0cmluZy5FbXB0eSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBjb25zdExpbmUgaW4gY29kZUxpbmVzKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSAxNjsgaSsrKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoKGNoYXIpMHgyMCk7DQogICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKChjaGFyKTB4MjIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShjb25zdExpbmUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgoY2hhcikweDIyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKChjaGFyKTB4MkMpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGNvZGVMaW5lKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIENvbnNvbGUuUmVhZEtleSgpOw0KICAgICAgICB9DQogICAgfQ0KfQ0K .Net虽然不像JAVA直接源代码执行,但是其代码是可以逆转换的,解析之初是IL代码,然后能映射为C#代码,现在就有很知名的程序专门逆向.Net工程。但是做到和源代码一模一样是不可能的,只能做到功能上完全一样,甚至成员名称也一样,所以为防止逆向工程侵害版权,才有混淆器的出现,混淆器将所有成员以无意义的名称重命名,以给逆转者造成阅读障碍。 即使 Reflector 之后也不是原原本本的 using System;class PrintSource{ static void Main() { string s = "using System;{0}{0}class PrintSource{0}{2}{0} static void Main(){0} {2}{0} string s = {1}{4}{1};{0} Console.WriteLine(s, (char)10, (char)34, (char)123, (char)125, s);{0} {3}{0}{3}"; Console.WriteLine(s, (char)10, (char)34, (char)123, (char)125, s); }} fish_autumn写的代码调试通过和C代码很象#include <stdio.h>char *a="#include <stdio.h>%c%cchar *a=%c%s%c;%c%cint main(){printf(a,13,10,34,a,34,13,10); return 0;}"; int main(){printf(a,13,10,34,a,34,13,10); return 0;}我写的代码是这样的,长了一点:using System;using System.Collections.Generic;using System.Text;namespace ConsoleApplication1{ class Program { static void Main(string[] args) { string[] codeLines = new string[] { "using System;", "using System.Collections.Generic;", "using System.Text;", "namespace ConsoleApplication1", "{", " class Program", " {", " static void Main(string[] args)", " {", " string[] codeLines = new string[] {", "", " };", " foreach (string codeLine in codeLines)", " {", " if (codeLine == string.Empty)", " {", " foreach (string constLine in codeLines)", " {", " for (int i = 1; i <= 16; i++)", " Console.Write((char)0x20);", " Console.Write((char)0x22);", " Console.Write(constLine);", " Console.Write((char)0x22);", " Console.WriteLine((char)0x2C);", " }", " }", " Console.WriteLine(codeLine);", " }", " Console.ReadKey();", " }", " }", "}", }; foreach (string codeLine in codeLines) { if (codeLine == string.Empty) { foreach (string constLine in codeLines) { for (int i = 1; i <= 16; i++) Console.Write((char)0x20); Console.Write((char)0x22); Console.Write(constLine); Console.Write((char)0x22); Console.WriteLine((char)0x2C); } } Console.WriteLine(codeLine); } Console.ReadKey(); } }} 思路是把源代码复制 然后重命名 成 txt格式的 然后读取应该是这样了的 不过如果是 C# 搞懂 公共语言运行 库就OK 了!~ 很多人误解这道题了,我想这道题不是什么技术高深的问题,不是叫你反汇编,反MIL,读取源文件==,纯粹就是一道技巧题一但你Console.WriteLine("你的代码")那么在"你的代码"里又要包含"Console.WriteLine("你的代码")",而这里的"你的代码"就会造成两面对着的镜一样,会无限反射, 即自己照不出自己需要利用一定的字符操作的技巧才能完成这道题.例如 fish_autumn(Autumn) 的代码. 有那么难啊?...IO操作ReadLine不就可以了? 看了 fish_autumn(Autumn) 的代码成功的原因有两点1.在输出的语句使用了 {0} {1} {2]...2.在输出双引号时使用了 ASCII 码第一点使得他能自己输出自己只要Console.WriteLine(s, ... s);第二点免去了转义字符带来的麻烦你是可以想象在s="s = {0}...Console.WriteLine(s, \"\"\" s);";Console.WriteLine(s, "\"" s);在s里的 \"\"\" 与代码的"\"" 产生不一致性 应该是s="s = {0}...Console.WriteLine(s, \"\\\"\" s);";Console.WriteLine(s, "\"" s);在s里的 \"\\\"\" 与代码的"\"" 产生不一致性 再更正成功的原因有两点1.在输出的语句使用了 {0} {1} {2]...2.在输出符号时使用了 ASCII 码 没看明白LZ给出的代码, " string[] codeLines = new string[] {", "", " };",这个地方有输出时是要将""替换掉的,但替换成什么样的字符串呢?替换了会不会和原代码一样呢?这里也存在迭代的问题吧?? 如果用console输出字符串代码。 而不是反编译代码的话 ,根本无法实现的。 就和俩镜子对照一样。 无限反射。就和数字可以无限大一样。 LS 运行一下fish_autumn(Autumn) 的代码, 他实现了 程序写的妙,是我没想到的。基本思路理解,琢磨了半天string s = "using System;{0}{0}class PrintSource{0}{2}{0} static void Main(){0} {2}{0} string s = {1}{4}{1};{0} Console.WriteLine(s, (char)10, (char)34, (char)123, (char)125, s);{0} {3}{0}{3}"; Console.WriteLine(s, (char)10, (char)34, (char)123, (char)125, s);只明白了一半,也许是语法不过关,谁来耐心解释一下,每个句读。不甚感激啊。这题目很有意思。 根据LZ的给出的代码提示,下面的代码测试通过using System;using System.Text;namespace ConsoleApplication1{ class Program { static void Main(string[] args) { string[] codeLines = new string[] { "using System;", "using System.Text;", "namespace ConsoleApplication1", "{", " class Program", " {", " static void Main(string[] args)", " {", " string[] codeLines = new string[] {", "", " };", " foreach (string codeLine in codeLines)", " {", " if (codeLine ==string.Empty)", " {", " foreach (string constLine in codeLines)", " {", @" if(constLine.IndexOf('+') >=0)", @" Console.WriteLine( new string(' ',10) + '\x40'.ToString() + '\x22'+ constLine + '\x22'+ '\x2C');", " else", @" Console.WriteLine( new string(' ',10) + '\x22'+ constLine + '\x22' +'\x2C');", " }", " }", " Console.WriteLine(codeLine);", " }", " }", " }", "}", }; foreach (string codeLine in codeLines) { if (codeLine == string.Empty ) { foreach (string constLine in codeLines) { if(constLine.IndexOf('+') >=0) Console.WriteLine( new string(' ',10) + '\x40'.ToString() + '\x22'+ constLine + '\x22'+ '\x2C'); else Console.WriteLine( new string(' ',10) + '\x22'+ constLine + '\x22' +'\x2C'); } } Console.WriteLine(codeLine); } } }} string s = "using System;{0}{0}class PrintSource{0}{2}{0} static void Main(){0} {2}{0} string s = {1}{4}{1};{0} Console.WriteLine(s, (char)10, (char)34, (char)123, (char)125, s);{0} {3}{0}{3}";Console.WriteLine(s, (char)10, (char)34, (char)123, (char)125, s);Console.WriteLine() 时:(char)10: 即 \n ,替换s中的{0}(char)34: 即 " ,替换s中的{1}(char)123:即 { ,替换s中的{2}(char)125:即 } ,替换s中的{3}s 本身替换s中的{4} ...............................用反射得到当前运行的assembliy用Sharpdevelop的addin插件思路找到当前运行的CS文件参考楼上某兄的方法将cs文件路径替换static void Main(string[] args) { string path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase; path = path.Replace("\\bin\\Debug", "") + "Program.cs"; if (System.IO.File.Exists(path) == true) { System.IO.StreamReader stream = new System.IO.StreamReader(path); string mystring; mystring = stream.ReadToEnd(); Console.Write(mystring); } System.Console.ReadKey(); } An old game!http://www.nyx.net/~gthompso/quine.htmhttp://www.cnblogs.com/Ninputer/archive/2006/04/04/366554.html http://www.nyx.net/~gthompso/quine.htm这里收集得比较全,各种语言都有 请问怎么统计汉字字数和英语单词数 求助datetimepicker只能有年月日有什么控件或方法可以具体到时间 win7旗舰版安装Visual Studio 2010 Ultimate失败,求救! .dll文件引用C#设置 请教一个关于文档转换为XML的问题 winform程序如何实现在规定的时间通过FTP协议读取服务器上的文本文件? 下面的语句有什么作用? 高手请进!!!! 自动生成网页问题,急!多分! 如何在C#中操作oracle,做增加用户,建立表空间这些操作!(一旦好使,立刻给分!!) 如果使用批处理文件删除一文件夹下面的所有文件?谢谢 reportViewer打印问题
//VC6下通过#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream ifs(__FILE__);
cout << ifs.rdbuf();
ifs.close();
}
自己输出自己的源代码文件属于犯规,因为源代码本身不是执行程序的一部分。to hm7921936:
逻辑?你是怎么推理的?如果没有答案这个题目就没有意思了...多谢关注,大家继续
{
string path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
path = path.Replace("\\bin\\Debug", "") + "Program.cs";
if (System.IO.File.Exists(path) == true)
{
System.IO.StreamReader stream = new System.IO.StreamReader(path);
string mystring;
mystring = stream.ReadToEnd();
Console.Write(mystring);
}
System.Console.ReadKey();
}
{
string path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
path = path.Replace("\\bin\\Debug", "") + "Program.cs";
if (System.IO.File.Exists(path) == true)
{
System.IO.StreamReader stream = new System.IO.StreamReader(path);
string mystring;
mystring = stream.ReadToEnd();
Console.Write(mystring);
stream.Close();
}
System.Console.ReadKey();
}
我先把自己写答案贴在这里,采用base64贴出
觉得没什么好的想法或不怕被限制思路,可以解开看dXNpbmcgU3lzdGVtOw0KdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQp1c2luZyBTeXN0ZW0uVGV4dDsNCm5hbWVzcGFjZSBDb25zb2xlQXBwbGljYXRpb24xDQp7DQogICAgY2xhc3MgUHJvZ3JhbQ0KICAgIHsNCiAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQ0KICAgICAgICB7DQogICAgICAgICAgICBzdHJpbmdbXSBjb2RlTGluZXMgPSBuZXcgc3RyaW5nW10gew0KICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW07IiwNCiAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7IiwNCiAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLlRleHQ7IiwNCiAgICAgICAgICAgICAgICAibmFtZXNwYWNlIENvbnNvbGVBcHBsaWNhdGlvbjEiLA0KICAgICAgICAgICAgICAgICJ7IiwNCiAgICAgICAgICAgICAgICAiICAgIGNsYXNzIFByb2dyYW0iLA0KICAgICAgICAgICAgICAgICIgICAgeyIsDQogICAgICAgICAgICAgICAgIiAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKSIsDQogICAgICAgICAgICAgICAgIiAgICAgICAgeyIsDQogICAgICAgICAgICAgICAgIiAgICAgICAgICAgIHN0cmluZ1tdIGNvZGVMaW5lcyA9IG5ldyBzdHJpbmdbXSB7IiwNCiAgICAgICAgICAgICAgICAiIiwNCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgfTsiLA0KICAgICAgICAgICAgICAgICIgICAgICAgICAgICBmb3JlYWNoIChzdHJpbmcgY29kZUxpbmUgaW4gY29kZUxpbmVzKSIsDQogICAgICAgICAgICAgICAgIiAgICAgICAgICAgIHsiLA0KICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgaWYgKGNvZGVMaW5lID09IHN0cmluZy5FbXB0eSkiLA0KICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgeyIsDQogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGNvbnN0TGluZSBpbiBjb2RlTGluZXMpIiwNCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICB7IiwNCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gMTY7IGkrKykiLA0KICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgoY2hhcikweDIwKTsiLA0KICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKChjaGFyKTB4MjIpOyIsDQogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoY29uc3RMaW5lKTsiLA0KICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKChjaGFyKTB4MjIpOyIsDQogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKChjaGFyKTB4MkMpOyIsDQogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgfSIsDQogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICB9IiwNCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGNvZGVMaW5lKTsiLA0KICAgICAgICAgICAgICAgICIgICAgICAgICAgICB9IiwNCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgQ29uc29sZS5SZWFkS2V5KCk7IiwNCiAgICAgICAgICAgICAgICAiICAgICAgICB9IiwNCiAgICAgICAgICAgICAgICAiICAgIH0iLA0KICAgICAgICAgICAgICAgICJ9IiwNCg0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBjb2RlTGluZSBpbiBjb2RlTGluZXMpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKGNvZGVMaW5lID09IHN0cmluZy5FbXB0eSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBjb25zdExpbmUgaW4gY29kZUxpbmVzKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSAxNjsgaSsrKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoKGNoYXIpMHgyMCk7DQogICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKChjaGFyKTB4MjIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShjb25zdExpbmUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgoY2hhcikweDIyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKChjaGFyKTB4MkMpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGNvZGVMaW5lKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIENvbnNvbGUuUmVhZEtleSgpOw0KICAgICAgICB9DQogICAgfQ0KfQ0K
但是做到和源代码一模一样是不可能的,只能做到功能上完全一样,甚至成员名称也一样,所以为防止逆向工程侵害版权,才有混淆器的出现,混淆器将所有成员以无意义的名称重命名,以给逆转者造成阅读障碍。
{
static void Main()
{
string s = "using System;{0}{0}class PrintSource{0}{2}{0} static void Main(){0} {2}{0} string s = {1}{4}{1};{0} Console.WriteLine(s, (char)10, (char)34, (char)123, (char)125, s);{0} {3}{0}{3}";
Console.WriteLine(s, (char)10, (char)34, (char)123, (char)125, s);
}
}
char *a="#include <stdio.h>%c%cchar *a=%c%s%c;%c%cint main(){printf(a,13,10,34,a,34,13,10); return 0;}";
int main(){printf(a,13,10,34,a,34,13,10); return 0;}我写的代码是这样的,长了一点:using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string[] codeLines = new string[] {
"using System;",
"using System.Collections.Generic;",
"using System.Text;",
"namespace ConsoleApplication1",
"{",
" class Program",
" {",
" static void Main(string[] args)",
" {",
" string[] codeLines = new string[] {",
"",
" };",
" foreach (string codeLine in codeLines)",
" {",
" if (codeLine == string.Empty)",
" {",
" foreach (string constLine in codeLines)",
" {",
" for (int i = 1; i <= 16; i++)",
" Console.Write((char)0x20);",
" Console.Write((char)0x22);",
" Console.Write(constLine);",
" Console.Write((char)0x22);",
" Console.WriteLine((char)0x2C);",
" }",
" }",
" Console.WriteLine(codeLine);",
" }",
" Console.ReadKey();",
" }",
" }",
"}", };
foreach (string codeLine in codeLines)
{
if (codeLine == string.Empty)
{
foreach (string constLine in codeLines)
{
for (int i = 1; i <= 16; i++)
Console.Write((char)0x20);
Console.Write((char)0x22);
Console.Write(constLine);
Console.Write((char)0x22);
Console.WriteLine((char)0x2C);
}
}
Console.WriteLine(codeLine);
}
Console.ReadKey();
}
}
}
应该是这样了的
不是叫你反汇编,反MIL,读取源文件==,
纯粹就是一道技巧题
一但你Console.WriteLine("你的代码")
那么在"你的代码"里又要包含"Console.WriteLine("你的代码")",而这里的"你的代码"就会造成两面对着的镜一样,会无限反射, 即自己照不出自己
需要利用一定的字符操作的技巧才能完成这道题.
例如 fish_autumn(Autumn) 的代码.
成功的原因有两点
1.在输出的语句使用了 {0} {1} {2]...
2.在输出双引号时使用了 ASCII 码第一点使得他能自己输出自己
只要Console.WriteLine(s, ... s);
第二点免去了转义字符带来的麻烦你是可以想象在s="s = {0}...Console.WriteLine(s, \"\"\" s);";
Console.WriteLine(s, "\"" s);在s里的 \"\"\" 与代码的"\"" 产生不一致性
s="s = {0}...Console.WriteLine(s, \"\\\"\" s);";
Console.WriteLine(s, "\"" s);在s里的 \"\\\"\" 与代码的"\"" 产生不一致性
1.在输出的语句使用了 {0} {1} {2]...
2.在输出符号时使用了 ASCII 码
" string[] codeLines = new string[] {",
"",
" };",
这个地方有输出时是要将""替换掉的,但替换成什么样的字符串呢?替换了会不会和原代码一样呢?这里也存在迭代的问题吧??
fish_autumn(Autumn) 的代码, 他实现了
string s = "using System;{0}{0}class PrintSource{0}{2}{0} static void Main(){0} {2}{0} string s = {1}{4}{1};{0} Console.WriteLine(s, (char)10, (char)34, (char)123, (char)125, s);{0} {3}{0}{3}";
Console.WriteLine(s, (char)10, (char)34, (char)123, (char)125, s);只明白了一半,也许是语法不过关,谁来耐心解释一下,每个句读。
不甚感激啊。
这题目很有意思。
using System;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string[] codeLines = new string[] {
"using System;",
"using System.Text;",
"namespace ConsoleApplication1",
"{",
" class Program",
" {",
" static void Main(string[] args)",
" {",
" string[] codeLines = new string[] {",
"",
" };",
" foreach (string codeLine in codeLines)",
" {",
" if (codeLine ==string.Empty)",
" {",
" foreach (string constLine in codeLines)",
" {",
@" if(constLine.IndexOf('+') >=0)",
@" Console.WriteLine( new string(' ',10) + '\x40'.ToString() + '\x22'+ constLine + '\x22'+ '\x2C');",
" else",
@" Console.WriteLine( new string(' ',10) + '\x22'+ constLine + '\x22' +'\x2C');",
" }",
" }",
" Console.WriteLine(codeLine);",
" }",
" }",
" }",
"}", };
foreach (string codeLine in codeLines)
{
if (codeLine == string.Empty )
{
foreach (string constLine in codeLines)
{
if(constLine.IndexOf('+') >=0)
Console.WriteLine( new string(' ',10) + '\x40'.ToString() + '\x22'+ constLine + '\x22'+ '\x2C');
else
Console.WriteLine( new string(' ',10) + '\x22'+ constLine + '\x22' +'\x2C');
}
}
Console.WriteLine(codeLine);
}
}
}}
(char)10: 即 \n ,替换s中的{0}
(char)34: 即 " ,替换s中的{1}
(char)123:即 { ,替换s中的{2}
(char)125:即 } ,替换s中的{3}
s 本身替换s中的{4}
用反射得到当前运行的assembliy
用Sharpdevelop的addin插件思路找到当前运行的CS文件
参考楼上某兄的方法将cs文件路径替换static void Main(string[] args)
{
string path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
path = path.Replace("\\bin\\Debug", "") + "Program.cs";
if (System.IO.File.Exists(path) == true)
{
System.IO.StreamReader stream = new System.IO.StreamReader(path);
string mystring;
mystring = stream.ReadToEnd();
Console.Write(mystring);
}
System.Console.ReadKey();
}
http://www.cnblogs.com/Ninputer/archive/2006/04/04/366554.html
这里收集得比较全,各种语言都有