吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 10069|回复: 66

[原创逆向图文] 算法分析第一课 -- 超级视频合并软件 算法分析 回帖有钱

  [复制链接]
LYQingYe 发表于 2015-8-26 20:28 | 显示全部楼层 |阅读模式

本帖最后由 LYQingYe 于 2015-8-27 18:35 编辑

几天没法教程,手痒痒。因为是假期 13天 ,所以我打算弄一个算法分析系列教程。现在是第一课,希望能得到大家的支持。一边分析一天写帖的,所以难免会有些错误,希望大家指出,共同学习进步。教程我就不隐藏了,回帖有钱领哦。  我发教程只为共同学习不为什么,只求大家热心回复。中奖概率 50%每次5块钱,我是穷人
软件名称:超级视频合并软件 V2.20
编译器:貌似 Delphi6-7 无壳。

这个代码框让我数据丢失了两次,我又重新编过 效果不是很好,真失败。

正常情况下,打开弹出一个NAG窗口 要你注册还是试用,未注册版本合并视频后会有水印。下断点
MessageboxA 就可以找到关键 CALL 在这是 算法课,我就不说明了,很简单的。
1.png
从按钮事件开始  _TFrm_Reg_Btn_RegClick proc near   0057EAC8
  1. push    ebp
  2. mov     ebp, esp
  3. xor     ecx, ecx
  4. push    ecx
  5. push    ecx
  6. push    ecx
  7. push    ecx
  8. push    ecx
  9. push    ecx
  10. push    ebx
  11. mov     ebx, eax
  12. xor     eax, eax
  13. push    ebp
  14. push    offset loc_57EC4F
  15. push    dword ptr fs:[eax]
  16. mov     fs:[eax], esp
  17. lea     edx, [ebp+var_4]
  18. mov     eax, [ebx+304h] ; this
  19. call    @Controls@TControl@GetText$qqrv ;            TControl::GetText(void)  
  20. mov     eax, [ebp+var_4]                                         EAX = 用户名   这里我们用 XUEPOJIE 来代替用户名
  21. call    unknown_libname_81 ;                                   取用户名长度赋值给EAX
  22. test    eax, eax                                                         判断 EAX 是否等于 0  用TEST EAX,EAX 是常用的方法来判断一个寄存器内容是否为 0。
  23. jnz     short loc_57EB2A                                            不为0 则跳转 到 LOC_57EB2A</font>
复制代码
  1. loc_57EB2A:
  2. lea     edx, [ebp+var_8]
  3. mov     eax, [ebx+308h] ; this
  4. call    @Controls@TControl@GetText$qqrv ;        GetText(void)
  5. mov     eax, [ebp+var_8]                                      EAX = 假注册码   这里我们用 8888888888888888888888888代替注册码。
  6. call    unknown_libname_81 ;                               取假码长度 给EAX
  7. test    eax, eax                                                     判断假码长度是否为0
  8. jnz     short loc_57EB70                                        不为0则跳,必须要跳走。</font>
复制代码



                               
登录/注册后可看大图

loc_57EBFB  核心算法CALL  下面接着分析
loc_57EBFB 里面有四个 CALL  loc_004E0D24     loc_004E0B4C(包含全部算法代码)   loc_004047E8   loc_00403D04

004E0B66         push    ebp
004E0B67         push    004E0D0A
004E0B6C         push    dword ptr fs:[eax]
004E0B6F         mov     dword ptr fs:[eax], esp
004E0B72         mov     eax, [local.1]
004E0B75         call    004043C0
004E0B7A         lea     edx, [local.4]
004E0B7D         mov     eax, edi
004E0B7F         call    004E0AE4
004E0B84         mov     eax, [local.4]                                  ;  EAX = 用户名
004E0B87         call    0040469C                                        ;  计算的用户名长度
004E0B8C         mov     esi, eax
004E0B8E         test    esi, esi
004E0B90         jle     short 004E0BC2                                  ;  判断 是否为 0
004E0B92         mov     ebx, 0x1                                        ;  ebx 初始化 为0
004E0B97         lea     edx, [local.6]
004E0B9A         mov     eax, edi
004E0B9C         call    004E0AE4
004E0BA1         mov     eax, [local.6]                                 ;  eax = 用户名地址
004E0BA4         movzx   eax, byte ptr [eax+ebx-0x1]         ;  eax = 用户名第一位 ASICC值
004E0BA9         lea     ecx, [local.5]
004E0BAC         xor     edx, edx
004E0BAE         call    00409528                                       ;  需要分析

第一层算法
004093C8         or      cl, cl        判断cl是否为0 cl = 10固定的
004093CA         jnz     short 004093E3   不为0不跳
004093CC         or      eax, eax


004093CE         jns     short 004093DE  
004093D0         neg     eax
004093D2         call    004093DE
004093D7         mov     al, 0x2D
004093D9         inc     ecx
004093DA         dec     esi
004093DB         mov     byte ptr [esi], al
004093DD         retn
004093DE         mov     ecx, 0xA


004093E3         push    edx
004093E4         push    esi
004093E5         xor     edx, edx                                        ;  edx 清零
004093E7         div     ecx                                               ;  此时 eax =X的ASCII 值 58 eax / ecx 商在 eax 余数在 edx
004093E9         dec     esi                                               ;  esi - 1
004093EA         add     dl, 0x30                                       ;  余数 + 0x30
004093ED         cmp     dl, 0x3A                                      ;  小于则跳转
004093F0         jb      short 004093F5
004093F2         add     dl, 0x7
004093F5         mov     byte ptr [esi], dl                          处理后的数据放到 esi指向的内存空间
004093F7         or      eax, eax                                       判断 eax是否为0 为0不跳
004093F9         jnz     short 004093E5  

第一次循环 : eax = 58 = 'X'   ecx = 10    eax/ecx  商=eax = 5 余数 = 8 =edx  余数+30 = 8+30= 38  放入 esi指向空间

第二次循环 eax = 5  ecx = 10 eax /ecx 商 = 0 =eax  循环可以跳走了  余数 =edx = 5 余数 +30 =35  esi-1 放入 前一个字节的空间
相当于  35  38 我们在内存看下 2.png   是不是感到很奇怪 这个数值 刚到 等于 一个 字符串 '58' 这个字符串 刚到等于 我们用户名第一个 字符的 ASCII值, 所以 第一层算法 只是将  用户名的 ASCII值 转化为 字符串
ASCII "585545504F4A4945"


004E0BB3        mov     edx, [local.5]                                 ;  edx 等于 处理 后的 字符串
004E0BB6        lea     eax, [local.2]
004E0BB9         call    004046A4
004E0BBE        inc     ebx
004E0BBF         dec     esi
004E0BC0         jnz     short 004E0B97






004E0BB3      mov     edx, [local.5]                                 ;  edx 等于 处理后的字符串地址
004E0BB6      lea     eax, [local.2]
004E0BB9      call    004046A4
004E0BBE      inc     ebx
004E0BBF      dec     esi
004E0BC0      jnz     short 004E0B97

下面就是第二层算法 ,其实没什么作用 
004E0BC2      mov     eax, [local.2]                                  ;  将 运算的 东东 放到eax
004E0BC5      call    0040469C                                        ;  将 这字符串 前 4个 字节的 内容 给 eax
004E0BCA      mov     esi, eax                                        ;  eax 给 esi
004E0BCC      test    esi, esi                                        ;  判断 esi是否 为 0
004E0BCE      jle     short 004E0BFC
004E0BD0      mov     ebx, 0x1                                        ;  ebx 给  0x1  貌似要 计数器
004E0BD5      mov     eax, [local.2]                                 ;  运算后的 假吗 给 eax
004E0BD8      call    0040469C                                       ;  还是 刚才 那样 给前4个字节 数据 给 eax
004E0BDD      sub     eax, ebx                                       ;  eax- ebx
004E0BDF      mov     edx, [local.2]                                 ;  假吗运算之 给 edx
004E0BE2      mov     dl, byte ptr [edx+eax]                         ;  第一次 取最后 一位
004E0BE5      lea     eax, [local.7]                                 ;  估计 又是 将此 东西 放入缓冲区
004E0BE8      call    004045A8                                       
004E0BED      mov     edx, [local.7]
004E0BF0      lea     eax, [local.3]
004E0BF3      call    004046A4
004E0BF8      inc     ebx
004E0BF9      dec     esi
004E0BFA      jnz     short 004E0BD5
第二层算法作用也就是 把第一层算法得出的字符串倒过来
ASCII "5494A4F405545585"

004E0BFC      lea     eax, [local.2]           将处理后的字符串 的二级指针给转化为 一级指针给eax 这个是第一层算法算出的
004E0BFF      push    eax               压入栈,保存起来
004E0C00      mov     ecx, 0x4            初始化变量 eax = 0x4
004E0C05      mov     edx, 0x1            初始化变量 edx = 0x1
004E0C0A      mov     eax, [local.3]                                  ;  将倒转后的字符串也就是第二层算法 后的字符串地址给eax 
004E0C0D      call    004048FC            执行后 eax = 倒转字符串前四个字节 5494 字符串的二级指针
004E0C12      lea     eax, [local.3]           二级指针给eax 转换为 一级指针
004E0C15      push    eax              指针入栈 保存
004E0C16      mov     ecx, 0x4            初始化值
004E0C1B      mov     edx, 0x5            初始化值 
004E0C20      mov     eax, [local.3]          倒转字符串地址给 eax   
004E0C23      call    004048FC            执行后 eax = 倒转后字符串 接着在后四位 4AF4字符串的二级指针 
004E0C28      mov     eax, [local.2]          将前四位字符串地址给eax
004E0C2B      call    0040469C            计算出他的长度
004E0C30      cmp     eax, 0x4            判断长度是否等于 0x4 等于则跳,我先撤了。已经跳了
004E0C33      jge     short 004E0C64
004E0C35      mov     eax, [local.2]
004E0C38      call    0040469C
004E0C3D      mov     ebx, eax
004E0C3F      cmp     ebx, 0x3
004E0C42      jg      short 004E0C64
004E0C44      /lea     ecx, [local.8]
004E0C47      |mov     eax, ebx
004E0C49      |shl     eax, 0x2
004E0C4C      |xor     edx, edx
004E0C4E      |call    00409528
004E0C53      |mov     edx, [local.8]
004E0C56      |lea     eax, [local.2]
004E0C59      |call    004046A4
004E0C5E      |inc     ebx
004E0C5F      |cmp     ebx, 0x4
004E0C62      \jnz     short 004E0C44
004E0C64      mov     eax, [local.3]      接着后四位的字符串地址给eax 4AF4

004E0C67      call    0040469C         计算器其长度
004E0C6C      cmp     eax, 0x4         判断长度 跳了
004E0C6F      jge     short 004E0CA0
004E0C71      mov     eax, [local.3]
004E0C74      call    0040469C
004E0C79      mov     ebx, eax
004E0C7B      cmp     ebx, 0x3
004E0C7E      jg      short 004E0CA0
004E0C80      /lea     ecx, [local.9]
004E0C83      |mov     eax, ebx
004E0C85      |shl     eax, 0x2
004E0C88      |xor     edx, edx
004E0C8A      |call    00409528
004E0C8F      |mov     edx, [local.9]
004E0C92      |lea     eax, [local.3]
004E0C95      |call    004046A4
004E0C9A      |inc     ebx
004E0C9B      |cmp     ebx, 0x4
004E0C9E      \jnz     short 004E0C80
004E0CA0      lea     eax, [local.10]        
004E0CA3      push    eax
004E0CA4      mov     eax, dword ptr [edi+0x4]    在这产生一个新的字符串 vj268v2013 不要奇怪这个字符串是固定的 就是这个软件的exe名称和版本 
004E0CA7      mov     ecx, 0x4           
004E0CAC      mov     edx, 0x1
004E0CB1      call    004048FC             取前四位字符串 vj26
004E0CB6      push    [local.10]
004E0CB9      push    004E0D20                                        ;  UNICODE "-"
004E0CBE      push    [local.2]
004E0CC1      lea     eax, [local.11]           
004E0CC4      push    eax
004E0CC5      mov     eax, dword ptr [edi+0x4]
004E0CC8      mov     ecx, 0x5
004E0CCD      mov     edx, 0x5
004E0CD2      call    004048FC           取后 5位字符串 8v201
004E0CD7      push    [local.11]
004E0CDA      push    004E0D20                                        ;  UNICODE "-" 看到这 杠号是不是很熟悉啊,哈哈 你已经拆到了
004E0CDF      push    [local.3]
004E0CE2      mov     eax, [local.1]
004E0CE5      mov     edx, 0x6
004E0CEA      call    0040475C
004E0CEF      xor     eax, eax
004E0CF1      pop     edx
004E0CF2      pop     ecx
004E0CF3      pop     ecx
004E0CF4      mov     dword ptr fs:[eax], edx
004E0CF7      push    004E0D11
004E0CFC      lea     eax, [local.11]
004E0CFF      mov     edx, 0xA
004E0D04      call    004043E4
到最后就是 将前面出现过的字符串组装了,我就不废话了 
vj26-54948v201-A4F4   5494是将用户名经过二层算法获得的前四个字节的字符串 
A4F4是在后四位的字符串 其他的就是这个软件的 exe名称了 最后这个就是注册码了。。我们测试下。。

QQ截图20150826202348.png
注册成功,哈哈,肚子太饿了,我就偷懒下,写这个帖子花了我三个小时,边分析边写帖子,大伙给我点动力把。一路 艰难险阻是不是都过来了?是否体验到算法带来的成就感?本次教程到此结束,我是 LYQingYe 我爱雪坡姐, 感谢大家支持。




点评

Shark恒”点评说:
没啊,我说楼下的cxj98,他出了名的大黑坑,各种论坛装菜鸟。。  发表于 2015-8-27 01:32
LYQingYe”点评说:
@Shark恒 你是不是回复错了。。。  发表于 2015-8-26 23:29
Shark恒”点评说:
98是黑遍各个论坛啊,到处黑。。  发表于 2015-8-26 23:21
cxj98”点评说:
又一算法大牛的诞生,果断来膜拜的。大牛收我为徒吧。  发表于 2015-8-26 21:24

评分

参与人数 47威望 +1 HB +82 THX +37 收起 理由
longge188 + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
呼延雨薇 + 1
sjtkxy + 1 + 1
花盗睡鼠 + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
24567 + 1
ACZR + 2
Soul1999 + 1
极速菜 + 1
行行行行行行 + 1
仙仙猫 + 1
消逝的过去 + 1
纯英文 + 1
MoeRay + 1
hnymsh + 2
h112233h456 + 1
mengzhisuoliu1 + 1
lies + 1
ys1312 + 1 + 1 [快捷评语]--你将受到所有人的崇拜!
peter_king88 + 1 [快捷评语] - 分享精神,是最值得尊敬的!
勇敢的心 + 1 分享精神,是最值得尊敬的!
血色 + 3 + 1 最近比较喜欢算法,学习一下楼主的精华!
余音绕梁 + 1 + 1 算法大神诞生了,收我为坐下童子学算法吧
z14p6 + 1 + 1 评分=感恩!简单却充满爱!感谢您的作品!
329504300 + 1 + 1 评分=感恩!简单却充满爱!感谢您的作品!
火星魂淡 + 1 + 1 评分=感恩!简单却充满爱!感谢您的作品!
mzorn + 1 + 1 我级别低没法多给奖励
w408597170 + 1 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
mason珠珠 + 1 + 1 评分=感恩!简单却充满爱!感谢您的作品!
vigers + 2 + 1 学破解论坛1周年了,感谢大家的付出与关注。学破解论坛助你呼风唤雨!!!
Mr.Yang + 1 + 1 膜拜大牛
Flowerinjury + 1 + 1 评分=感恩!简单却充满爱!感谢您的作品!
starry繁星 + 6 + 1 附件形式上传教程,为后来学习者保证了资源稳定性,额外+10HB,感谢!
我要学 + 1 + 1 虽然看不懂,但是感觉好厉害
追梦 + 1 + 1 哪里有妹子啊
Zixue + 2 + 1 --------
sure + 6 + 1 是妹子不- -
Aydos + 1 + 1 评分=感恩!简单却充满爱!感谢您的作品!
虚竹 + 10 + 1 听说是妹子
kangda666 + 1 + 1 评分=感恩!简单却充满爱!感谢您的作品!
Face丶 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
Shark恒 + 1 + 20 + 1 学坡姐。。姐姐爱你
wakichen + 1 + 1 评分=感恩!简单却充满爱!感谢您的作品!
地狱使者 + 1 + 1 大神 我做你徒弟可以好啊?
JackDx + 1 + 1 评分=感恩!简单却充满爱!感谢您的作品!
ningzhonghui + 2 + 1 附件形式上传教程,为后来学习者保证了资源稳定性,额外+10HB,感谢!
Aniz + 1 评分=感恩!简单却充满爱!感谢您的作品!
泽杨 + 2 评分=感恩!简单却充满爱!感谢您的作品!

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
Aniz 发表于 2015-8-26 20:30 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
s768067871 发表于 2015-8-26 20:31 | 显示全部楼层

看到有钱我就来了谢谢楼主
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
泽杨 发表于 2015-8-26 20:36 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
易木马 发表于 2015-8-26 20:50 | 显示全部楼层

嗯,领钱走人了。
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
旧虐 发表于 2015-8-26 21:06 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
弦上云烟 发表于 2015-8-26 21:09 | 显示全部楼层

嘿嘿   我是来蹭钱的   
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
ningzhonghui 发表于 2015-8-26 21:18 | 显示全部楼层

膜拜算法牛,学习下怎么样的算法过程
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
 楼主| LYQingYe 发表于 2015-8-26 21:20 | 显示全部楼层

ningzhonghui 发表于 2015-8-26 21:18
膜拜算法牛,学习下怎么样的算法过程

数据丢失两次了,分析得不是很全了。谢谢支持
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
JackDx 发表于 2015-8-26 21:25 | 显示全部楼层

不错。学习了。
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!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

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