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