"同类软件的鼻祖” Seer 抄走了我的 GPL 代码去卖钱……

2017-07-30 22:02:37 +08:00
 xupefei

先放一张图:

真的如此吗?

背景

我在几个月前做了一个类似苹果系统 Quick Look 的工具(Github 链接;当时在 V2EX 发的帖子在此),开发初衷正是因为我觉得 Seer 不太好用,且不开源&收费的模式让我有些不爽。

之后经过不断地改进,在 0.2.0 版本中(链接),我加入了预览打开 /保存对话框中文件的功能。其他同类的软件,包括 Seer,都没有实现这个功能(可能是因为他们的对 Windows 底层的了解太弱了)。同时,为了保护我的成果不被随意使用,我把项目的开源协议从 LGPL 换成了更严格的 GPL,以保证没人能闭源使用用我的代码。然而,这对收费的闭源软件 Seer 来说并没有什么用。

Seer 抄了啥?

先给个简单的列表:

  1. 对话框 Hook 注入部分的代码
  2. 对话框 Hook 被注入的 DLL 的代码
  3. Directory Opus 兼容部分的相关代码
  4. (不确定)UWP 判断代码

有啥证据?

刚刚发布的 Seer 1.5.0 包含了上述抄袭的代码,而且抄走的代码逻辑几乎完全没有变化,能看着他的汇编完美还原出(我的)包含变量定义的源代码。 我在截图中附加了我代码中的一些注释便于各位理解;截图汇编来自 Seer 1.5.0 的 Seer.exe (1E44DB795A8D4D7CBE5D2024ECF168FF) 和 DlgHook.dll (161471A6F9785EA4A35887060B8743E1) 。右侧的代码来自这里

1. 对话框注入代码

Seer 的作者看上去并不是十分理解我代码的意思,因为他抄过去的代码没什么用……

为什么这么说呢?首先,我的程序是 64 位的,为了注入到 32 位进程里,我用了 IsWowProcess API 来判断 (i) 自身是否在 32 位上运行 (ii) 目标程序是否是 32 位。如果 (i) 不成立且 (ii) 成立,就调用一个独立的 32 位 Helper.exe 把 DLL 注入到目标进程里。然而,Seer 本身是 32 位进程且没有 64 位的 Helper。也就是说,他判断了好几次,最后啥都没干直接 return 了。

不过,令人欣慰的是 Seer 把 if(!isTragetWoW64)条件改了,没有盲目粘贴。

2. 对话框被注入的 DLL 代码

懒得解释了,一看就明白。 那个 WM_USER+7 不是我发现的,是网上流传的未公开消息。

3. Directory Opus 相关代码

Directory Opus 官方只给了一个独立的 exe 用以和第三方交互,而且这个 exe 只支持把结果写到文件里。于是乎,Seer 1.4.0 就每隔 0.x 秒运行那个 exe、写结果到文件、读文件,疯狂占用 CPU 和 IO。为了避免这个问题,我逆向了官方提供的那个 exe,发现了未公开的 WM_COPYDATA 消息(逆向结果在此)并用到了我的 QuickLook 里。

Seer 1.5.0 版本里就把它抄走了……哦不,没有完全照抄,作者把等待的 2000 毫秒改成了 800 毫秒。不过这也太明显了吧,连前四行 if 判断都没改就放进来了。

4. UWP 判断代码 (不确定)

我不确定 Seer 作者是不是自己发现判断 ERROR_INSUFFICIENT_BUFFER 就够了,而不用申请内存后再次调用(网上的代码大都是两次调用)。

发帖的诉求是啥?

看到这里,相信各位已经对是否抄袭这个事实有一个结论了。我的代码受 GPLv3 协议的保护:任何使用它的人都必须遵守协议,把所有相关代码以 GPLv3 协议开源。既然 “ decent ” 是 Seer 的作者 idealistcorey 非常看重的东西,那么请自觉遵守 GPLv3 协议,把 Seer 1.5.0 版本的代码以 GPLv3 协议开源,即使你接下来把相关代码完全重写

另外要告诫 Seer 作者:别人的代码不是复制粘贴就可以的

最后作为对比,人家 Sekai Project 就很有版权意识,就算是想要用用 LGPL 协议的 Locale Emulator 都先来发个邮件问问:

更别说大企业了:

谢谢各位读到这里。

PS:某人的水平也太差了吧,对话框 HOOK 的 Helper.exe 源代码都在那儿,你都抄不走?

24859 次点击
所在节点    程序员
158 条回复
cchange
2017-08-01 07:29:13 +08:00
支持 quicklook 很高兴得到完美的解决

同时请问逆向用的是什么工具 我也想 hook 一些 windows 程序,同时像你一样查看别人的代码是否抄袭了开源代码

谢谢
wenzhoou
2017-08-01 07:35:43 +08:00
支持楼主。楼主情商高,做得很对。手动赞。
harry890829
2017-08-01 08:38:47 +08:00
@ysc3839 #94
@tomczhen #100
我现在需要捕获的都是 usb 扫码枪,也就是都是模拟键盘输入的方式。
我现在的处理方法是,捕获所有的键盘消息,利用时间间隔来处理,如果两次输入的时间在 50ms 以内,我就当是扫码枪输入的,当出现结束符,或者超出 50ms 的话,我这边进行验证,如果不是我需要的字段,就利用 api 将 key 值返回去。

后来发布之后遇到了问题,有的机器上,捕获了键盘消息后,key 值还不回去,表现就是键盘上所有的输入都无效了。还不知道什么原因……出现问题的机器都是客户的机器,不方便调试。

根据现在的表现来看,hook 本身应该是成功的,将所有的键盘消息都抓了出来,但是将 key 值还回去的 api 出现了问题。
对于捕获扫码枪的消息,还有什么好的方法么?感觉用时间间隔来做有点蠢的
congeec
2017-08-01 08:49:21 +08:00
楼主你这么叼,我赶紧去 GayHub 给你来个 star😝
congeec
2017-08-01 08:55:53 +08:00
不考虑来个微信捐赠按钮么?想支持下楼主啊
izgnod
2017-08-01 09:03:52 +08:00
支持开源者的辛苦劳动,支持维权!
zylll520
2017-08-01 09:32:09 +08:00
还好看到最后有一个不错的结局了
wormcy
2017-08-01 09:38:06 +08:00
不错的结果
FanWall
2017-08-01 10:00:27 +08:00
@cchange ida 正版可贵了
timwei
2017-08-01 10:12:58 +08:00
对楼主维权表示钦佩

也对 Corey 负责的态度表示钦佩

不论是有心还是无心踩线,这是个成熟的处理方式
NoAnyLove
2017-08-01 10:20:20 +08:00
不错,软件看起来挺有趣的。很多年没写 Win32 API 的程序了,看到 Windows 钩子真是一种浓浓的怀念之情(很多年以前用 Windows 消息钩子写过一个截取对话框图片的小程序),抽空学习研究一下。
rswl
2017-08-01 10:45:23 +08:00
观摩了一个维权直播
cchange
2017-08-01 11:08:17 +08:00
@FanWall 谢谢 貌似生成了伪代码 这个怎么实现呢 给个关键词就好了

ida 确实很贵……
xupefei
2017-08-01 12:42:10 +08:00
@cchange 你可以用免费的 OllyDbg。
伪代码是我自己写的,IDA 自带的也有个从汇编生成 C 代码功能,很强大。
catror
2017-08-01 13:00:42 +08:00
@harry890829 我有一种不用挂钩子的想法…用 libusb 把设备的 IO 透到应用层,然后自己看 USB-HID 的协议规范去解析数据包,libusb 可以控制到具体的设备
wenssh
2017-08-01 13:19:00 +08:00
看到 WM_COPYDATA 是未公开的消息感觉这么多年客户端白做了。。。
非利益相关,纯吐槽这一个点。
yangff
2017-08-01 13:21:15 +08:00
@xupefei 现在是 x64dbg 的天下了…… ollydbg 2.0 简直鬼故事(
cchange
2017-08-01 13:34:14 +08:00
@xupefei 非常感谢,我去看看
汇编生成 C 代码只要一部分即可,有时候这个功能是必须的
cchange
2017-08-01 13:35:06 +08:00
@yangff 刚刚搜索了一下 x64dbg 确实好用 谢谢
harry890829
2017-08-01 13:50:39 +08:00
@catror #135 这个我以前写过一点,不过我这里设计到的是各种扫码枪,设备号什么的都是不知道的……有办法解析么?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/379088

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX