⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 frmprogram.cs

📁 可以替换掉Csharp工程中的强名称
💻 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 + -