欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#反编译dll文件,修改其中汉字内容,再重新生成dll

程序员文章站 2022-05-27 10:08:21
一位电气朋友让我帮其反编译一个dll文件,只要修改dll中部分中文字符串的内容(比如:‘电机编号’、‘接线方式’等等)。 这样的事情自己从来还没接触过,能否实现、难度怎样也没一个概念,但为了帮他一下,也为了挑战下看自己到底需要多久才能解决此全新问题,欣然接受了。 从9:16到10:21,只花了1个小 ......

  一位电气朋友让我帮其反编译一个dll文件,只要修改dll中部分中文字符串的内容(比如:‘电机编号’、‘接线方式’等等)。

  这样的事情自己从来还没接触过,能否实现、难度怎样也没一个概念,但为了帮他一下,也为了挑战下看自己到底需要多久才能解决此全新问题,欣然接受了。

  从9:16到10:21,只花了1个小时左右的时间,就将此问题的核心解决了^_^。当然,如果计算机基础知识更扎实,应该很多资料都不需要去查阅。

  不过,想想最近在深度学习ocr各类钢印手刻字体识别上遇到的各种折磨,心里的挫败感终于缓解了点。

第1步:打开il dasm软件

  ildasm.exe是微软的il反编译工具,可以用它反编译exe程序,从而进行研读和修改。

  il是微软平台上的一门中间语言,我们常写的c#代码在编译器中都会自动转换成il,然后在由即时编译器(jit compiler)转化机器码,最后被cpu执行。ildasm.exe反编译工具将il汇编成可跨平台可执行的(pe)文件。可供我们了解别人代码和修改。有了他我们看待问题可以不用停留在编辑器层面,可深入中间层。

  ildasm.exe不要下载,在本机c盘就能找到,在我电脑中的位置是:

c:\program files (x86)\microsoft sdks\windows\v7.0a\bin

C#反编译dll文件,修改其中汉字内容,再重新生成dll

打开它,并点击‘文件’-‘打开’,加载你要反编译的dll文件,结果如下:

C#反编译dll文件,修改其中汉字内容,再重新生成dll

内容中具体每个符号是什么意思,参考如下:

C#反编译dll文件,修改其中汉字内容,再重新生成dll

主要参考文献:

★https://www.cnblogs.com/caokai520/p/4921706.html

第2步:转储dll文件

  为了更好的编辑dll中内容, 需要将dll转储一下。

  ildasm.exe中点击‘文件’-‘转储’,‘转储选项’默认即可,如下:

C#反编译dll文件,修改其中汉字内容,再重新生成dll

  随便起个名字(如test),然后保存在某个临时文件内,转储结果如下:

C#反编译dll文件,修改其中汉字内容,再重新生成dll

  然后打开那个test.il文件,内容大概如下:

C#反编译dll文件,修改其中汉字内容,再重新生成dll

  这里面的内容,应该就是dll全部的代码信息了。

第3步:定位到具体要修改的代码位置

   由于il语法未曾接触过,并且近2万行代码中,也没见到一个中文字符串,当时也不确定这个文件是否是自己需要修改的。通过概览网上一些人的案例,特别是如下几个,渐渐就有了眉目。

C#反编译dll文件,修改其中汉字内容,再重新生成dll

C#反编译dll文件,修改其中汉字内容,再重新生成dll

C#反编译dll文件,修改其中汉字内容,再重新生成dll

如上三幅图提示,再了解ldstr关键词含义后,可以认为后面的16进制代表的应该就是汉字编码。

第4步:寻找汉字编码表,并对照

  网上这方面资料似乎很少,很感谢‘’写了上述那个‘乱舞春秋’的demo,通过对照汉字编码表(https://wenku.baidu.com/view/e660cf35ba0d4a7303763a54.html?sxts=1564020740708),发现‘乱’字的4位16进制编码就是‘’博主里那个‘71 4e’。

C#反编译dll文件,修改其中汉字内容,再重新生成dll

  不过在汉字编码表中,顺序是‘4e71’,逐一检验其它3个字后,终于确认了规则。

  然后,按照此规则,在汉字编码表中,找到‘电机编号’4个字符,其在il语法中16进制表示方式应该是:35 75 3a 67 16 7f f7 53。通过检索整个test.il文件,发现了29处匹配项!

C#反编译dll文件,修改其中汉字内容,再重新生成dll

 

  到此核心的工作已经完成了,下一步就是编写一个python脚本,将整个dll中出现的这些‘电机编号’前后整段语句结合汉字编码表excel,全部自动翻译出来,并标示代码行位置,然后就知道要去改哪里了。

 

第5步:修改后,重新生成dll

这一步可参考:https://www.cnblogs.com/jiangchuan/p/10851179.html

C#反编译dll文件,修改其中汉字内容,再重新生成dll