朋友请我帮忙修复一个工业用光刻软件,他描述该软件在WIN98下能正常运行,但是在WIN2000及WINXP下无法运行,首先我就想到工业用软件,可能会操作硬件端口,非常可能是权限问题。问他拿到软件后直接运行,出错。

开OD加载6020dll.dll跑到偏移0x578b处
10005780   $  33C0          XOR EAX,EAX
10005782   .  66:8B5424 04  MOV DX,WORD PTR SS:[ESP+4]
10005787   .  8A4424 08     MOV AL,BYTE PTR SS:[ESP+8]
1000578B   .  EE            OUT DX,AL                                ;  I/O 命令
1000578C   .  C3            RETN

看到和我开始想的相同,操作了硬件端口。由于WINNT不能直接操作端口所以产生了此错误,知道问题现在就好办了。确立解决方法:
使用WINIO,在他首次操作端口前加载WINIO即可。我选择的是他首次调用0x10005780前跳转到模块空的代码段处加载WINIO,补上代码如下
1000B200   > \60            PUSHAD
1000B201   .  68 E0B10010   PUSH 6020dll.1000B1E0                    ; /FileName = "WinIo.dll"
1000B206   .  FF15 ACC00010 CALL DWORD PTR DS:[<&KERNEL32.LoadLibrar>; \LoadLibraryA
1000B20C   .  68 EAB10010   PUSH 6020dll.1000B1EA                    ; /ProcNameOrOrdinal = "InitializeWinIo"
1000B211   .  50            PUSH EAX                                 ; |hModule
1000B212   .  FF15 48C00010 CALL DWORD PTR DS:[<&KERNEL32.GetProcAdd>; \GetProcAddress
1000B218   .  FFD0          CALL EAX
1000B21A   .  61            POPAD
1000B21B   .  E8 60A5FFFF   CALL 6020dll.10005780 //补上由于跳转到空代码段处覆盖掉的代码
1000B220   .^ E9 E59DFFFF   JMP 6020dll.1000500A //跳回原处继续执行

发还给我朋友已能正常运行了,至此该光刻软件在winnt下的修复已经完成,个人认为,修复此类东西需要平时经验的积累,恰当的使用工具,即可达到你所想要的目的。

--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!