首页   注册   登录

chickplilita

V2EX 第 153775 号会员,加入于 2016-01-01 21:32:52 +08:00
才知道 xshell 是韩国公司出品的。
程序员  •  chickplilita  •  346 天前  •  最后回复来自 chickplilita
20
蘑菇街股权稀释分析以及一些知识
  •  8   
    程序员  •  chickplilita  •  2018-12-14 20:45:01 PM  •  最后回复来自 panzhc
    56
    技术人生的职场众生相 - 十多年的经验与心得
    分享发现  •  chickplilita  •  2017-07-16 11:33:08 AM  •  最后回复来自 chickplilita
    3
    在 shell 里面打印彩虹
    程序员  •  chickplilita  •  2017-07-17 14:17:22 PM  •  最后回复来自 mrhuiyu
    18
    remove this topic
     •  chickplilita  •  2016-01-12 12:54:38 PM
    chickplilita 最近回复了
    10 块钱上淘宝搞了个解锁码
    这个有没有关键词,随便搜索一家都行么
    318 天前
    回复了 leobuf 创建的主题 Apple 迫于基友回家,基友骗我说 mf841 不能打 csgo
    @tcitry #35 星级 2 还是重置版啊
    @OldPanda #11 额,那就只能两端抓包,分析一下包才能看出原因了。
    mtu 吧,你们中间链路的 mtu 值比较小。

    你 ping dst_ip -s 1600 试试,要是 1600 不行,1400 行,肯定是 mtu 的问题。
    还是场景有趣:

    作者:unbug
    链接: https://www.zhihu.com/question/27097399/answer/78619944
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    场景 1,话说,今天产品汪又来找我了,我昨天才切完图,肯定是改需求场景 2,尼玛,又要改好友列表,要在里面添加关注状态场景 3,关注,未关注,互相关注,前面两个好命名,后面那个怎么写好呢?作为一个有点英文水平的程序员肯定不会用什么 Each-follow 之类的,想想就不对劲,但是用什么我还真特么不知道场景 4,看看微博怎么搞的呗,我先找个互相关注的按钮瞧瞧,一点进去就是女神的,可女神没有关注我啊,怎么办场景 5,女神是交互 MM 啊,我就找个借口说测试一个渣浪,我 X,我特么好 2,这么明显谁不知道啊,但是我特么还是干了啊,天啦撸啊场景 6,女神关注我了也,赶紧把之前发的一些不正经的微博删除了,别在女神山前损形象啊,我去,我怎么转发了那么多苍老师的。。。太没品了,尼玛,sister 是什么鬼,我竟然寂寞到转发韩国妹场景 7,好了,回来看微博的关注按钮吧,可是我 X,这是什么鬼命名,我实在看不懂,难道压缩了?场景 8,难倒我了,那我看看 twitter 的啊,必须啊,人家歪果仁肯定有好的命名场景 9,我得翻墙啊,不然上不去,GFW 草泥马啊。场景 10,花了 10 块钱买了个 mz 代理总算上去了,可是我特么没人关注我啊,有注意了,叫女神上去关注我呗,这样之前的嫌疑就可以避开了,哈哈,机智如我场景 11,好说歹说女神上去了,又花了 10 块帮女神买了个代理,本来想请女神吃饭的,怕太明显了被看出来。场景 12,我叼,女神关注我了啊,女神里面也是唯一一个我关注了她,好像荒岛上就我俩个一样,又 YY 了一把。场景 13,我了个 X,Twitter 并没有互相关注的按钮,人家直接显示“ followrs you ”,我去,这太明了了,我们的产品汪真是没法比啊场景 14,我把产品汪喷了一顿,结果人家还是没有改,因为人家给我买罐可乐,我太没种了,竟然就让了场景 15,明天再想吧,命名是大事,就为了这个整天啥活也没干,下班都不好意思走啊。。。。场景 16,我想起来了,有个叫 Codelf 的变量命名神器,我去搜搜索。场景 17,直接搜索 “相互 follow ”


    但是现在查相互 follow 没有知乎上的那个结果了,这是为啥
    我之前在看雪收藏的一篇文章。目前搜了一下貌似只有百度文库里面有。我现在发一下。


    <于破解过招,保护你的共享软件>


    共享软件是软件业目前世界上比较热门的话题,国内更是如此。成千上万的中国程序员以极大的热情投入到这个领域来,都憧憬着用辛勤的劳动来获得丰厚的回报;但,实际并非如此,绝大多数的人都弑羽而归。值得注意的是:除了选题和技术上的原因外,最大的原因就是共享软件被破解( Crack )了。

    破解见得多了,不免有些麻木。大部分作者都是新软件发布一个星期左右甚至一天之内就会在网上发现注册机或者被修改过的软件(行话称之为“爆破”)。破解者制作了英文、中文、俄文、德文等语种的注册机大肆发散不说,还常常给作者寄一份,外加一封挖苦辱骂的信。唉!我们得罪了谁?没日没夜地熬夜编码,难道得到的就是这连绵的挖苦和不尽的羞辱吗?

    不!决不!我们有理由也有能力保护自己的劳动成果!但问题是:如何保护?关注国内,网上关于破解资料和教程俯拾皆是,而关于软件保护方面的资料则是凤毛麟角(大多都关系到什么技术垄断),这种畸形现状就导致了相当一部分朋友的加密非常脆弱甚至可以称得上是“弱智” !要知道,你要面对的是已经形成团伙的众多破解高手呀,国内的什么 CCG、BCG,国外的 eGis、King、Core、TNT、DAMN 和 TMG,皆为水平一流的破解组织。全球盗版软件不少于 80%都是由他们的破解的,技术实力连大软件公司都不可小视。

    看到这里,你是否已经已经灰心了?别怕,虽然我们理论上无法完全避免被破解,但如果能够有效地拖延被破解的时间,并充分打击破解者的自信心,是可以让破解者无法忍受这种折磨从而最终放弃的。

    破解,通常的做法有两种――暴力破解(爆破)和写注册机。下面我就来依次讲解每种破解方法的原理和应对方法,这些都是鄙人积累的一些共享软件保护经验,某些关键地方还有例程讲解( Delphi 代码,使用 C++和 VB 的朋友可以自己稍微修改一下),希望能对新手们有些帮助,能够更有效地保护自己的劳动成果。

    §暴力破解(爆破)

    这是最常见,也是最简单的破解的方法。该法最适合于对付没有 CRC 效验的软件,破解新手乐于采用。

    大凡共享软件,验证是否注册大多数要采用 if 条件语句来进行判断,即使你采用了什么 RSA 或 ECC 等强力加密算法,也免不了使用 if 条件语句。呵呵,这里就是共享软件最为危险的地方哦,当然也是爆破手孜孜不倦所寻求的目标呀!

    例如,你的注册函数类似如下:

    { 利用 RSA 进行注册码的数字签名验证 }

    if RSAVerify(MD5(Key), MD5(Code), e, n) then
    ShowMessage('注册成功!')
    else
    ShowMessage('注册失败!');

    { 这里 Key 是用户输入的注册码,是由你发送给注册用户的 }
    { Code 是根据用户输入的用户名自动计算出来的注册码 }
    { e 是 RSA 算法的公匙,而 n 是 RSA 算法的模数。 }

    这个注册函数即使使用了强劲的 RSA 算法进行注册码验证,可是依然很容易被破解,我们只要把这里修改为:

    { 将逻辑判断改为否 }

    if not RSAVerify(MD5(Key), MD5(Code), e, n) then
    ShowMessage('注册成功!')
    else
    ShowMessage('注册失败!');

    就可以了。这时戏剧性的结果会产生:随便输入任何注册码都可以注册通过,相反输入正确的注册码却无法通过注册。:) 其具体操作是先反汇编或者跟踪你的程序,找到判断注册码的 cmp、test 等汇编指令后的关键跳转指令处,通常是 je、jz 之类的汇编指令,把它们修改为 jne 或 jnz 即可,这样常常只需要修改一个字节就可以完美破解之。:)

    令人遗憾的是,目前大部分共享软件都是这样进行判断的,这也是为什么网上被破解的软件铺天盖地的主要原因。因为这样破解实在是太简单了...

    难道没有什么可以防止的方法吗?当然有啊!只要把软件的关键代码嵌入到注册码或者注册文件中就可以充分防止破解。但现在问题是,怎么嵌入呢?

    最简单的方法就是把关键代码(你的软件功能限制部分最关键而且最简单的一个函数)做成一个小 Dll (动态链接库),用强力对称算法加密(密匙可以是主程序某一固定不变的部分或壳的特征 Hash 值)后生成一个注册文件( License 文件,呵呵,格式只有你知道哦!),或者 Base64 编码后生成一个注册表文件,用户可以双击导入注册表内。

    效验流程如下:已注册用户验证注册码时,先验证有没有文件,没有文件者自然受限制的功能无法使用。如果有注册文件,解密之即生成一个小临时文件。如果主程序被脱壳或者被修改(爆破),自然 Hash 值密码不符,解密出来的肯定都是垃圾码,没有一点用处。只有没有被修改的主程序才能正确的解码,而且当然只有解密正确的文件才是一个真正的 Dll 文件,才能被 GetProcAddress 函数找到欲调用的关键函数地址。这样只有已注册用户才可以享受到你软件的全部功能了。

    如此一来,Cracker 破解你的软件就变得很困难了:

    首先,他如果没有注册文件,即使他把主程序脱壳了,由于受限制的部分和注册文件是关联的,他也根本无法修补完整。

    第二,即使他得到了你的注册文件,由于是加密文件,他也无法直接利用之,这样就逼迫他去拆解你的算法,这可是他们最不愿意的碰到的事情哦!如果到了这一步,我想 99%的 Cracker 都是会放弃的,呵呵,只有真正对加密算法有研究的 Cracker 高手才会继续破解下去。

    第三,你是可以用些小技巧来使他的生活更加痛苦一些的,呵呵。这里我推荐大家使用 DSA 公开密匙加密算法,它和 RSA 一样,可以进行数字签名( RSA 还可以加密,DSA 则只能进行数字签名)。我这里选用它的原因就是它有一项非常实用的特性:随机数填充机制。即 DSA 每次签名都要使用一个随机数 K,正因为有这个 K 的存在,即使是相同的用户名和机器识别码,由 DSA 加密过的每份注册文件都不会相同。这对 Cracker 拆解你的注册文件来说是一个极大的障碍。

    第四,即使他得到了解密后的 Dll 文件,他也需要大幅度地修改主程序或者把你的 Dll 部分的关键代码拆出来填到主可执行文件中。呵呵,这就看他对 PE 文件格式理解得如何了。即使这样,如果你的程序中有大量的 Hash 效验和死机代码,呵呵,你就耐心等着我们可爱的 Cracker 同志吐血吧……:)

    所以记住啊:用完这个 Dll 临时文件后立即从内存中卸载此 Dll 并删掉,而且注意在解密之前探测一下,系统中有没有 FileMon 这个威胁极大的探测器呀!

    { 探测 FileMon }

    function DetectFileMon: Boolean;
    begin
    if CreateFile(PChar('\.FILEVXD'),
    GENERIC_READ or GENERIC_WRITE,
    FILE_SHARE_READ or FILE_SHARE_WRITE,
    nil,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    0) <> INVALID_HANDLE_VALUE then
    Result := True //如果有,就 Down 机!
    else
    Result := False;
    end;

    当然,你可以保护得更好一些:可以不采用临时 Dll,而把解密后的关键代码用 WriteProcessMemory 这个 API 函数写入到主可执行文件自己进程被提交( Committed )的内存页面的指定位置去。这样由于磁盘上没有解密后的临时文件,破解更加困难。事实上,目前世界上最强劲的专业保护软件 Armadillo 就是用的这种方法。而且这种方法可以充分防止被调试器 Dump。但实现起来比较困难,尤其是在 WinNT 5 以后的操作系统中。

    由于这种方法将注册文件和受限制代码唯一关联,爆破手拿到你的软件也只有干瞪眼。建议大家都给共享软件加上功能限制,这样比时间和次数限制更加安全。

    §写注册机

    顾名思义,这种方法就是模仿你的注册码生成算法或者逆向注册码验证算法而写出来的和你一模一样的注册机。这玩意威胁极大,被爆破了还可以升级。如果被写出注册机,呵呵,你的软件只好免费了。或者你必须更换算法,但以前注册过的合法用户都得被迫更换注册码了,累死你!呵呵...

    上面的方法虽然可以避免爆破,但注册机的威胁还是存在的。Cracker 要写注册机必须详细研究你软件的验证模块,这必须先将你的软件脱壳,再反汇编或者用调试器跟踪。市面上许多加壳和保护软件都吹嘘不可能被脱壳,令人可惜的是到目前为止没有一个软件兑现了它们的诺言。由于 CPU 最终执行的都是有效指令,所以等你的程序自解压完成后再从内存中 Dump 出来就可以实现脱壳。因此不要在壳上面花很多功夫,因为没有这个必要。

    反汇编是和调试器跟踪也都是不可能防止的,因为所有的 Win32 程序都是必须通过 API 来调用 Windows 系统中的关键 Dll 的(如 Kernel32.dll 、GDI32.dll 等),然而 API 是可以 Hook 的。我们只能从自己的代码着手来保护我们的劳动果实了。

    为了自己调试和以后维护的方便,我们一般采用有意义的名字给我们的函数命名,可这给了 Cracker 可乘之机。例如这样的函数是什么意思大家应该是一目了然吧? IsRegistered(), IsLicensed(), LicenseVerify(), CheckReg()...这样 Cracker 就可以轻松地从数千个函数中找到他的目标---你的注册码效验函数!而且破解 Delphi 编写的软件还有一件 TMG 小组的破解利器---DeDe,它可以轻松看到你软件里的 Form、Unit 和函数名,还可以反汇编一部分代码,更是可以和 Win32DASM 合作反汇编更多的代码,对 Delphi 软件威胁极大。

    为了不给 Cracker 创造温馨舒适的破解环境,我们要混乱( Obfuscate )我们的代码,将软件中所有的函数名全部替换成随机生成的函数名。例如 Func_3dfsa_fs32zlfv()这个函数是什么意思?恐怕只有天知道了。网上有现成的代码混乱器,你按你使用的编程语言的种类可以找到一些。但注意,只有当你要发布软件时才使用之,而且一定注意备份源代码。否则当你看不懂你自己的代码时可别怪我呀!:)

    另外一定要使用公开密匙算法保护你的软件,RSA、DSA 和 El Gamal 之类的算法都可以从网上找到。但注意:将你算法单元中的所有涉及到算法名称的字符串全部改名。避免被 Cracker 发现你用的算法而模仿写出注册机来!你还可以张冠李戴,明明用的 DSA,将名字全部替换成 RSA,呵呵,让他模仿去吧!:)

    其它算法如对称算法和 Hash 算法都也要注意改名,否则这样:

    EncryptedCode = Blowfish(MD5(UserName), MD5(Key));

    //你的加密算法,使用了 Blowfish (对称算法)和 MD5 ( Hash 算法)

    虽然我不了解 Blowfish 和 MD5 算法的原理,也不会逆向它们,但我了解你的效验算法的流程和算法名,我马上就可以从网上找到类似的 Blowfish 和 MD5 算法包,从而模拟你的软件仿造出注册机,啊?!真是……$&*&($#%@!

    如果你用的什么其它不常见的算法(如 Skipjack (NASA 美国航天局标准算法), LOKI, 3-WAY, Safer 之类不出名但强度很高的算法),并且全部改名,就让他们去研究软件中成堆的如下代码是什么加密算法吧!:)

    0167:005B9F70 MOV EAX,[EBP-10]
    0167:005B9F73 CALL 00404000
    0167:005B9F78 PUSH EAX
    0167:005B9F79 MOV EAX,[EBP-10]
    0167:005B9F7C CALL 004041C4
    0167:005B9F81 LEA ECX,[EBP-14]
    0167:005B9F84 POP EDX
    0167:005B9F85 CALL 004B860C

    当然,最好把 Hash 算法也全部改名,给会给他们制造更多的困难。但注意,MD5 和 SHA 之类的 Hash 的初始值会被 Cracker 从内存中找到,这样他就知道了你用的 Hash 了。所有建议同时使用 MD5 的变形算法 Ripe-MD ( RMD ) 128 或 160 和其它的 Hash,如 Tiger, Haval 等算法。

    另外,请注意要经常效验你的程序是否被修改( Hash 效验),如果被修改则退出。但请注意,有些病毒会修改进程的句柄表和它指向的内核对象,这样病毒就可以直接修改运行中的 PE 文件而感染之了,另外还有网络传输错误的问题也会导致软件 CRC 出错。因此请不要认为可执行文件的 CRC 不符而此时程序已被脱壳了。

    其实,程序被脱壳最明显的标志是其大小明显大于脱壳前。1M 的 PE 文件被 UPX、ASPack 之类的软件压缩后通常只有 400 左右。如果你的软件在运行中发现自己的大小大于 800K,我想你应该知道如何做了吧?呵呵... :)

    还有一点,调试器对我们的威胁很大,我们不会肯定让 Cracker 们舒舒服服地使用 SoftICE、TRW 和 OllyDbg 来调试我们的程序。除了常用的 MeItICE 方法外,这里我给一个我写的方法:

    { 检查自己的进程的父进程是否为 Explorer.exe ,否则是被调试器加载了 }
    { 不过注意,控制台程序的父进程在 WinNT 下是 Cmd.exe 哦!}
    { 注意加载 TlHelp32.pas 单元 }

    procedure CheckParentProc;
    var //检查自己的进程的父进程
    Pn: TProcesseNtry32;
    sHandle: THandle;
    H, ExplProc, ParentProc: Hwnd;
    Found: Boolean;
    Buffer: array[0..1023] of Char;
    Path: string;
    begin
    H := 0;
    ExplProc := 0;
    ParentProc := 0;
    //得到 Windows 的目录
    SetString(Path,
    Buffer,
    GetWindowsDirectory(Buffer, Sizeof(Buffer) - 1));
    Path := UpperCase(Path) + 'EXPLORER.EXE'; //得到 Explorer 的路径
    //得到所有进程的列表快照
    sHandle := CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0);
    Found := Process32First(sHandle, Pn); //查找进程
    while Found do //遍历所有进程
    begin
    if Pn.szExeFile = ParamStr(0) then //自己的进程
    begin
    ParentProc := Pn.th32ParentProcessID; //得到父进程的进程 ID
    //父进程的句柄
    H := OpenProcess(PROCESS_ALL_ACCESS, True, Pn.th32ParentProcessID);
    end
    else if UpperCase(Pn.szExeFile) = Path then
    ExplProc := Pn.th32ProcessID; //Explorer 的 PID
    Found := Process32Next(sHandle, Pn); //查找下一个
    end;
    //嗯,父进程不是 Explorer,是调试器……
    if ParentProc <> ExplProc then
    begin
    TerminateProcess(H, 0); //杀之!除之而后快耶! :)
    //你还可以加上其它什么死机代码来消遣消遣这位可爱的 Cracker :)
    end;
    end;

    你可以在 Delphi 或者 VC 中试试,呵呵,是不是把 Delphi 和 VC 杀掉了,因为你现在用的是 Delphi 和 VC 的内置调试器来运行你的程序的,当然它会六亲不认了,呵呵!调试的时候你还是把它注释掉吧,发布时别忘记激活哟!

    最后一个问题,这也是一个非常重要的问题:保护你的字符串!!!字符串在注册模块中非常重要!当一个富有经验的 Cracker 破解你的软件时,首先做的就是摄取你的字符串。比如他会输入错误的注册码,得到你关于错误注册码的提示,通常是“无效的注册码,请重新输入!”或者“ Invalid key, please input again!”等等,然后用 OllyDbg 下断点调试或者用 WinDASM、IDA Pro 等静态分析工具在被他脱壳后的程序中查找那个字符串,找到后进行分析。因此,请一定加密你的字符串!!!一定!!! 使用时再临时解密出来,而且要尽量少使用消息提示框 ,避免被 Cracker 找到漏洞。加密字符串不需要太复杂的算法,随便找一个快速的对称算法就可以了。

    最后提醒你一句,不要在加密上花太多的功夫!你应该把更多的时间和精力都用来完善你的软件,这样会更合算。借用一位前辈的话来忠告大家吧:花点时间考虑你自己的软件,看看它是否值得保护?如果没人用你的软件,保护也就没有意义了,不要过高估计你的软件“对世界的重要性”!
    程序员实现的是
    “今年你的评论,一共收获了 20 个赞”


    产品要求的是
    “今年,你的评论一共收获了 20 个赞”

    产品肯定要求后面那种,因为数据好看啊。
    346 天前
    回复了 chickplilita 创建的主题 程序员 才知道 xshell 是韩国公司出品的。
    不是,整个 NetSarang 的开发环境都被攻破了。他们后来开发新版本是在一个完全隔离的环境,一个一个业务检查,一个一个重新加白名单。

    最初是怎么发现的呢,一个金融公司看到出口流量有莫名的 dns 请求(这点 yaunge 貌似分享过,抓 dns 流量),每 8 个小时请求一次。然后金融公司去找卡巴斯基分析,然后卡巴斯基找到是 NetSarang 的问题。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2272 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 17ms · UTC 15:02 · PVG 23:02 · LAX 07:02 · JFK 10:02
    ♥ Do have faith in what you're doing.