csjoz11

导航

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

 一位电气朋友让我帮其反编译一个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 SDKsWindowsv7.0ABin

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

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

主要参考文献:

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

第2步:转储dll文件

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

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

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

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

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

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

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

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

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

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

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

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

 

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

 

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

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

 

内容来源于网络如有侵权请私信删除

posted on 2023-11-16 18:38  csjoz11  阅读(691)  评论(0编辑  收藏  举报