• 标 题:破解红外遥控编码分析仪3.0——上次问过的,现在终于破了。 (6千字)
  • 作 者:Passion
  • 时 间:2001-2-16 10:43:57
  • 链 接:http://bbs.pediy.com

破解红外遥控编码分析仪3.0
Passion

前不久一同学使用红外遥控编码分析仪3.0,说是未注册版本仅仅可输出红外线接口数据3次(3次的确也太少了点),于是找我碰碰运气看能不能破。我瞧这软件说明,说要向作者付“一吨午饭”注册,天啊!要勒紧裤带少吃多少顿才能凑足这一吨?“民以食为天”,破吧!
这个东西加了壳,由于我脱壳经验不足,在这里耽搁了两天。Fileinfo查不出是什么壳,后来下了个GTW,说是ASPack 1.083,于是用PROCDUMP的unpack,脱出来的文件却不能运行,出什么EAccessVoilation。找个专门脱它的工具,照样非法操作。看来只有手工脱了。还好,我们有中国人值得骄傲的TRW2000。
找入口点找得我头晕,(此处省略不成功脱壳过程XXXX次)。后来终于碰上了一个段转换的RET,执行完RET后来到以下处:

A1BCA34800              mov eax, dword ptr [0048A3BC]        ;这条居然是入口!不是PUSH EBP?
C1E002                  shl eax, 02
A3C0A34800              mov dword ptr [0048A3C0], eax
57                      push edi
51                      push ecx

在MOV EAX, dword ptr [0048A3BC]处来个PEDUMP,嘿嘿,脱壳成功。

接着便是破注册的过程了。程序运行时会生成一个本机号,估计是把电脑的各种参数都计算出来凑成一块儿的。算法复杂得很。——先试试再说。运行程序IRVIEWER.EXE,啪地出来个窗口告诉你没注册,还把本机号多少多少多少告诉你。按确定后点菜单中的注册出现注册输入框。随便乱填后按确定,窗体先消失,然后告诉你错误。没的说,跟吧。下断 bpx hmemcpy,断后pmodule,清断点按F10跟踪,在IRVIEWER和COMCTL32.DLL和kernerl、user等之间跳了几次后终于来到以下处:

:00402A7A 8B0D50354900            mov ecx, dword ptr [00493550]
:00402A80 8B01                    mov eax, dword ptr [ecx]
:00402A82 8B80E8020000            mov eax, dword ptr [eax+000002E8]
:00402A88 E80B210400              call 00444B98
:00402A8D 8D45FC                  lea eax, dword ptr [ebp-04]
:00402A90 E8DB360000              call 00406170
:00402A95 50                      push eax
:00402A96 E8212F0000              call 004059BC                ;这里验证注册码是否正确。
:00402A9B 59                      pop ecx
:00402A9C 3B0548BD4900            cmp eax, dword ptr [0049BD48]        ;正确标志
:00402AA2 0F95C2                  setne dl                ;对则DL为0,否则……
:00402AA5 83E201                  and edx, 00000001            ;否则为1
:00402AA8 52                      push edx
:00402AA9 FF4DD4                  dec [ebp-2C]
:00402AAC 8D45FC                  lea eax, dword ptr [ebp-04]
:00402AAF BA02000000              mov edx, 00000002
:00402AB4 E8E3600800              call 00488B9C
:00402AB9 59                      pop ecx
:00402ABA 84C9                    test cl, cl
:00402ABC 7429                    je 00402AE7                ;这里不跳则出错。
:00402ABE 6A00                    push 00000000

但如果改00402ABC处的JE,居然无效。只有改00402AA2处了。把setne dl和AND EDX,00000001改成MOV EDX,0和NOP即可。
也就是把
0F 95 C2 83 E2 01 52
改为:
BA 00 00 00 00 90 ..

改掉脱壳后的EXE文件后再运行,选菜单中的注册,在注册框中乱填一气,按确定。……嗯?什么都没有?
那这样算不算注册成功?关闭程序再运行,仍然提示未注册。看来不行。
不过注意到一点,乱填一气的注册码在程序再度运行后在注册框中仍然存在,看来注册这一步应该是通过了,但程序启动的时候还有一步检验的过程,那儿通不过,就得每次运行程序都得注册一次了。
用FILEmonitor和regmonitor监视程序运行中注册表和文件的变化,终于从千头万绪中看到了C:\WINDOWS\IRVIEW.INI文件。注册框的检验通过后关闭程序时会把“正确”的注册码写入C:\WINDOWS\IRVIEW.INI文件。其内容为:

[Register]
SerialNum=0987654321

这样就需要跟踪程序开始读文件的部分。我于是就用TRW2000来LOAD它,下断Createfilea也好,下getprivateprofilestring也好,下getprivateprofileint也好,下readfile也好,下openfile和其ex也好,居然要么是什么都拦不住(这是什么原因还请各位指点),要么就是在弹出提示未注册框后中断。我几乎觉得山穷水尽了。后来仔细想想又找到了法子。——程序不是会把这个“正确”的注册码读进来吗?我就查它就行了。
在弹出注册框时按Ctrl+M切入TRW2000,s 0 ffffffff '0987654321',真的找到一个地址47B490。
退出程序重新load,下bpm 47b490 w,后来中断几次,看看哪次47b490处会出现0987654321。
哈哈,这里!——这里中断已经离目标不远了。
(据REGMON分析,程序是先读许多注册表参数再读的IRVIEW.INI文件,也就是说很可能本机号的计算在注册码的读出之前处理,可以跳过许多麻烦的算法程序了。)

不多久来到此处:

:0040325B E80C270000              call 0040596C
:00403260 A348BD4900              mov dword ptr [0049BD48], eax
:00403265 B850BD4900              mov eax, 0049BD50
:0040326A E8012F0000              call 00406170
:0040326F 50                      push eax
:00403270 E847270000              call 004059BC                ;这里是验证过程
:00403275 59                      pop ecx
:00403276 3B0548BD4900            cmp eax, dword ptr [0049BD48]        ;这里是关键比对
:0040327C 0F849E000000            je 00403320                ;正确则跳,否则出错。
:00403282 66C7459C5000            mov [ebp-64], 0050
:00403288 8D45D0                  lea eax, dword ptr [ebp-30]
:0040328B E8B02E0000              call 00406140
:00403290 8BD0                    mov edx, eax
:00403292 FF45A8                  inc [ebp-58]
:00403295 A148BD4900              mov eax, dword ptr [0049BD48]
:0040329A E89D2F0000              call 0040623C
:0040329F 8D55D0                  lea edx, dword ptr [ebp-30]
:004032A2 52                      push edx
:004032A3 8D45CC                  lea eax, dword ptr [ebp-34]
:004032A6 E8952E0000              call 00406140
:004032AB 50                      push eax
:004032AC FF45A8                  inc [ebp-58]

* Possible StringData Ref from Data Obj ->"该软件没有注册,请向作者注册.
注册号: "
                                  |
:004032AF BA01A84800              mov edx, 0048A801
    …………  ;下边就省了。
    
很好。把je 00403320改成JMP 00403320就行。
也就是做以下修改:
0F 84 9E 00 00 00 66 C7
E9 9F 00 .. .. 90 .. ..

保存文件后运行,万事大吉!——实际上只改此处就行。

这个软件在华军上的软件分类中的“其他栏目”中有下载,不是列表中的第一个地址!那是错的,虽然也是一个IR.EXE,却是什么InternetRadio。 ^_^
这个东西如果用静态分析查找字串引用的方法来破可能还会简单得多,我没这样做,因为……还不熟,找注册码就更没本事了。嘿嘿!

后记:
本文在打字过程中完成50%左右时正待保存,却出来个保存错误,然后Uedit32被中止,我差点气晕,赶忙启动TRW2000,查找内存中的"IRVIEW.INI",结果万幸,找到了我这可怜的半篇文章。但VMM模式下不可写盘,我于是下个BPX HMEMCPY,暂时退出,随便在那个程序的框中敲一字符,断时就脱离VMM模式了,来个w,好,总算没浪费力气。
——Passion写于情人节后两天。