Sunday, 25 May 2014

面子书 - 如何使用 Graph Search stalk 人家

虽然已经实行将近一年半的时间, 但如果是非英文用户的话可能没有Graph Search 这种功能。

要开通 Graph Search 的方法:

1. 首先, 去 https://www.facebook.com/settings?tab=account&section=language&view 把语言设定改成 English (US)。这个步骤之所以重要是因为美国佬现阶段会把 Graph Search 的研究工作优先投入在英文。至于中文要等多久就不得而知了 (中国政府都酱对他们)。




2. 然后去 https://www.facebook.com/about/graphsearch , 最下面的按钮选 Try Graph Search 就可以了。

开通前:



不过这个是排队性质, 可能要等很久, 一天还是一个月? 我也不清楚。

开通过后:



开通 Graph Search 后,  按搜索栏会出现搜索建议。


注: 只要去设定换去别的语言, 比如中文, 就可以用回旧的搜索引擎了。然后再换回去英文是不需要排队开通的。 至于时间限制, 比如说超过一年没换回英文就要重新排队, 酱我就不懂了。

每个搜索成绩的页面旁边都有更多的选项, 如图所示, 我搜索我的朋友后, 会有更多的选项 (太长了所以只截屏一部分):




Graph Search 的出现不仅是 Facebook 送给 stalkers 最佳的礼物, 而且颠覆了以前看起来不可能获得的讯息。我列举几个例子:


1. 查看某人xx的照片

a. 查看某人赞过的照片 https://www.facebook.com/search/4/photos-liked

这应该是最普遍拿来stalk人家的。只要是公开的图片都能囊括其中。




b.  查看某人留言过的照片 https://www.facebook.com/search/4/photos-commented




留意下 https://www.facebook.com/search/4/photos-commented, 4 就是用户 ID, 有时候那个人不是你的朋友, 很难搜索到他的名字出现在搜索栏位里头, 那就必须手动把 用户 ID 放在 www.facebook.com/search/ 和 /photos-commented 的中间

那么要如何找非朋友的 User ID? 只要去那个人的主页:




或者去简介 (About)




滑鼠右键选 Open Link in New Tab  后, 会打开空白的页面。





留意 URL 栏的地址, %5D &ref 之间, 如图所示, 1124300984 就是那个人的用户 ID。

不是每个人都有 send her a message 那行, 所以可以右键 Message 选 Inspect Element:




然后发现类似下面显示的, 按两下就可以点选, 然后复制出来从 %5D  &ref 之 间拿用户 ID。




注: 有些人可能会问为什么不推荐 graph API 找用户 ID? 因为一年后 API v1.0就不能用了。再者, graph API 是可以 turn off 的,所以不靠谱。

你也可以手动把 https://www.facebook.com/search/4/photos-liked 链接的 photos-liked 字眼改成 videos-liked, 当然很少有 videos liked 可能会很慢, 甚至乎没有任何搜索结果。



2. 查看谁赞过某某专页

字眼: People who like YouTube
链接: https://www.facebook.com/search/7270241753/likers

以前顶多看到自己的朋友:




现在是轻易地获得该信息:




做更进一步的搜索字眼, 只显示 所有按赞专某某粉丝专页的人 ( URL 地址出现 1422730151277988/likers ) 以及 那些人不能是我的朋友 ( URL 地址出现 me/non-friends )。留意下 URL 栏的 intersect, 表示把那两种字眼结合起来。




更更进一步, 加上URL地址加上 str/名字/users-named/




要隐藏你按赞的专页话,  就在你的个人主页去按 More 然后选 Likes




然后选 Edit Privacy, 记得不是选 Hide Section 哦, 因为 Hide Section 表示别人浏览你的个人主页看不见那个部分, 但是那些资料的隐私仍然是属于 "公开" 性质的。




然后把所有的选项改成 Only Me (中文叫仅限自己)。一般你按赞的粉丝页面是归类为 "Other" 的范畴。




改了后, 如果是别人搜索你按赞的页面是不可能的。
(注: 如果是自己搜索自己还是可以看到的)




3. 查看某某人的粉丝 (followers)

先看下这个隐私设置:




粉丝的设定是 "仅限自己",  但是面子书却跟你玩文字游戏, "谁可以查看你时间线的粉丝", 时间线 (timeline) 顾名思义就是你的页面。

换句话说, 别人来到你的页面, 看不到你的粉丝, 但面子书没说过别人用其它方法看不见。

面子书隐私设定没有错, 只不过它喜欢跟用户玩文字游戏而已。

其实, 隐私设定根本是属于单边政策, 能不能看见的关键是取决于 关注 (following) 设定, 而不是粉丝 followers 设定

如果是以前:

1. 用户 A 关注 用户 B。
2. 然后用户 B 隐私设定隐藏了粉丝
3. 用户 C 来到用户 B 的页面看不见用户 B 的粉丝。
4. 用户 C 刚巧来到用户 A 的页面才发现 A 关注用户 B, 反过来说, 用户 B 的其中一位粉丝是用户 A。
5. 除非用户 A 隐私设定隐藏了关注,用户 B 隐私设定隐藏了粉丝 A 才生效。

步骤 4 ,  “用户 C 刚巧来到用户 A 的页面” 表明了要知道谁是用户 B 的粉丝是不现实的。但由于 Graph Search 的出现, 这一切都变得易如反掌。

搜索字眼, Mark Zuckerberg's followers 或者 People who follow Mark Zuckerberg 都可以用。




由于 Graph Search 的隐私原理是以关注 (following) 设定为主的单边政策, 就算关注者 (following)  他自己的粉丝 (followers) 隐私设定为公开, 也是搜索不到的:




4. 查看某某人的照片 (User A's Photos)

其实换句话说就是某某人被 tag 的照片。

如果是以前, 你来到 "某某人拍的照片"栏位,  如图所示, 大马哈佛女学生, 只能看见 11 张照片 :



当然你可以去 https://www.facebook.com/settings?tab=timeline ,把 tag 的照片隐私设定为仅限自己。




很明显面子书又再玩文字游戏了, "on your timeline" 看不见。

但是别人 tag 你的照片, "名字"能不能看得见是取决于他, “而不是只有你浏览相关照片的时候才看得见你的名字, 别人浏览就看不见你的名字”。当然我觉得这并非不可能的, 只不过面子书没打算这么干。

通过变态的 Graph Search, https://www.facebook.com/search/用户ID/photos-tagged, 这一切隐私已经变成浮云。

如图所示, 之前我说只能看见 11 张照片, 现在却能一大把一大把捞取将近百张照片:




有一点我要强调的是, 每个人 Graph search 出来的可能跟别人看见的不一样, 取决于很多因素。 比如说如果是你 tag 用户 A 然后隐私设定为仅限自己,别人搜索用户 A 看不见, 但你搜索用户 A 还是可以看见的。而不同的 Graph Search, 比如说搜索图片跟搜索按赞的图片也是取决于不同的因素, 其复杂度可见一般。

最后一点, 无论是timeline User's Photos 还是Graph Search 都不会看见所有你的 tag。 完整的 tag 只有在 activity log 。





5. 查看推荐给某某人的 xx

这应该是最匪夷所思的搜索, 推荐给那个人的东西也能搜索到。当然, 由于搜索到的东西仍然遵循隐私设定, 所以你无法把他辩解为漏洞。

当然由于这本身就不是面子书的意愿, 所以不会推荐在搜索栏里, 必须要手动。
(注: 你也可以先搜索自己, 再从旁边的选项找人。)

https://www.facebook.com/search/4/photos-recommended-for, 我上面教过, 把 user ID 4 改成你要的 user ID就可以了。




https://www.facebook.com/search/4/pages-recommended-for




https://www.facebook.com/search/4/apps-recommended-for




我上面说了搜索成果是遵循隐私设定的,以 apps-recommended-for 为例,

从 https://www.facebook.com/search/4/apps-used 搜索我们可以发现, Mark Zuckerberg 用了两个 apps, 如果你学他用同样的两个公开的 app, 然后跑 apps-recommended-for 是会得到 100% 相符的搜索成果。总结就是, apps-recommended-for 是遵循隐私设定的。



我上面说了公开的 app, 就表示你可以把他设为仅限自己的隐私设定。

去 https://www.facebook.com/settings?tab=applications 应用 (Apps )设定, 中间的 public, friends 之类的就是别人能不能搜索到你用这个 apps 的关键。




改成仅限自己 (Only Me) 就可以了。





结语:

上面所举的只是几个例子, 还有很多无法一一列举 (去过的地方, 超过109岁的用户等等)。

用 not 逻辑,https://www.facebook.com/search/me/non-friends 这个会不会找完所有用户?




所有不是朋友的封面图, https://www.facebook.com/search/me/non-friends/photos-by/cover/photos/intersect (无论如何, 现实中比较有用的是找完自己朋友的封面图 https://www.facebook.com/search/me/friends/photos-by/cover/photos/intersect)




有某些功能还无法使用, 比如说状态搜寻(现有的只是图片短片):

关键词是 posts by 某某, 表达方式是 *stories-by(某某用户ID)
关键词是 posts about "pikachu", 表达方式是 *stories-keyword(pikachu) 
关键词是 posts about  某某, 表达方式是 *stories-topic(某某用户ID)
关键词是 posts 某某 commented on, 表达方式是 *stories-commented(某某用户ID)




还有 not (与 non-friends 不同), 比如说

intersect(*not(users-followed(friends(me))),friends(1202604355))




不过既然有预告(not yet supported) 信息, 就表示这些功能是将来很大可能有的。

最后, 来玩一下。

https://www.facebook.com/search/4/followers/4/users-followed/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/users-followed/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/4/followers/intersect

(注: 重复的 4/followers 会被忽略, 所以不影响速度, 只是要让你体会它的可伸缩性有多大)






Saturday, 10 May 2014

面子书 - Graph API v2.0




面子书在五月启动了 Graph API v2.0, 这个版本以铁腕手法杜绝滥用 API  的 App。

其中一个例子是对 user id 的管制。(以下的例子 ID 纯属虚构)




留意那些 feed 的留言/按赞的那些人名, ID 都不是本身正式的 User ID。如图所示, 1234567890

如果你用它直接呼叫 graph.facebook.com/USER_ID, 是拿不到讯息的。




你必须加上 access token,才能得到相关的讯息。




这个 User ID  是 tied to app 的, 所以正确的说法应该叫 App Scoped User ID。

每个 App 都有对应的 App Scoped User ID。至于面子书是用什么算法让它per App on the fly (请求 /home) 产生这个独特的 ID 就无从得知了。

你必须用 App Scoped User ID 浏览主页, 也就是 https://www.facebook.com/app_scoped_user_id/1234567890
才能 redirect 去 www.facebook.com/USERNAME 主页。

如果直接 https://www.facebook.com/1234567890 (中间没有了 app_scoped_user_id) 你只会得到错误页面。




假设他的正式 User ID 是 543210 (你从 www.facebook.com 所找到的), 如果直接拿来请求 v2.0 API 是不可能的。必须配合 access token, 才能有响应。




直接用 Username 查找也被禁止了。




username field 甚至完全被禁止了。


: 旁门左道获取 Username 的方法, 我已经回答在 stackoverflow 了。
总的来说, 在 v2.0 access token 是必须的。

如果这个 User 授权过这个 App, API 回应是会直接返回那个人在 www.facebook.com 的正式 User ID, 而不是 App scoped ID (注: 为了backwards-compatible )。

但是还有一个重点没说, 就是 /friends API 是只会返回该 App 的用户。当然这个改变是很够力的, 争议请参考 https://stackoverflow.com/questions/23417356/facebook-graph-api-v2-0-me-friends-returns-empty-or-only-friends-who-also-use-m



除了拿不到 non-app 朋友相关的资料, 拿不到 username,其实还有几件改变是让我彻底无语的:

1. Review




2. 最强大的 FQL 的没落




看了这些改变, 那些有做 Facebook device browserless App 的人可以一边谩骂一边把他的 App 丢进垃圾桶了。

那么如果你依赖 API 来下载东西/stalk 人家怎么办? 并非不可能, 只要猜到他/她用什么 APP(要用相关的授权), 然后自己手动模拟授权那个APP 的步骤, 拿到 access token 后, 再用那个 acess token 就可以了。

有些人开始找 graph API 代替 FQL 的方案, 我只能说太天真了, 就算你玩 Graph API 到出神入化, FQL 的强大是无法替代的。

我帮人开了 bug report, 但是那种官腔的回答让我上火, 不 shoot 他不行啊
 https://developers.facebook.com/bugs/1468637860040091/


如果你不是做 game app 而是一般功能拿来自己爽的话, 用非法的 ajax 来开发吧~

说了这么多, 有新的东西就会给我带来新的漏洞灵感。靠这赚钱我就不用吃草了。




更新: 由于我在 SO 鼓吹用 /links, 面子书 diam diam 禁止了不同 app 可以看到 links 的。无论如何, 同一个 app 还是可以。这已经不是第一次了, 上次我找到创造 multiple 用户 id 网址的方法, 虽然不算安全漏洞, 但他们也 diam diam 修改阻止这种方法了, 也是没钱收 。







Saturday, 1 March 2014

汇编 - python 进制转换器

我最近又回到汇编的怀抱, 在学习过程涉及不少的 2 进制数目, 16 进制数目, 需要好的进制转换器来帮助学习。

网上有不少进制转换器, 但有些 output 是不准确的, 有些放太大的数目会 不准确/hang掉, 再者, 没有分空行, 101111111 连在一起不是人看的。



不准确的 output:




放太大的数目等很久, copy hang掉, 111--..111 也是错误的。




我用 python 撰写了 2, 10, 16 位进制转换器, output 自己喜欢的 style。

#Author: <limkokhole@facebook.com>
#Reference: http://stackoverflow.com/questions/3258330/converting-from-hex-to-binary-without-losing-leading-0s-python

'''
Valid input for all function:
1. No space in between
e.g. b('10 10')
e.g. x('10 10')

Valid input for x():
1. Don't put 0x infront
e.g. x(0x1010), x('0x1010')
2. Always surround by string, bcoz it would error if consists of a, b, c, d, e, f
e.g. x('a')
3. print eflags
e.g. x('1a', f=1)
4. Prettyprint to 3 bits
e.g. x('1a', n=3)
Binary 32 -bit(Pretty): 0000,0000 0000,0000 0000,0000 0001,1010
become
Binary 32 -bit(Pretty): 00 000 000 000 000 000 000 000 000 011 010

Valid input for b():
'''

def chunks(l, n):
return [l[i:i+n] for i in range(0, len(l), n)]

def x(h, n=8, f=False):
#h = 'FA'
split_token = " "
sh = str(h).replace("L", "")
ii = int('1'+str(sh), 16)
orig_b = bin(ii)[3:]
b = orig_b.zfill(32)
br1 = b[::-1]
c = split_token.join(chunks(br1, n))
br2 = c[::-1]
print "Hex:", h, "\n"
if n > 4:
t1 = br2.split(split_token)
t3 = ""
for t2 in t1:
t3 = t3 + ",".join(chunks(t2, 4)) + split_token
br2 = t3
print "Binary ", len(orig_b), "-bit:", orig_b, "\n"
print "Binary ", len(b), "-bit:", b, "\n"
print "Binary ", len(b), "-bit(Pretty):", br2, "\n"
print "Decimal:", int(sh, 16), "\n"
if f:
print flags

def d(di, n=8, f=False):
dx = hex(int(di))
dx = dx.replace("0x", "", 1)
x(dx, n=n, f=f)

def b(bi, n=8, f=False):
bx = hex(int(str(bi), 2))
bx = bx.replace("0x", "", 1)
x(bx, n=n, f=f)

flags = "\
._._ID_VIP VIF_AC_VM_RF ._NT_IOPL_IOPL OF_DF_IF_TF SF_ZF_._AF ._PF_._CF \n\
\n\
CF - Carry flag \n\
PF - Parity flag \n\
AF - Adjust flag \n\
ZF - Zero flag \n\
SF - Sign flag \n\
TF - Trap flag(single step) \n\
IF - Interrupt enable flag \n\
DF - Direction flag \n\
OF - Overflow flag \n\
\n\
IOPL - I/O privilege level (286+ only), always 1 on 8086 and 186 \n\
NT - Nested task flag (286+ only), always 1 on 8086 and 186 \n\
RF - Resume flag \n\
VM - Virtual 8086 mode flag (386+ only) \n\
AC - Alignment check (486SX+ only) \n\
VIF - Virtual interrupt flag (Pentium+) \n\
VIP - Virtual interrupt pending (Pentium+) \n\
ID - Able to use CPUID instruction (Pentium+) \n\
"

用法很简单, 假设 hole.py 是我的 python 文件名字, from hole import *




总共 3 个 functions, 分别是 x() , b(), 以及 d(),个别代表着 heXadecimal, Binary, Decimal。

如果你要输入的是 2 进制, 那就用 b(1011)




如果你要输入的是 10 进制, 那就用 d(65535)




如果你要输入的是 16 进制, 那就用 x('1011'),最好习惯用引号, 因为有时你要输入的是 abc

支持 0x会让程序复杂化,所以没有支持 0x 开头, 所以不要放 x(0x1010), x('0x1010')




从 output 可以得知 2, 10, 以及 16 进制的表达方式,

Prettyprint 的 2 进制默认是分开用空格分开 byte, 用逗号分开 nibble (4 bits)

如果你要用空格分开每 3 bits, 可以加上 n=3




如果 2 进制 Output 是 在 32 bits 范围内, 还可以细分成 4 bits, 8 bits, 12 bits, 16 bits, 20 bits, 24 bits, 28 bits

如图所示,细分成 Binary 12-bit




支持非常大的数目, 如图所示, 2808 bits, 不需要 1 秒, 如果网站的转换器早 hang 了。




你 debug 汇编的时候, 常看见 eflags, 0x202 代表 IF flag 是set了。




通过这个装换器, 你可以非常了解 EFLAGS 在 2 进制的情况, 有助学习。

如图所示,  0010 代表 ._PF_.CF ,  由于点号就是 Reserved 的, 所以有没有 1 都不会增加 flag。




 干杯 :)