C# 更新引用而不反编译源?

C# 更新引用而不反编译源?,c#,C#,我正在寻找一种方法来更改.NET exe中引用的DLL 为什么??我有一个,要破解它,我不允许使用Reflector修改它(这太容易了,但我可以读取它的源代码)。而且我必须这样做。(这就是我这个疯子的挑战) 问题是,源代码和控制流混淆了,我不允许使用任何自动工具来解决它,所以手动操作将是漫长而痛苦的 crackme使用一个嵌入自身的开源库来工作,因此我可以下载库的源代码,用一些“转储”代码修改它(因为crackme使用它的API,还提供了该API的序列号,我会修改为转储),将它放回crackme

我正在寻找一种方法来更改.NET exe中引用的DLL

为什么??我有一个,要破解它,我不允许使用Reflector修改它(这太容易了,但我可以读取它的源代码)。而且我必须这样做。(这就是我这个疯子的挑战)

问题是,源代码和控制流混淆了,我不允许使用任何自动工具来解决它,所以手动操作将是漫长而痛苦的

crackme使用一个嵌入自身的开源库来工作,因此我可以下载库的源代码,用一些“转储”代码修改它(因为crackme使用它的API,还提供了该API的序列号,我会修改为转储),将它放回crackme,运行它并在我的桌面上获取密钥

它应该(但不是强制性的)使用ILDASM完成


所以,问题是:有没有办法用我自己的“更新”引用的DLL?

您可以使用ildasm将程序集反汇编为IL代码。可以使用以下命令:

ildasm.exe <YourAssembly> /output:YourAssemblyILCode.il

然后,您可以使用ilasm.exe将更正后的IL文件组装到.NET程序集。我从ildasm.exe生成了.IL文件,它显示了
.assembly extern/*23000005*/CrackMeAPI
,但问题是,即使我更改了名称,我也不知道如何包含我自己编译的DLL。如果我把名字改成“CrackMeAPI_Custom”,也许它会问我要那个DLL?此外,它没有
.publickeytoken
,如果要更改程序集名称,则必须更改IL代码中的模块名称。例如,如果原始引用是:.assembly extern API{.publickeytoken=(26 6A FB 1E A0 39 5A B7).ver 1:0:0:0},并且您已将其更改为自己的引用:.assembly extern APICustom{.ver 1:0:0:0},那么您必须像这样更改IL代码中的所有模块名(int[]方括号)。原始代码:[API]API.MyClass::.ctor()新代码:[APICustom]API.MyClass::.ctor(),但使用原始名称可能更容易。问题是.dll嵌入到了EXE中(如果它不存在,只需更改文件并完成即可)。因此,如果我更改
.assembly extern myAPI
,它是否会读取
CrackMeDir\myAPI.dll
,而不是嵌入的资源?为了使用相同的名称-我有这样一个问题:我如何修改它以使程序读取
CrackMeDir\myAPI.dll
,而不是它自己的嵌入资源?您可以将新的dll嵌入EXE。这个答案就是一个示例:您可以简单地将IL代码中的清单条目更正为.mresource public,然后将文件放在与IL文件相同的文件夹中,然后使用ilasm将IL文件组装为EXE。
.assembly extern System
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         
  .ver 2:0:0:0
}