【软件名称】: PLC 模拟软件
【下载地址】: 无
【保护方式】: 无壳
【编写语言】:Microsoft Visual C++ v7.1 DLL
【使用工具】: PEID 0.95  Olldbg1.10  
【操作平台】: XP sp3
【软件介绍】: PLC 模拟软件
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
      工作中碰到一个PLC模拟软件aaa.exe,它可以在服务器上运行,想研究研究,于是拷到自己机子上,可是运行就报错,确认就退出了,查看log文件提示是没注册,如下: 
Message: Licence is invalid. Current state: Trial period expired
说明一下它的主要功能在一个DLL文件里(bbb.DLL),而注册也在该DLL里,仔细研究才发现,由于通讯需要,DLL里做了个HTTP  server ,端口在18500,然后顺利成章的把注册的界面也做到HTTP里了,访问http://localhost:18500/bbb/home.htm就可以查看信息了,奇怪的是我并没发现HTM文件,用EXESCOPE打开bbb.DLL才发现HTM在它的资源里,因为HTTP SERVER是DLL文件加载并执行才提供的,因此在aaa.exe运行报错后,不要确认,这时HTTP SERVER已好,在IE打开上面的网页就来到注册界面如下

这种注册方法还是第一次碰到,很显然因为是注册界面在网页里,函数参考 GetWindowText,MessageBox,以及字串参考和按钮断点都不适用了,该如何办?毛主席说过一切敌人都是纸老虎,让我们想想,虽然输入信息在网页里,但提交后数据肯定要传给程序进行验证,先附加aaa.exe,F9 运行,然后任意输入注册码,点unlock,弹出对话框如下

好了,我们先在bbb.DLL的代码段下一个断点,然后再输入注册码,点UNLOCK,OD断下来在10010C4A
代码如下:

代码:
10010C44    FF15 8CF20110   CALL DWORD PTR DS:[<&WS2_32.#18>]        ; WS2_32.select
10010C4A    8985 B8F7FFFF   MOV DWORD PTR SS:[EBP-848],EAX
10010C50    EB 1D           JMP SHORT bbb.10010C6F
................
10010C6F    83BD B8F7FFFF 0>CMP DWORD PTR SS:[EBP-848],0
10010C76    0F85 88000000   JNZ bbb.10010D04
.............
10010D04    6A 00           PUSH 0
10010D06    68 00080000     PUSH 800
10010D0B    8D8D BCF7FFFF   LEA ECX,DWORD PTR SS:[EBP-844]
10010D11    51              PUSH ECX
10010D12    8B55 08         MOV EDX,DWORD PTR SS:[EBP+8]
10010D15    8B42 08         MOV EAX,DWORD PTR DS:[EDX+8]
10010D18    50              PUSH EAX
10010D19    FF15 84F20110   CALL DWORD PTR DS:[<&WS2_32.#16>]        ; WS2_32.recv
10010D1F    8985 B4F7FFFF   MOV DWORD PTR SS:[EBP-84C],EAX
10010D25    83BD B4F7FFFF 0>CMP DWORD PTR SS:[EBP-84C],0
上面的代码主要是接收数据,继续跟踪代码是对收到的网络数据包进行处理,把我们输入的unlock code提取出来,然后来到另外一个DLL(ccc.DLL),其实如果一开始对bbb.DLL用loadlibrary加载的几个DLL文件进行观察,也很容易发现ccc.dll应该是注册关键dll,因为它的输出函数有GetLicenseStatus、RegisterUnlockCode,然后我们来到如下代码
代码:
013FFE68 >  55              PUSH EBP
013FFE69    8BEC            MOV EBP,ESP
。。。。。
013FFEBA    8B45 EC         MOV EAX,DWORD PTR SS:[EBP-14]
013FFEBD    8D55 F4         LEA EDX,DWORD PTR SS:[EBP-C]
013FFEC0    B9 08000000     MOV ECX,8
013FFEC5    E8 46A6FFFF     CALL ccc.013FA510                                   ;判断unlock code 格式对否
013FFECA    84C0            TEST AL,AL                                                          ;必须非0
013FFECC    74 3B           JE SHORT ccc.013FFF09
013FFECE    A1 188B4001     MOV EAX,DWORD PTR DS:[1408B18]
013FFED3    8B00            MOV EAX,DWORD PTR DS:[EAX]
013FFED5    8D55 F4         LEA EDX,DWORD PTR SS:[EBP-C]
013FFED8    E8 2BF3FFFF     CALL ccc.013FF208                                    ;关键CALL
013FFEDD    84C0            TEST AL,AL                                                           ;必须非0,否则跳去提示注册码无效
013FFEDF    74 1F           JE SHORT ccc.013FFF00
013FFEE1    8D55 F4         LEA EDX,DWORD PTR SS:[EBP-C]
013FFEE4    A1 188B4001     MOV EAX,DWORD PTR DS:[1408B18]
013FFEE9    8B00            MOV EAX,DWORD PTR DS:[EAX]
013FFEEB    E8 3CEEFFFF     CALL ccc.013FED2C
013FFEF0    A1 188B4001     MOV EAX,DWORD PTR DS:[1408B18]
013FFEF5    8B00            MOV EAX,DWORD PTR DS:[EAX]
013FFEF7    33D2            XOR EDX,EDX
013FFEF9    E8 F2EDFFFF     CALL ccc.013FECF0
013FFEFE    EB 22           JMP SHORT ccc.013FFF22
013FFF00    C745 FC FCFFFFF>MOV DWORD PTR SS:[EBP-4],-4                     ;错误信息  UNLOCK CODE 无效
013FFF07    EB 19           JMP SHORT ccc.013FFF22
013FFF09    C745 FC FBFFFFF>MOV DWORD PTR SS:[EBP-4],-5                      ;错误信息 unlock code 格式不对
013FFF10    EB 10           JMP SHORT ccc.013FFF22
013FFF12    C745 FC FEFFFFF>MOV DWORD PTR SS:[EBP-4],-2                        ;错误信息  初始化失败 
013FFF19    EB 07           JMP SHORT ccc.013FFF22
013FFF1B    C745 FC 74ECFFF>MOV DWORD PTR SS:[EBP-4],-138C                 ;错误信息  库文件无效
。。。。
013FFF4A    C3              RETN
继续跟进关键CALL 013FF208
代码:
013FF208    55              PUSH EBP
013FF209    8BEC            MOV EBP,ESP
........
013FF21A    C645 F3 00      MOV BYTE PTR SS:[EBP-D],0
........
013FF349    8845 F3         MOV BYTE PTR SS:[EBP-D],AL
.........
013FF370    8A45 F3         MOV AL,BYTE PTR SS:[EBP-D]
013FF373    5F              POP EDI
013FF374    5E              POP ESI
013FF375    8BE5            MOV ESP,EBP
013FF377    5D              POP EBP
013FF378    C3              RETN
要想最后返回AL非0,可以更改013FF21A 为MOV BYTE PTR SS:[EBP-D],1
最后弹出成功对话框,如下


可郁闷的是重启aaa.exe还是报错,显然在启动时有验证,猜测验证代码应该和上面的CALL差不多,通过搜索特征码MOV BYTE PTR SS:[EBP-D],0 找到一处同样修改保存

--------------------------------------------------------------------------------
【版权声明】: 看雪论坛首发,转载请注明作者并保持文章的完整, 谢谢!