这个项目是为了解决某个考试的电脑仿真实验部分练习不便的问题而建立的。
注意,源码用Visual Studio
编译后运行不可以直接正常使用。
请下载V4.9的可执行文件压缩包后解压,并将其中的整个data文件夹(包含实验程序本体)移动至编译的exe文件的同目录下。
链接:ZkExperimentSingle · Releases
或
链接:腾讯微云
链接:百度网盘
提取码:s4mq
实验软件采用Unity + C#,且并未发现复杂混淆,
用dnSpy反编译三个科目的Assembly-CSharp.dll
及监考端、考生端后,经观察大致原理如下:
监考端向考务平台发起含三个参数的登录请求(账号、密码以及通过GetMac()
方法获取的Mac地址)并读取响应,若status==200
则登录成功,显示主窗体。
此时可以下载考务试卷到监考端本地。考生端发起登录后,会下载考务试卷,选择对应实验开始考试的时候是通过
ExperimentUC.StartExperiment(text,string.Concat(new string[]{a,”|”,text2,”|”,text3}))
语句调用了
ProcessManager.OpenProcess(string path,string para,bool shellExecute,boll showWin)
传参启动Unity制作的实验程序(Biological.exe、Physical.exe或Chemistry.exe
)。
所以在重制的过程中,需要做的只是模拟考生端传参启动。先通过修改考生端的OpenProcess
方法,加入输出启动参数的语句后重新编译,每个实验都捕获一次启动参数,这样就能通过最简单的方法得到评分标准和考试内容。
在这种情况下启动的实验程序在提交后没有办法自动退出,所以继续修改不同实验程序实验结束时的方法即可。
生物科目
修改EndPanel.Start()
方法使其可以传回成绩后退出:
private void Start()
{
if (Manager.Instance().sureClick != null)
{
Manager.Instance().sureClick();
}
float num = Mathf.Clamp(AnswerManager.Instance().answerData.allScore, 0f, 100f);
base.transform.Find("AllScoreText").GetComponent<Text>().text = "总分:" + num;
this.banBenHao = base.transform.Find("Text").GetComponent<Text>();
this.banBenHao.text = AllControll.Instance().BanBenHao(null);
if (!Ini.Instance().getDic()["open"].boolType)
{
KaoWuManager.Instance.SendAnswer();
}
base.transform.GetComponent<EndPanel>().TiJiao();
TcpClient tcpClient = new TcpClient("127.0.0.1", 11451);
StreamWriter streamWriter = new StreamWriter(tcpClient.GetStream(), Encoding.UTF8);
string value = AnswerManager.Instance().answerData.allScore.ToString();
streamWriter.WriteLine(value);
streamWriter.Flush();
tcpClient.Close();
Application.Quit();
}
化学科目
修改Chemical.EndPanel.Start()
方法使其可以传回成绩后退出:
private void Start()
{
this.banBenText = base.transform.Find("banBenText").GetComponent<Text>();
this.banBenText.text = AllControl.Instance().BanBenHao(this.banBenText).ToString();
Mathf.Clamp(KaoWuManager.Instance.answerData.allScore, 0f, 100f);
base.transform.Find("AllScorText").GetComponent<Text>().text = "总分:" + KaoWuManager.Instance.answerData.allScore;
base.StartCoroutine(this.SureButtonClick());
TcpClient tcpClient = new TcpClient("127.0.0.1", 11451);
StreamWriter streamWriter = new StreamWriter(tcpClient.GetStream(), Encoding.UTF8);
string value = KaoWuManager.Instance.answerData.allScore.ToString();
streamWriter.WriteLine(value);
streamWriter.Flush();
tcpClient.Close();
Application.Quit();
}
物理科目
由于开发这个工程的团队非常傻X,成员之间丝毫没有配合协同的说法,不仅同样的资源不共用,甚至也不总调用UIFW.EndPanel.Display()
,所以需要修改另外一个共用的方法physiacl.KaoWuManager.SendAnswer()
使其可以传回成绩后退出:
public void SendAnswer()
{
this.SaveData();
this.SendMsg(SendCode.SendAnswer, this.answerData);
TcpClient tcpClient = new TcpClient("127.0.0.1", 11451);
StreamWriter streamWriter = new StreamWriter(tcpClient.GetStream(), Encoding.UTF8);
string value = KaoWuManager.Instance.answerData.allScore.ToString();
streamWriter.WriteLine(value);
streamWriter.Flush();
tcpClient.Close();
Application.Quit();
}
所有压缩包(包括考务试卷、学生答案信息)的密码都是FaN^y0EAOOc309%,被用明文写在代码里。
还有项目结构和命名混乱,在生物科目中有Chemical(应该是之前想要尝试把三个科目做在一个程序里,但最后没有删掉废案,所以最早出现的生物科目程序有这样的情况)。
最重要的是,开发团队成员之间丝毫没有配合协同的说法,同样的资源也要各用各的,用中文的用中文,用拼音的用拼音。。。总之就是非常史,很难评价。