【文章标题】: 使用vc6调试flexlm后台程序Daemon
【文章作者】: 江湖无赖

【详细信息】:
  目标程序不方便写出来这里使用vendor.exe替代。
  开始时使用laoqian文中介绍的方法获得job和data后计算出来seed,但是生成的license总是不正确。使用W32dsm8.93+.exe的anit-wdasm.exe静态反汇编与lmgrd相关的dll总是出现异常崩溃,使用IDA能够正常地静态反汇编。看来可能有反静态汇编的代码在里面。我懒得去跟踪这个问题。于是在继续在看雪论坛搜索好多天把所有与flexlm相关的帖子逐个看了一遍才找到xzwlyx整理的marstj方法可以使用调试daemon的办法直接获得seed,用W32dsm8.93+.exe反汇编vendor.exe能够获得所有信息。狂喜~~~
  使用UE修改vendor.exe的OEP处的代码为cc,修改ollyDBG为实时调试模式,使用lmtools运行vendor.exe服务。ollyDBG正常调出。但是单步执行到getmodulefilename函数处就没有响应了,好像是进入死循环。google查了getmodulefilename函数是windows的核心函数,这个函数很普通不应该是反跟跟踪程序。我不进行跟踪的时候lmtools能够正常启动license服务。现在我也不能够确定程序是否有自校验还是有anit-debug。
  无奈之下我决定换台机器使用softice试试(网络就是好,想当年在学校用36k的猫,用201电话卡拨号上网找资料哪里敢下在200+M的程序,时间就是金钱啦!!)。然后意外的是我的vc6先执行起来了,我恢复OEP后按F5键,程序既然正常运行了,看来vendor.exe里面没有对vc6进行anti-debug,这个很显然,因为flexlm SDK使用vc6编译,如果对vc6使用了anti-debug他的程序根本无法调试问题。最后按照marstj中的方法获得seed,添加到flexlm SDK编译运行,生成license,运行程序,bingo! 程序起来了。看来使用vc6可以避免anti-debug的困扰,这里说说使用方法,供大家在debug中多一些手段。

  1)寻找算法代码 
  /*------------------------------xzwlyx---------------------------------*/      
                83BD90FEFFFF08 是 FlexLM v10.x 以后的    
                83BD74FEFFFF08 是 FlexLM v9.x 以前的 
                个别版本需要自己验证,是这种代码 83BDxxFEFFFF08
                在它的前面一定有一个 add ecx, 00000001
   /*------------------------------xzwlyx---------------------------------*/
   vendor.exe的算法代码在0041BE7F处。
  2)使用UE在vondor.exe的OEP处修改代码为cc
  3)配置好lmtools,运行licnese服务。vc会弹出一个程序异常的对话框,点击取消,进入vc调试模式。这个时候程序中断在OEP地址处。在vc的菜单上面单击右键在确认右键菜单中memory被选中。
  4)恢复OEP代码,在memory窗口中的address里面输入EIP回车,这是memory里面就是当前OEP的汇编代码,将OEP除的cc改回原来的代码。
  5)ctrl+G 在对话框里面输入0041BE7F,往下走在0041C055和0041C1B0处分别设置断点

==================================================================================================
0041BE73 C7 85 74 FE FF FF 00 mov         dword ptr [ebp-18Ch],0
0041BE7D EB 0F                jmp         0041BE8E                  
0041BE7F 8B 95 74 FE FF FF    mov         edx,dword ptr [ebp-18Ch]  
0041BE85 83 C2 01             add         edx,1                        ;注意这里的add edx,1
0041BE88 89 95 74 FE FF FF    mov         dword ptr [ebp-18Ch],edx    ;
0041BE8E 83 BD 74 FE FF FF 08 cmp         dword ptr [ebp-18Ch],8      ;算法特征码83BD74FEFFFF08
0041BE95 7D 2B                jge         0041BEC2
0041BE97 8B 45 F4             mov         eax,dword ptr [ebp-0Ch]
        .
        .
        .
0041C04A 88 10                mov         byte ptr [eax],dl
0041C04C 8B 4D F0             mov         ecx,dword ptr [ebp-10h]
0041C04F 83 C1 01             add         ecx,1
0041C052 89 4D F0             mov         dword ptr [ebp-10h],ecx          ;3D4DA1D6h是清除seed的值
0041C055 C7 85 44 FE FF FF D6 mov         dword ptr [ebp-1BCh],3D4DA1D6h  ;seed1 = [ebp-1BCh]
0041C05F 8B 55 F8             mov         edx,dword ptr [ebp-8]            ;[ebp-1BCh]是seed1
0041C062 C1 E2 04             shl         edx,4
        .
        .
        .

0041C1AA 83 C1 01             add         ecx,1
0041C1AD 89 4D F0             mov         dword ptr [ebp-10h],ecx          ;3D4DA1D6h是清除seed的值   
0041C1B0 C7 85 40 FE FF FF D6 mov         dword ptr [ebp-1C0h],3D4DA1D6h  ;seed2 = [ebp-1C0h]        
0041C1BA E9 FB 00 00 00       jmp         0041C2BA                        ;[ebp-1C0h]是seed2                          
0041C1BF C7 85 70 FE FF FF 00 mov         dword ptr [ebp-190h],0
0041C1C9 EB 0F                jmp         0041C1DA
0041C1CB 8B 95 70 FE FF FF    mov         edx,dword ptr [ebp-190h]
0041C1D1 83 C2 01             add         edx,1
0041C1D4 89 95 70 FE FF FF    mov         dword ptr [ebp-190h],edx
0041C1DA 83 BD 70 FE FF FF 08 cmp         dword ptr [ebp-190h],8
0041C1E1 0F 8D D3 00 00 00    jge         0041C2BA
0041C1E7 8B 85 70 FE FF FF    mov         eax,dword ptr [ebp-190h]
0041C1ED 25 03 00 00 80       and         eax,80000003h
0041C1F2 79 05                jns         0041C1F9
==============================================================================================
  6)第一次断下来后在memory窗口的address中输入ebp-1c0,然后在该窗口上面点击鼠标右键->Long Hex Format。这时就是seed1的值
  7)第二次断下来后得到的就是seed2的值
  8)编译flexlm SDK构造license
  
  总结:
    对于vc的一些功能不如专业的反汇编工具作的好,不过vc的操作界面还是比较合理的,另外就是大多数anti-debug都不敢对vc进行anti-debug。可以省去很多不必要的麻烦
    
  参考资料:
    《用VC和自制工具VCDEBUG助手进行跟踪破解》(看雪精华4) 作者:fnlq[BCG&&CNCG] 
    《On Software Reverse Engineering 》    作者:CrackZ(原文)/sln(翻译)
    《制作Flexlm license总结》  (看雪精华7)  作者:laoqian
    《FLEXLM 系统高级研究(翻译)》(看雪精华8) 作者:CrackZ(原文)/shaoge(翻译)
  感谢:
    感谢所有与该过程相关的人,另外提到两个人marstj、xzwlyx。没有找到他们的精华贴,但是他们在论坛的讨论给我是能够找到seed的关键所在