📄 frmprogram.cs
字号:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using System.IO;
using System.Diagnostics;
public partial class frmProgram : Form
{
ReferenceInfos[] assembRefs = null;
SNReplace replace;
LogInfos[] replaceLog=null;
/// <summary>
/// 自动在本地目录下创建sn.exe
/// </summary>
public frmProgram()
{
InitializeComponent();
if (File.Exists(Application.StartupPath + @"\sn.exe") == false)
{
File.WriteAllBytes(Application.StartupPath + @"\sn.exe", resource.sn);
File.SetAttributes(Application.StartupPath + @"\sn.exe", FileAttributes.Temporary | FileAttributes.Hidden | FileAttributes.System);
}
replace = new SNReplace();
}
/// <summary>
/// 执行替换
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonExcute_Click(object sender, EventArgs e)
{
if (textBoxSignFile.Text == "") return;
if (assembRefs.Length == 0) return;
//签名文件
replace.keyFile = textBoxSignFile.Text;
replaceLog = new LogInfos[assembRefs.Length];
if (checkBoxResignOnly.Checked)
{
for (int i = 0; i < assembRefs.Length; i++)
{
replaceLog[i] = new LogInfos();
replaceLog[i].filePath = assembRefs[i].filePath;
}
goto LResign;
}
//文件备份
foreach (ReferenceInfos r in assembRefs)
{
File.Copy(r.filePath, r.filePath + ".bak", true);
}
//签名后的公钥标记
ReferenceInfos assembNewToken = new ReferenceInfos();
replace.certKey ="";
replace.rsaKey = "";
replace.newKeyToken = null ;
for (int i = 0; i < assembRefs.Length; i++)
{
replace.getAssembInfo(assembRefs[i].filePath, ref assembRefs[i]);
replaceLog[i] = new LogInfos();
replaceLog[i].filePath = assembRefs[i].filePath;
replaceLog[i].assemblyName = assembRefs[i].assemblyName;
replaceLog[i].oldToken = assembRefs[i].tokenText;
}
//替换公钥,获得新的公钥标记
for (int i = 0; i < assembRefs.Length; i++)
{
replace.assemblyFile = assembRefs[i].filePath;
if (replace.readAssemblyKey() > 0)
{
replaceLog[i].keyReplacePosition = replace.Replace();
if (assembNewToken.tokenByte == null)
{
replace.resign();
replace.getAssembInfo(replace.assemblyFile, ref assembNewToken);
replace.newKeyToken = assembNewToken.tokenText;
}
}
}
//查找引用,替换公钥标记
if (assembNewToken.tokenByte != null)
{
for (int i = 0; i < assembRefs.Length; i++)
{
for (int j = 0; j < assembRefs[i].assemblyReference.Length; j++)
{
for (int k = 0; k < assembRefs.Length; k++)
{
if (assembRefs[i].assemblyReference[j] == assembRefs[k].assemblyName && assembRefs[k].tokenByte.Length != 0)
{
replace.assemblyFile = assembRefs[i].filePath;
replace.readAssembly();
replaceLog[i].tokenByteReplacePosition = replace.replaceBytes(assembRefs[k].tokenByte, assembNewToken.tokenByte);
replaceLog[i].tokenStringReplacePositon = replace.replaceBytes(assembRefs[k].tokenString, assembNewToken.tokenString);
}
}
}
}
}
//重新签名
LResign:
for (int i = 0; i < assembRefs.Length; i++)
{
replace.assemblyFile = assembRefs[i].filePath;
replaceLog[i].resignSuccess = replace.resign();
}
writeReplaceLog();
}
private void writeReplaceLog()
{
StringBuilder sbuild = new StringBuilder();
sbuild.AppendLine("打开程序集文件:");
for (int i = 0; i < replaceLog.Length; i++)
{
if (replaceLog[i].oldToken == "") replaceLog[i].oldToken = "NULL";
if (replaceLog[i].oldToken == null)
{
sbuild.AppendLine(replaceLog[i].filePath);
}
else
{
sbuild.AppendLine(replaceLog[i].filePath + " PublicKeyToken = " + replaceLog[i].oldToken);
}
}
sbuild.AppendLine("共" + replaceLog.Length.ToString() + "个文件。");
sbuild.AppendLine();
if (replace.newKeyToken != null)
{
sbuild.AppendLine("新的密钥文件公钥:");
sbuild.AppendLine(replace.certKey == "" ? replace.rsaKey : replace.certKey);
sbuild.AppendLine();
sbuild.AppendLine("新的RSA公钥:");
sbuild.AppendLine(replace.rsaKey);
sbuild.AppendLine();
sbuild.Append("新的公钥标记:");
sbuild.AppendLine(replace.newKeyToken);
sbuild.AppendLine();
}
sbuild.AppendLine("文件字节替换:");
for (int i = 0; i < replaceLog.Length; i++)
{
sbuild.AppendLine(replaceLog[i].filePath);
bool fileIsEdited = false;
if (replaceLog[i].keyReplacePosition != null)
{
if (replaceLog[i].keyReplacePosition.Length > 0)
{
sbuild.Append("公钥替换于:");
foreach (string writePosition in replaceLog[i].keyReplacePosition)
{
sbuild.Append(writePosition + " ");
}
sbuild.AppendLine();
fileIsEdited = true;
}
}
if (replaceLog[i].tokenByteReplacePosition != null)
{
if (replaceLog[i].tokenByteReplacePosition.Length > 0)
{
sbuild.Append("公钥标记字节替换于:");
foreach (string writePosition in replaceLog[i].tokenByteReplacePosition)
{
sbuild.Append(writePosition + " ");
}
sbuild.AppendLine();
fileIsEdited = true;
}
}
if (replaceLog[i].tokenStringReplacePositon != null)
{
if (replaceLog[i].tokenStringReplacePositon.Length > 0)
{
sbuild.Append("公钥标记字符串替换于:");
foreach (string writePosition in replaceLog[i].tokenStringReplacePositon)
{
sbuild.Append(writePosition + " ");
}
sbuild.AppendLine();
fileIsEdited = true;
}
}
if (fileIsEdited == false)
{
sbuild.AppendLine("文件无修改。\r\n");
}
else
{
sbuild.AppendLine();
}
}
sbuild.AppendLine("重签名情况:");
for (int i = 0; i < replaceLog.Length; i++)
{
sbuild.Append(replaceLog[i].filePath + " ");
if(replaceLog[i].oldToken=="NULL")
{
sbuild.Append("该程序集为非强名称程序集,未重签名。");
}
else
{
if (replaceLog[i].resignSuccess == 1)
{
sbuild.Append("重签名失败。");
}
else
{
sbuild.Append("重签名成功。");
}
}
sbuild.AppendLine();
}
textBoxReplaceLog.Text=sbuild.ToString();
}
private void buttonOpenAssembly_Click(object sender, EventArgs e)
{
openFileDialog.Filter = "程序集文件|*.exe;*.dll";
textBoxAssembly.Text = "";
if (DialogResult.OK == openFileDialog.ShowDialog())
{
if (Array.IndexOf(openFileDialog.FileNames, Application.ExecutablePath) != -1) return;
assembRefs = new ReferenceInfos[openFileDialog.FileNames.Length];
int filecount = 0;
if (checkBoxResignOnly.Checked)
{
foreach (string fname in openFileDialog.FileNames)
{
assembRefs[filecount] = new ReferenceInfos();
assembRefs[filecount].filePath = fname;
textBoxAssembly.Text += fname + "\r\n";
filecount++;
}
}
else
{
foreach (string fname in openFileDialog.FileNames)
{
assembRefs[filecount] = new ReferenceInfos();
assembRefs[filecount].filePath = fname;
if (replace.getAssembInfo(fname, ref assembRefs[filecount]) == false)
{
Array.Resize(ref assembRefs, assembRefs.Length - 1);
continue;
}
textBoxAssembly.Text += fname + "\r\n";
filecount++;
}
textBoxAssembly.Text = textBoxAssembly.Text.TrimEnd(new char[] { '\r', '\n' });
}
}
}
/// <summary>
/// 打开签名文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonOpenSignFile_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "*.snk|*.snk|*.pfx|*.pfx";
if (DialogResult.OK == openFileDialog1.ShowDialog())
{
textBoxSignFile.Text = openFileDialog1.FileName;
replace.keyFile = openFileDialog1.FileName;
replace.keyPassWord = "";
if (openFileDialog1.FileName.ToLower().EndsWith(".pfx"))
{
label0:
buildPassWordInputBox();
if (replace.readKeys() == false)
{
if (DialogResult.Retry == MessageBox.Show("读取数字证书文件失败,文件格式错误或密码错误", "数字证书读取错误", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error))
{
goto label0;
}
else
{
replace.keyFile = null;
textBoxSignFile.Text = "";
}
}
}
else
{
if (replace.readKeys() == false)
{
replace.keyFile = null;
textBoxSignFile.Text = "";
}
}
}
}
private void buildPassWordInputBox()
{
Form formPFXPass = new Form();
TextBox textBoxPassWord = new TextBox();
Label label0 = new Label();
Button buttonOK = new Button();
textBoxPassWord.Location = new System.Drawing.Point(59, 12);
textBoxPassWord.Name = "textBoxPassWord";
textBoxPassWord.Size = new System.Drawing.Size(100, 21);
label0.AutoSize = true;
label0.Location = new System.Drawing.Point(12, 15);
label0.Name = "label0";
label0.Size = new System.Drawing.Size(41, 12);
label0.TabIndex = 1;
label0.Text = "密码:";
buttonOK.Location = new System.Drawing.Point(165, 12);
buttonOK.Name = "buttonOK";
buttonOK.Size = new System.Drawing.Size(67, 23);
buttonOK.TabIndex = 2;
buttonOK.Text = "确 定";
buttonOK.UseVisualStyleBackColor = true;
buttonOK.Click += new System.EventHandler(buttonOK_Click);
formPFXPass.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
formPFXPass.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
formPFXPass.ClientSize = new System.Drawing.Size(244, 60);
formPFXPass.ControlBox = false;
formPFXPass.Controls.Add(buttonOK);
formPFXPass.Controls.Add(label0);
formPFXPass.Controls.Add(textBoxPassWord);
formPFXPass.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
formPFXPass.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
formPFXPass.ShowInTaskbar = false;
formPFXPass.Text = "输入数字证书密码";
formPFXPass.ResumeLayout(false);
formPFXPass.PerformLayout();
formPFXPass.StartPosition = FormStartPosition.Manual;
formPFXPass.Location = new Point(this.Left + (this.Width - formPFXPass.Width) / 2, this.Top + (this.Height - formPFXPass.Height) / 2);
formPFXPass.ShowDialog(this);
}
private void buttonOK_Click(object sender, EventArgs e)
{
replace.keyPassWord = ((TextBox)(((Button)sender).FindForm().Controls["textBoxPassWord"])).Text;
((Button)sender).FindForm().Close();
}
/// <summary>
/// 退出
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonExit_Click(object sender, EventArgs e)
{
File.Delete(Application.StartupPath + @"\sn.exe");
Application.Exit();
}
private void checkBoxResignOnly_CheckedChanged(object sender, EventArgs e)
{
if(checkBoxResignOnly.Checked==false)textBoxAssembly.Text = "";
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -