摸底
- 软件被前人评价为“软柿子”(发布的帖子)。
- 启动后工具栏有“软件注册按钮”,点击后弹出窗口,标题标明“未注册”(图 1)。
- “导出列表”功能不可用,被提示弹窗代替(图 2)。
思路
- 从注册窗口下手,看能不能找到注册码 / 已注册标志或判断是否注册这些东西。
- 从尝试使用“导出列表”时的提示弹窗下手,找出哪儿禁用了这功能。
动手(思路1)
- OD 跑起来(原版程序),使用“中文搜索引擎”搜索字符串“未注册”,定位到调用代码(图 3);
- 往上翻代码,发现有 41FFFD 处 cmp 和 je 可控制使用哪个字符串;
- 41FFFD 处的 cmp 使用了ss:[ebp+0x0B] 这个变量,而 41FFE6 处写入了这个变量,
- 继续往上翻代码,发现 41FFF4 处有子程序调用(程序清单 1);
- 跳到函数里看看,代码不多,但是调用了个叫做 continueFreeData 的库函数,看名字像是释放资源的,先不管(程序清单 2);
- 回头继续往上翻代码,41FFC9 处又是一个子程序调用,去看;
- 百度了下, eax 还真是 x86 存返回值用的(程序清单 3),而这个函数里有两个返回分支,分别是 0 和 1, 编程经验告诉我,这函数很可能是返回 bool 类型的;
- 回头看,在上面的函数调用完后,还真判断了 eax 里边的值(41FFCE),那么源程序很可能是 if(fun40F241()){} 这样的;
- 上边的 test 完后,下一句是跳转 je, 看起来这个 je 使程序跳出了 41FFC6 到 41FFEF 之间的循环结构,那么源程序很可能是 if(fun40F241()){ break; } 这样的;
- 再次去看 40F241 这个函数,40F24C 这里控制了是否继续捣腾 40F251 那里的 cmp;
- 双击 40F24C 那里的 jnz ,改成 jmp;
- 另存 exe(图 4, 图 5, 图 6);
- 打开新 exe 测试;
- 工具栏“软件注册”没了、注册窗口显示为“已注册”(图 7),导出列表窗口可以打开(图 8),貌似成功了;
- 发帖收工。
后记
- 这版本竟然过时失效了……
- 软件功能挺不错的;
- 注册费涨了,我¥%&……#¥#
- 打开看了下 2.11 版,坑爹的已经不能搜索到中文字符串了,“导出列表”也不弹窗了,注册窗口也不显示没注册了@_@,用上面的方法摸了下,搞不定……
- 晕ing……
图 1
图 2
图 3
图 4
图 5
图 6
图 7
图 8
程序清单 1
[Asm] 纯文本查看 复制代码 0041FFC6 |> /8D4D C8 /lea ecx,[local.14]
0041FFC9 |. |E8 73F2FEFF |call litchi-w.0040F241
0041FFCE |. |84C0 |test al,al
0041FFD0 |. |74 1F |je short litchi-w.0041FFF1
0041FFD2 |. |8B4D D0 |mov ecx,[local.12]
0041FFD5 |. |8B41 FC |mov eax,dword ptr ds:[ecx-0x4]
0041FFD8 |> |395D CC |/cmp [local.13],ebx
0041FFDB |. |74 0C ||je short litchi-w.0041FFE9
0041FFDD |. |3BC3 ||cmp eax,ebx
0041FFDF |. |75 05 ||jnz short litchi-w.0041FFE6
0041FFE1 |. |FF4D CC ||dec [local.13]
0041FFE4 |.^|EB F2 |\jmp short litchi-w.0041FFD8
0041FFE6 |> |885D 0B |mov byte ptr ss:[ebp+0xB],bl
0041FFE9 |> |8B41 04 |mov eax,dword ptr ds:[ecx+0x4]
0041FFEC |. |8945 D0 |mov [local.12],eax
0041FFEF |.^\EB D5 \jmp short litchi-w.0041FFC6
0041FFF1 |> 8D4D C8 lea ecx,[local.14]
0041FFF4 |. E8 9A8BFEFF call litchi-w.00408B93
0041FFF9 |. 53 push ebx
程序清单 2
[Asm] 纯文本查看 复制代码 00408B93 /$ 8B01 mov eax,dword ptr ds:[ecx]
00408B95 |. 85C0 test eax,eax
00408B97 |. 74 16 je short litchi-w.00408BAF
00408B99 |. 83C0 34 add eax,0x34
00408B9C |. 83CA FF or edx,-0x1
00408B9F |. F0:0FC110 lock xadd dword ptr ds:[eax],edx
00408BA3 |. 75 0A jnz short litchi-w.00408BAF
00408BA5 |. 8B09 mov ecx,dword ptr ds:[ecx]
00408BA7 |. 6A 08 push 0x8
00408BA9 |. FF15 0CC34200 call dword ptr ds:[<&QtCore4.?continueFreeData@QMap>; QtCore4.?continueFreeData@QMapData@@QAEXH@Z
00408BAF \> C3 retn
程序清单 3
[Asm] 纯文本查看 复制代码 0040F241 /$ 8B41 04 mov eax,dword ptr ds:[ecx+0x4]
0040F244 |. 8D50 01 lea edx,dword ptr ds:[eax+0x1]
0040F247 |. 8951 04 mov dword ptr ds:[ecx+0x4],edx
0040F24A |. 85C0 test eax,eax
0040F24C |. 75 0C jnz short litchi-w.0040F25A
0040F24E |. 8B41 08 mov eax,dword ptr ds:[ecx+0x8]
0040F251 |. 3B41 0C cmp eax,dword ptr ds:[ecx+0xC]
0040F254 |. 74 04 je short litchi-w.0040F25A
0040F256 |. 33C0 xor eax,eax
0040F258 |. 40 inc eax
0040F259 |. C3 retn
0040F25A |> 33C0 xor eax,eax
0040F25C \. C3 retn
|