吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 2894|回复: 9

[转载技术] 一含自杀代码的软件注册算法分析

[复制链接]
Shark_鹏 发表于 2015-3-26 21:28 | 显示全部楼层 |阅读模式

准备阶段:
分别对硬盘序列号和厂商编码进行计算,得到两组数据,到这里成型:
  1. 0048934C   MOV EDX, DWORD PTR DS:[50D054]                    ;  数字 25517715
  2. 00489352   PUSH EDX                                          ; /Arg1 => 0020EFDC
  3. 00489353   CALL NEAR DWORD PTR DS:[<&msvbvm60.rtcR8ValFromBs>; \转化为整数
  4. 00489359   MOV EBX, DWORD PTR DS:[<&msvbvm60.__vbaFpI4>]     ;  msvbvm60.__vbaFpI4
  5. 0048935F   CALL NEAR EBX                                     ;  <&msvbvm60.__vbaFpI4>
  6. 00489361   XOR EAX, 246E69                                   ;  25517715 xor 246E69=27341050
  7. 00489366   PUSH EAX                                          ; /Arg1
  8. 00489367   CALL NEAR DWORD PTR DS:[<&msvbvm60.__vbaStrI4>]   ; \转化为数字--结果1
  9. 0048936D   MOV EDX, EAX
  10. 0048936F   MOV ECX, u中文内?0050D05C
  11. 00489374   CALL NEAR ESI
  12. 00489376   MOV EAX, DWORD PTR DS:[50D058]                    ;  数字 35567050
  13. 0048937B   PUSH EAX                                          ; /35567050
  14. 0048937C   CALL NEAR DWORD PTR DS:[<&msvbvm60.rtcR8ValFromBs>; \转化为整数
  15. 00489382   CALL NEAR EBX
  16. 00489384   XOR EAX, 856AC5                                   ;  35567050 xor 856AC5=43769615
  17. 00489389   PUSH EAX                                          ; /Arg1
  18. 0048938A   CALL NEAR DWORD PTR DS:[<&msvbvm60.__vbaStrI4>]   ; \转化为数字--结果2
复制代码
虽说后面还要对结果1、2进行计算,但
结果1=27341050
结果2=43769615
是重要的步骤过程。

接下来是重启之后的重要校验:
  1. 0048939C   MOV EDX, DWORD PTR DS:[50D060]                    ;  43769615
  2. 004893A2   PUSH 1                                            ; /Arg4 = 00000001
  3. 004893A4   PUSH ECX                                          ; |Arg3
  4. 004893A5   PUSH EDX                                          ; |Arg2 => 00207224
  5. 004893A6   PUSH EDI                                          ; |Arg1
  6. 004893A7   CALL NEAR DWORD PTR DS:[<&msvbvm60.__vbaInStr>]   ; \43769615 在注册码解密数据中?
  7. 004893AD   MOV ECX, DWORD PTR DS:[50D05C]                    ;  27341050
  8. 004893B3   XOR EBX, EBX
  9. 004893B5   TEST EAX, EAX
  10. 004893B7   MOV EAX, DWORD PTR SS:[EBP-80]
  11. 004893BA   PUSH 1                                            ; /Arg4 = 00000001
  12. 004893BC   PUSH EAX                                          ; |Arg3
  13. 004893BD   PUSH ECX                                          ; |Arg2 => 001984EC
  14. 004893BE   PUSH EDI                                          ; |Arg1
  15. 004893BF   SETLE BL                                          ; |
  16. 004893C2   CALL NEAR DWORD PTR DS:[<&msvbvm60.__vbaInStr>]   ; \27341050 在注册码解密数据中?
复制代码
如果这里通不过的话,就要求进行软件注册了。
上面的校验过程省略了注册码的变换描述。


注册码变换:
  1. 004726EF  MOV DWORD PTR SS:[EBP-4], 5                       ;  循环==>
  2. ……
  3. 00472727  CALL NEAR DWORD PTR DS:[<&msvbvm60.rtcMidCharVar>>; \读取注册码一位
  4. ……
  5. 00472752  MOV DWORD PTR SS:[EBP-170], u中文内?00410C14         ;  “-”
  6. ……
  7. 00472774  CALL NEAR DWORD PTR DS:[<&msvbvm60.__vbaVarTstEq>>; \是否是“-”
  8. ……
  9. 0047277F  JE u中文内?00472A81                                  ;  不是则跳
  10. ……
  11. 00472858  CALL NEAR DWORD PTR DS:[<&msvbvm60.rtcMidCharVar>>; \是则截取“-”号前面一截
  12. ……
  13. 004729AC  CALL u中文内?00472EC0                                ;  换序
  14. ……
  15. 004729CC  CALL u中文内?00472150                                ;  换算
  16. ……004729E8  PUSH EDX                                          ; /Arg3
  17. 004729E9  LEA EAX, DWORD PTR SS:[EBP-148]                   ; |
  18. 004729EF  PUSH EAX                                          ; |Arg2
  19. 004729F0  LEA ECX, DWORD PTR SS:[EBP-158]                   ; |
  20. 004729F6  PUSH ECX                                          ; |Arg1
  21. 004729F7  CALL NEAR DWORD PTR DS:[<&msvbvm60.__vbaVarCat>]  ; \__vbaVarCat
  22. 004729FD  PUSH EAX                                          ; /Arg3
  23. 004729FE  LEA EDX, DWORD PTR SS:[EBP-178]                   ; |
  24. 00472A04  PUSH EDX                                          ; |Arg2
  25. 00472A05  LEA EAX, DWORD PTR SS:[EBP-168]                   ; |
  26. 00472A0B  PUSH EAX                                          ; |Arg1
  27. 00472A0C  CALL NEAR DWORD PTR DS:[<&msvbvm60.__vbaVarCat>]  ; \__vbaVarCat--结果拼接
  28. ……
  29. 00472AAD  JNZ u中文内?004726EF                                 ;  循环<==
复制代码
注册分为n段,每段之间用“-”号连接,这段代码的作用就是按“-”将注册码进行切割,其中前n-1段注册码在这段代码中进行解密。解密的结果仍按原来的顺序用“-”号进行连接。
最后一段用下面的代码解密并连接:
  1. 00472CE9  CALL u中文内?00472EC0                                ;  换序
  2. ……
  3. 00472D09  CALL u中文内?00472150                                ;  换算
  4. 00472D0E  LEA EDX, DWORD PTR SS:[EBP-70]
  5. 00472D11  PUSH EDX                                          ; /Arg3
  6. 00472D12  LEA EAX, DWORD PTR SS:[EBP-148]                   ; |
  7. 00472D18  PUSH EAX                                          ; |Arg2
  8. 00472D19  LEA ECX, DWORD PTR SS:[EBP-158]                   ; |
  9. 00472D1F  PUSH ECX                                          ; |Arg1
  10. 00472D20  CALL NEAR DWORD PTR DS:[<&msvbvm60.__vbaVarCat>]  ; \__vbaVarCat
复制代码
其实处理方法完全相同。
前面的检验就是使用了这里解密的数据。

从前面的检验不难看到,注册码至少需要两段。
如果恰好两段,且也满足条件,是能够注册的,所有的使用和现实均正常。
如果你认为注册码恰好两段,那你就错了,在某个时刻(某个动作下)你会发现你的注册信息以及主程序悄然失踪。那就是说,程序还有暗桩。
请看:
  1. 0048D1D2   PUSH u中文内?00411978                               UNICODE "*.EXE"
  2. 0048D1F2   MOV EDX, u中文内?00411988                           UNICODE "in.bat"
  3. 0048D216   PUSH u中文内?0041199C                               UNICODE ":START"
  4. 0048D22A   PUSH u中文内?004119B8                               UNICODE "del "
  5. 0048D252   PUSH u中文内?004119C8                               UNICODE "if exist "
  6. 0048D262   PUSH u中文内?004117B8                               UNICODE " GOTO START"
  7. 0048D28D   PUSH u中文内?004119B8                               UNICODE "del "
  8. 0048D292   PUSH u中文内?00411988                               UNICODE "in.bat"
复制代码
这些地址指示的位置是生成一个批处理程序"in.bat",然后反复寻找当前"程序名*.EXE",一经发现,立马"del ",当已经没有时,"in.bat"就自杀。
有了这段地址代码,定位相应代码就不成问题了。那触发这个批处理程序的原因是什么呢?接着看:
1、机器码和解密数据之间是什么关系呢:
回忆我的过程结果:
结果1=27341050
结果2=43769615
  1. 0046BEA1  MOV EAX, DWORD PTR DS:[50D05C]                    ;  27341050
  2. ……
  3. 0046BEAA  CALL NEAR DWORD PTR DS:[<&msvbvm60.rtcR8ValFromBs>; \转化为整数
  4. ……
  5. 0046BEB8  XOR EAX, 23D0B5                                   ;  27341050 xor 23D0B5=25354319
  6. 0046BEBD  PUSH EAX                                          ; /Arg1
  7. 0046BEBE  CALL NEAR DWORD PTR DS:[<&msvbvm60.__vbaStrI4>]   ; \转化为数字
  8. ……
  9. 0046BECD  MOV ECX, DWORD PTR DS:[50D060]                    ;  43769615
  10. 0046BED3  PUSH ECX                                          ; /Arg1 => 00000000
  11. 0046BED4  CALL NEAR DWORD PTR DS:[<&msvbvm60.rtcR8ValFromBs>; \转化为整数
  12. 0046BEDA  CALL NEAR EBX
  13. 0046BEDC  XOR EAX, 274996                                   ;  43769615 xor 274996=45913753
  14. 0046BEE1  PUSH EAX                                          ; /Arg1
  15. 0046BEE2  CALL NEAR DWORD PTR DS:[<&msvbvm60.__vbaStrI4>]   ; \转化为数字
  16. ……
  17. 0046BF05  MOV ECX, DWORD PTR DS:[50D064]                    ;  25354319
  18. 0046BF0B  MOV EBX, DWORD PTR DS:[EAX]
  19. 0046BF0D  PUSH ECX                                          ; /Arg2 => 00000000
  20. 0046BF0E  PUSH u中文内?00410244                             ; |Arg1 = 00410244
  21. 0046BF13  MOV DWORD PTR SS:[EBP-8C], EAX                    ; |
  22. 0046BF19  CALL NEAR DWORD PTR DS:[<&msvbvm60.__vbaStrCat>]  ; \拼接
  23. ……
  24. 0046BF26  MOV EDX, DWORD PTR DS:[50D068]                    ;  45913753
  25. 0046BF2C  PUSH EAX                                          ; /Arg2
  26. 0046BF2D  PUSH EDX                                          ; |Arg1 => 00000000
  27. 0046BF2E  CALL NEAR DWORD PTR DS:[<&msvbvm60.__vbaStrCat>]  ; \拼接成机器码
复制代码
而机器码恰好就是:25354319_45913753.
原来由机器码得到参与比较的数据要经过这样的计算。
2、注册码解密过程:
1)、换序
为便于观察,假设一段注册码为:12345678。换序后的结果为:81726354。
2)、换算
  1. 0047234F  MOV DWORD PTR SS:[EBP-4], 8                       ;  循环==>
  2. ……
  3. 0047238A  CALL NEAR DWORD PTR DS:[<&msvbvm60.rtcMidCharVar>>; \读取一位
  4. ……
  5. 004723C4  CALL NEAR DWORD PTR DS:[<&msvbvm60.rtcAnsiValueBs>; \取ASC码
  6. 004723CA  MOV SI, AX                                        ;  转移结果
  7. 004723CD  PUSH u中文内?00410C0C                                ; /C
  8. 004723D2  CALL NEAR DWORD PTR DS:[<&msvbvm60.rtcAnsiValueBs>; \取C的ASC码
  9. 004723D8  SUB SI, AX                                        ;  两者相减
  10. ……
  11. 00472426  CALL NEAR DWORD PTR DS:[<&msvbvm60.rtcR8ValFromBs>; \取结果
  12. 0047242C  FADD QWORD PTR DS:[401478]                        ;  +0.5
  13. 00472432  CMP DWORD PTR DS:[50D000], 0
  14. 00472439  JNZ SHORT u中文内?00472443
  15. 0047243B  FDIV QWORD PTR DS:[401470]                        ;  /2.5
  16. ……
  17. 0047245E  CALL NEAR DWORD PTR DS:[<&msvbvm60.__vbaFPInt>]   ;  取整
  18. ……
  19. 004724A8  CALL NEAR DWORD PTR DS:[<&msvbvm60.__vbaVarCat>]  ; \转化为数字进行拼接
  20. ……
  21. 004724E8  JNZ u中文内?0047234F                              ;  循环<==
复制代码
经过这段代码的运算,注册码的每一段就算解密好了。

3、暗桩校验:
  1. 004BA207  CALL NEAR DWORD PTR DS:[<&msvbvm60.__vbaInStrVar>>; \NMZH-是否在注册码中
  2. ……
  3. 004BA243  TEST ECX, ECX
  4. 004BA245  JE SHORT u中文内?004BA26D                         ; 在就跳
  5. ……
  6. 004BA252  CALL u中文内?0048D380                             ;  跳至批处理
  7. 004BA257  LEA ECX, DWORD PTR SS:[EBP-64]
  8. 004BA25A  CALL NEAR DWORD PTR DS:[<&msvbvm60.__vbaFreeVar>] ;  msvbvm60.__vbaFreeVar
  9. 004BA260  MOV DWORD PTR SS:[EBP-4], 15                      ; |
  10. 004BA267  CALL NEAR DWORD PTR DS:[<&msvbvm60.__vbaEnd>]     ; \__vbaEnd
  11. 004BA26D  MOV DWORD PTR SS:[EBP-4], 17
  12. ……
  13. 004BA293  CALL u中文内?004725F0                                ;  注册码变换
  14. ……
  15. 004BA2A2  CALL NEAR DWORD PTR DS:[<&msvbvm60.rtcRightCharVa>; \读取解码结果的后4位
  16. ……
  17. 004BA2CC  CALL NEAR DWORD PTR DS:[<&msvbvm60.rtcRightCharVa>; \读取机器码计算过程中间值的后4位
  18. ……
  19. 004BA2DD  CALL NEAR DWORD PTR DS:[<&msvbvm60.__vbaVarTstNe>>; \比较
  20. ……
  21. 004BA30B  TEST EDX, EDX
  22. 004BA30D  JE SHORT u中文内?004BA335
  23. ……
  24. 004BA31A  CALL u中文内?0048D380                                ;  跳至批处理
  25. 004BA31F  LEA ECX, DWORD PTR SS:[EBP-64]
  26. 004BA322  CALL NEAR DWORD PTR DS:[<&msvbvm60.__vbaFreeVar>] ;  msvbvm60.__vbaFreeVar
  27. 004BA328  MOV DWORD PTR SS:[EBP-4], 19                      ; |
  28. 004BA32F  CALL NEAR DWORD PTR DS:[<&msvbvm60.__vbaEnd>]     ; \__vbaEnd
  29. 004BA335  MOV DWORD PTR SS:[EBP-4], 1D
复制代码
总结:
1、注册验证模式为:F(注册码)=机器码。
2、难点:分散式检验;
3、虽有破坏性代码,但只自杀,不伤及无辜。
4、我贴的代码是为需所用,顺序和位置可能有些混乱,且同等代码存在多处;且为节省篇幅,只保留关键代码。你若也想跟踪,找特征码定位。
5、作者的相关软件的注册功能模式类似。

评分

参与人数 21HB +22 THX +12 收起 理由
虚心学习 + 1 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
花盗睡鼠 + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
attackmyth + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
sjtkxy + 1 + 1
Jawon + 1
24567 + 2
Soul1999 + 1
后学真 + 1
消逝的过去 + 2
飞刀梦想 + 1
zxjzzh + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
xgbnapsua + 1
jaunic + 1
zwj00544 + 1
lies + 1
muker + 1 [快捷评语]--吃水不忘打井人,给个评分懂感恩!
fanlao + 1 + 1 评分=感恩!简单却充满爱!感谢您的作品!
逍遥枷锁 + 4 + 1 好人有好报!你的热心我永远不忘!谢谢!
璀璨网络 + 1 + 1 您的“悬赏问答”已解决,故关闭回复。学破解论坛祝您学习愉快!
雪里红 + 1 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
Shark恒 + 3 + 1 评分=感恩!简单却充满爱!感谢您的作品!!

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
fanlao 发表于 2015-3-27 20:12 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
头像被屏蔽
别管我了行 发表于 2022-3-11 04:20 | 显示全部楼层

提示: 作者被禁止或删除 内容自动屏蔽
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
zwj00544 发表于 2022-3-11 04:41 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
曾经沧海 发表于 2022-11-24 06:41 | 显示全部楼层

受教了  收藏学习一波
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
一生逍遥 发表于 2022-12-17 06:48 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
曾经沧海 发表于 2023-4-18 13:06 | 显示全部楼层

跟着大佬少走弯路
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
头像被屏蔽
sjtkxy 发表于 2023-4-19 04:35 | 显示全部楼层

提示: 作者被禁止或删除 内容自动屏蔽
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
一生逍遥 发表于 2023-5-17 20:31 | 显示全部楼层

这个很实用,谢谢分享。
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
attackmyth 发表于 2023-5-18 15:32 | 显示全部楼层

感谢分享 继续学习
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

警告:本站严惩灌水回复,尊重自己从尊重他人开始!

1层
2层
3层
4层
5层
6层
7层
8层
9层
10层

免责声明

吾爱汇编(www.52hb.com)所讨论的技术及相关工具仅限用于研究学习,皆在提高软件产品的安全性,严禁用于不良动机。任何个人、团体、组织不得将其用于非法目的,否则,一切后果自行承担。吾爱汇编不承担任何因为技术滥用所产生的连带责任。吾爱汇编内容源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除。如有侵权请邮件或微信与我们联系处理。

站长邮箱:SharkHeng@sina.com
站长QQ:1140549900


QQ|RSS|手机版|小黑屋|帮助|吾爱汇编 ( 京公网安备11011502005403号 , 京ICP备20003498号-6 )|网站地图

Powered by Discuz!

吾爱汇编 www.52hb.com

快速回复 返回顶部 返回列表