好友
阅读权限30
听众
最后登录1970-1-1
|
本帖最后由 zbnysjwsnd8 于 2017-8-6 15:24 编辑
CM地址:http://www.52pojie.cn/thread-630662-1-1.html
因为这个CM要详细写起来实在是太麻烦 篇幅有限 我就说关键的{:1_902:}
我并不是大神 所以哪里写的太少 或者哪里有错误的地方 还请指出来。。
0x0 初探 这个cm.exe是用易语言编写(而且是静态编译)
先用Mrack师傅的E-Reverse3.12看一下程序调用的API 其中有三个我认为比较重要的API
ReadProcessMemory <==
403EB5,404316,
CallWindowProcA <==
4044C8,
CreateProcessA <== kernel32.dll
4061E6,
这三个API我认为很关键(对于分析而言)
再用E-DEBUG EVENTS探测一下信息(启动事件的地址)
C:\Users\Administrator\Desktop\cm.exe
中断地址: 0041CDCD
Start......
StartAddress: 004639D7
事件发生: 00403998 //__启动窗口_创建完毕
事件发生: 0040105B //时钟的周期事件
事件发生: 0040105B
事件发生: 0040105B
事件发生: 0040105B
事件发生: 0040105B
程序退出
......End
好了 现在用OD打开cm.exe 给00403998下断点 然后F9
程序首先取出临时目录的路径并和"tmp.tmp"合在一起
[Asm] 纯文本查看 复制代码 004039A1 |. 68 01030080 push 0x80000301
004039A6 |. 6A 00 push 0x0
004039A8 |. 68 0B000000 push 0xB
004039AD |. 68 01000000 push 0x1
004039B2 |. B8 03000000 mov eax,0x3
004039B7 |. BB A0294600 mov ebx,cm.004629A0
004039BC |. E8 E52D0000 call cm.004067A6 ; 取临时目录
004039C1 |. 83C4 10 add esp,0x10
004039C4 |. 8945 FC mov [local.1],eax
004039C7 |. 68 244C4800 push cm.00484C24 ; /tmp.tmp
004039CC |. FF75 FC push [local.1] ; |Arg1 = 00537D44 ASCII "out"
004039CF |. B9 02000000 mov ecx,0x2 ; |
004039D4 |. E8 3BE5FFFF call cm.00401F14 ; \cm.00401F14
004039D9 |. 83C4 08 add esp,0x8
004039DC |. 8945 F8 mov [local.2],eax ; 路径合成(临时目录 + tmp.tmp)
然后将一个可执行文件的字节集写到tmp.tmp中
[Asm] 纯文本查看 复制代码 004039EF |> \68 05000080 push 0x80000005
004039F4 |. 6A 00 push 0x0
004039F6 |. 68 3C4D4800 push cm.00484D3C ; 一个可执行文件
004039FB |. 68 04000080 push 0x80000004
00403A00 |. 6A 00 push 0x0
00403A02 |. 8B45 F8 mov eax,[local.2] ; tmp.tmp的全路径
00403A05 |. 85C0 test eax,eax
00403A07 |. 75 05 jnz short cm.00403A0E
00403A09 |. B8 884C4800 mov eax,cm.00484C88
00403A0E |> 50 push eax
00403A0F |. 68 02000000 push 0x2
00403A14 |. BB 007A4000 mov ebx,cm.00407A00 ; 写到文件
00403A19 |. E8 8E2D0000 call cm.004067AC
00403A1E |. 83C4 1C add esp,0x1C
然后程序设置一个SendMessage的回调函数
[Asm] 纯文本查看 复制代码 00403A31 |> \68 01000100 push 0x10001
00403A36 |. 68 00000106 push 0x6010000
00403A3B |. 68 01000152 push 0x52010001;_启动窗口
00403A40 |. 68 01000000 push 0x1
00403A45 |. BB 70694000 mov ebx,cm.00406970 ; 取窗口句柄
00403A4A |. E8 5D2D0000 call cm.004067AC
00403A4F |. 83C4 10 add esp,0x10
00403A52 |. 50 push eax ; /_启动窗口的窗口句柄
00403A53 |. E8 76000000 call cm.00403ACE ; \设置SendMessage的回调函数 地址是0x404511
00403A58 |. 6A 01 push 0x1 ; /Arg3 = 00000001
00403A5A |. 68 D45E4000 push cm.00405ED4 ; |Arg2 = 00405ED4
00403A5F |. B8 447D5300 mov eax,cm.00537D44 ; |out
00403A64 |. 8945 FC mov [local.1],eax ; |
00403A67 |. 8D45 FC lea eax,[local.1] ; |
00403A6A |. 50 push eax ; |Arg1 = 00000000
00403A6B |. E8 C00A0000 call cm.00404530 ; \cm.00404530
00403A70 |. 8B5D FC mov ebx,[local.1] ; cm.00537D44
后面的call太长了就不看了。
这个tmp.tmp是一个可执行文件。。
先打开cm.exe 用pchunter看看进程间的关系
可以发现 这个cm.exe是tmp.tmp的父进程
Mrack的神器告诉我们cm.exe有使用CreateProcessA这个api
那么给这个API下断点 然后F9。
可以发现:程序创建了一个调试进程(进程名是tmp.tmp)
0x1 分析被调试进程 因为WINDOWS下的R3调试器与被调试进程的关系是"一个萝卜一个坑" 即一个进程只能被一个调试器附加
这样我们就没办法用OllyDbg去附加tmp.tmp了
所以只能用OD载入单独分析了。。
直接F9运行 输入假码 然后给GetWindowTextA下断点 之后点击[按钮]
结果发现。。。第一次没找到按钮事件
那再F9一次 结果发现又断了下来。。。
这次回到0x402C5E处 找到函数头(0x402C3B处)
删掉GetWindowTextA 这个断点 给函数头设置断点。
F9运行 重新点击[按钮]。
程序首先取出第一个编辑框的内容然后转换成整数
[Asm] 纯文本查看 复制代码 00402C4B |. 6A FF push -0x1
00402C4D |. 6A 08 push 0x8
00402C4F |. 68 B4350116 push 0x160135B4
00402C54 |. 68 01000152 push 0x52010001
00402C59 |. E8 CD2B0000 call tmp.0040582B ; 获取第一个编辑框的内容
00402C5E |. 83C4 10 add esp,0x10
00402C61 |. 8945 F8 mov [local.2],eax
00402C64 |. 68 04000080 push 0x80000004
00402C69 |. 6A 00 push 0x0
00402C6B |. 8B45 F8 mov eax,[local.2]
00402C6E |. 85C0 test eax,eax
00402C70 |. 75 05 jnz short tmp.00402C77
00402C72 |. B8 676E4800 mov eax,tmp.00486E67
00402C77 |> 50 push eax
00402C78 |. 68 01000000 push 0x1
00402C7D |. BB B0604000 mov ebx,tmp.004060B0
00402C82 |. E8 982B0000 call tmp.0040581F ; 再转换成整数
00402C87 |. 83C4 10 add esp,0x10
00402C8A |. 8945 F4 mov [local.3],eax
程序又获取了第二个编辑框的内容 然后转换成字节集
[Asm] 纯文本查看 复制代码 00402C9D |> \6A FF push -0x1
00402C9F |. 6A 08 push 0x8
00402CA1 |. 68 B3350116 push 0x160135B3
00402CA6 |. 68 01000152 push 0x52010001
00402CAB |. E8 7B2B0000 call tmp.0040582B ; 获取第二个编辑框的内容
00402CB0 |. 83C4 10 add esp,0x10
00402CB3 |. 8945 F0 mov [local.4],eax
00402CB6 |. 68 04000080 push 0x80000004
00402CBB |. 6A 00 push 0x0
00402CBD |. 8B45 F0 mov eax,[local.4]
00402CC0 |. 85C0 test eax,eax
00402CC2 |. 75 05 jnz short tmp.00402CC9
00402CC4 |. B8 676E4800 mov eax,tmp.00486E67
00402CC9 |> 50 push eax
00402CCA |. 68 01000000 push 0x1
00402CCF |. BB 50674000 mov ebx,tmp.00406750
00402CD4 |. E8 462B0000 call tmp.0040581F ; 转换成字节集
00402CD9 |. 83C4 10 add esp,0x10
然后调用这个函数
[Asm] 纯文本查看 复制代码 00402CEF |> \8D45 EC lea eax,[local.5] ; 指向第二个编辑框的内容(字节集)的指针的指针
00402CF2 |. 50 push eax ; /Arg3 = 0019F47C
00402CF3 |. B8 8F784800 mov eax,tmp.0048788F ; |ASCII "out"
00402CF8 |. 8945 E8 mov [local.6],eax ; |
00402CFB |. 8D45 E8 lea eax,[local.6] ; |ASCII "out"
00402CFE |. 50 push eax ; |Arg2 = 0019F47C
00402CFF |. FF75 F4 push [local.3] ; |第一个编辑框的内容(整数型)
00402D02 |. E8 12020000 call tmp.00402F19 ; \tmp.00402F19
F7跟进去。
程序申请一个叫做 out 的窗口消息
[Asm] 纯文本查看 复制代码 00402F44 |. FF33 push dword ptr ds:[ebx] ; tmp.0048788F
00402F46 |. B8 07000000 mov eax,0x7
00402F4B |. E8 C9280000 call tmp.00405819 ; 新申请一个窗口消息(名字叫做out)
00402F50 |. 3965 EC cmp [local.5],esp
00402F53 |. 74 0D je short tmp.00402F62
00402F55 |. 68 06000000 push 0x6
00402F5A |. E8 B4280000 call tmp.00405813
00402F5F |. 83C4 04 add esp,0x4
00402F62 |> 8945 FC mov [local.1],eax ; 保存消息号 这里是0xC342
然后将第一个编辑框的内容转换成整数型 充当窗口句柄 判断这个窗口是否接受鼠标或键盘输入
[Asm] 纯文本查看 复制代码 0040300A |. FF75 08 push [arg.1] ; 窗口句柄(第一个编辑框的内容(整数型))
0040300D |. B8 0C000000 mov eax,0xC
00403012 |. E8 02280000 call tmp.00405819 ; 判断窗口是否允许接受键盘或鼠标输入
00403017 |. 3965 EC cmp [local.5],esp
0040301A |. 74 0D je short tmp.00403029
0040301C |. 68 06000000 push 0x6
00403021 |. E8 ED270000 call tmp.00405813
00403026 |. 83C4 04 add esp,0x4
00403029 |> 85C0 test eax,eax
0040302B |. 0F84 8E030000 je tmp.004033BF ; 不允许则返回
如果返回的话 就直接失败。 所以这里不能让它返回
联合前面cm.exe新申请的SendMessage回调函数 那这个就可能是填写父进程(cm.exe)的窗口句柄
用od打开cm.exe 然后直接F9运行(要出现窗口) 找到这个cm.exe的窗口句柄 转换成十进制。
那么把1183644输入过去。
看看这个je会不会跳走 这次就没有跳走。
那么继续往下
然后程序向cm.exe发送了窗口消息(中间一大部分操作我直接略过了。) 然后弹出了一个MessageBox
[Asm] 纯文本查看 复制代码 00403342 |. FF75 D8 push [local.10]
00403345 |. FF75 E0 push [local.8] ; tmp.00441431
00403348 |. FF75 FC push [local.1] ; out 消息
0040334B |. FF75 08 push [arg.1] ; cm.exe的窗口句柄
0040334E |. B8 0E000000 mov eax,0xE
00403353 |. E8 C1240000 call tmp.00405819 ; 发送消息
之前cm.exe申请了一个SendMessage的回调函数 因为xh5510大佬提醒我 说"关键部分在cm.exe" 所以 在这个消息发送以后 cm.exe调用之前设置的回调函数应该是关键部分
0x2 再看调试器 找出注册码 回到cm.exe 直接给0x404511下断点 然后之前运行cm.exe时弹出的注册窗口的第一个输入框中输入 之前用pchunter探测到的cm.exe的主窗口句柄(十进制:我这里是1183644) 第二个输入框随便输入点东西 点击[按钮]。
直接断了下来
这里只有一个call 那么直接跟进去。
一看call里面 一堆代码。。。
那么就用快捷点的方法 直接定位。
因为被调试进程和调试器要交换数据 而cm.exe又有调用ReadProcessMemory 那么给ReadProcessMemory下断点 然后F9运行试试。。。
断了下来。。
结果两次都在一个地方返回 而且都在这个call里面。。
看样子这个API断点并不适用
那换一个API 试试...这个CallWindowProcA(在刚刚在0x404511断下时下断点 然后按F9 就会在这里断下来)
注意这个函数发送的消息是NULL。。
蛮可疑的
在这个回调函数地址下断点然后F9试试。
这个函数也只有一个call 直接跟进去(我分析的时候 这个call就是验证注册码的call)
跟进去以后还有一个。。。来到00404EF3处
直接找到这段代码
[Asm] 纯文本查看 复制代码 00404F9B |. 6A 00 push 0x0 ; /Arg3 = 00000000
00404F9D |. 8D45 EC lea eax,[local.5] ; |
00404FA0 |. 50 push eax ; |Arg2 = 0019FAAC
00404FA1 |. 8D45 F0 lea eax,[local.4] ; |输入的假的注册码(在第二个框中)
00404FA4 |. 50 push eax ; |Arg1 = 0019FAAC
00404FA5 |. E8 C9010000 call cm.00405173 ; \验证
来到这里:
[Asm] 纯文本查看 复制代码 004051B8 |> \FF75 0C push [arg.2] ; /Arg2 = 0019FAA8
004051BB |. FF75 08 push [arg.1] ; |假的注册码
004051BE |. E8 11000000 call cm.004051D4 ; \cm.004051D4
跟进去 来到验证CALL
这段代码调用的call是易语言的 分割文本 函数
[Asm] 纯文本查看 复制代码 004053B5 |. 6A 00 push 0x0
004053B7 |. 6A 00 push 0x0
004053B9 |. 6A 00 push 0x0
004053BB |. 68 04000080 push 0x80000004
004053C0 |. 6A 00 push 0x0
004053C2 |. 68 8E7D5300 push cm.00537D8E ; %
004053C7 |. 68 04000080 push 0x80000004
004053CC |. 6A 00 push 0x0
004053CE |. 8B5D 08 mov ebx,[arg.1]
004053D1 |. 8B03 mov eax,dword ptr ds:[ebx] ; 假的注册码
004053D3 |. 85C0 test eax,eax
004053D5 |. 75 05 jnz short cm.004053DC
004053D7 |. B8 884C4800 mov eax,cm.00484C88
004053DC |> 50 push eax
004053DD |. 68 03000000 push 0x3
004053E2 |. BB 50754000 mov ebx,cm.00407550
004053E7 |. E8 C0130000 call cm.004067AC ; 文本分割
004053EC |. 83C4 28 add esp,0x28
这里面被分割的文本就是我们输入的假注册码 用作分割的文本就是"%"
保险起见 我们换一个注册码 比如说:abcdefgh%123456
输入好后 来到004053EC处 观察一下eax寄存器中指向的地址
观察一下0076EFD8的内容和0077F6B8的内容
可以发现一个是abcdefgh另一个是123456
继续往下。
来到一个大循环中
这个循环是有关联的 所以我就直接发吧。。。必要的注释我已经标记了 其中 注册码2是指第二个输入框中的文本(第一部分是指0076EFD8中的文本 第二部分则是0077F6B8中的文本)
[Asm] 纯文本查看 复制代码 0040543C |. 8945 F4 mov [local.3],eax
0040543F |. 8B5D F4 mov ebx,[local.3]
00405442 |. E8 49CAFFFF call cm.00401E90 ; 取出分割后的文本的成员个数(注册码2被"%"分割)
00405447 |. 33C9 xor ecx,ecx
00405449 |. 50 push eax
0040544A |. 8D45 F0 lea eax,[local.4]
0040544D |. 8BD8 mov ebx,eax
0040544F |. 58 pop eax
00405450 |> 41 /inc ecx
00405451 |. 51 |push ecx
00405452 |. 53 |push ebx
00405453 |. 890B |mov dword ptr ds:[ebx],ecx
00405455 |. 50 |push eax
00405456 |. 3BC8 |cmp ecx,eax
00405458 |. 0F8F 99030000 |jg cm.004057F7
0040545E |. 8B5D F4 |mov ebx,[local.3]
00405461 |. E8 DFC2FFFF |call cm.00401745
00405466 |. 53 |push ebx
00405467 |. 51 |push ecx
00405468 |. 8B45 F0 |mov eax,[local.4]
0040546B |. 48 |dec eax
0040546C |. 79 0D |jns short cm.0040547B
0040546E |. 68 04000000 |push 0x4
00405473 |. E8 22130000 |call cm.0040679A
00405478 |. 83C4 04 |add esp,0x4
0040547B |> 59 |pop ecx
0040547C |. 5B |pop ebx
0040547D |. 3BC1 |cmp eax,ecx
0040547F |. 7C 0D |jl short cm.0040548E
00405481 |. 68 01000000 |push 0x1
00405486 |. E8 0F130000 |call cm.0040679A
0040548B |. 83C4 04 |add esp,0x4
0040548E |> C1E0 02 |shl eax,0x2
00405491 |. 03D8 |add ebx,eax
00405493 |. 895D D8 |mov [local.10],ebx ; 注册码2被 "%" 分割
00405496 |. 8B5D D8 |mov ebx,[local.10]
00405499 |. 8B03 |mov eax,dword ptr ds:[ebx]
0040549B |. 85C0 |test eax,eax
0040549D |. 74 15 |je short cm.004054B4
0040549F |. 50 |push eax
004054A0 |. 8BD8 |mov ebx,eax
004054A2 |. E8 02CAFFFF |call cm.00401EA9 ; 取出第一部分的长度
004054A7 |. 40 |inc eax ; 长度 + 1
004054A8 |. 50 |push eax
004054A9 |. E8 E6120000 |call cm.00406794 ; 注册码2
004054AE |. 59 |pop ecx
004054AF |. 5E |pop esi ; cm.00484CB3
004054B0 |. 8BF8 |mov edi,eax
004054B2 |. F3:A4 |rep movs byte ptr es:[edi],byte ptr ds:[esi]; 拷贝第n部分(n是循环的次数)
004054B4 |> 50 |push eax
004054B5 |. 8B5D EC |mov ebx,[local.5]
004054B8 |. 85DB |test ebx,ebx
004054BA |. 74 09 |je short cm.004054C5
004054BC |. 53 |push ebx
004054BD |. E8 CC120000 |call cm.0040678E
004054C2 |. 83C4 04 |add esp,0x4
004054C5 |> 58 |pop eax
004054C6 |. 8945 EC |mov [local.5],eax
004054C9 |. B8 884C4800 |mov eax,cm.00484C88
004054CE |. 50 |push eax
004054CF |. 8B5D E8 |mov ebx,[local.6]
004054D2 |. 85DB |test ebx,ebx
004054D4 |. 74 09 |je short cm.004054DF
004054D6 |. 53 |push ebx
004054D7 |. E8 B2120000 |call cm.0040678E
004054DC |. 83C4 04 |add esp,0x4
004054DF |> 58 |pop eax
004054E0 |. 8945 E8 |mov [local.6],eax
004054E3 |. 68 04000080 |push 0x80000004
004054E8 |. 6A 00 |push 0x0
004054EA |. 8B45 EC |mov eax,[local.5]
004054ED |. 85C0 |test eax,eax
004054EF |. 75 05 |jnz short cm.004054F6
004054F1 |. B8 884C4800 |mov eax,cm.00484C88
004054F6 |> 50 |push eax
004054F7 |. 68 01000000 |push 0x1
004054FC |. BB A0694000 |mov ebx,cm.004069A0
00405501 |. E8 A6120000 |call cm.004067AC ; 取第n部分文本长度
00405506 |. 83C4 10 |add esp,0x10
00405509 |. 33C9 |xor ecx,ecx
0040550B |. 50 |push eax
0040550C |. 8D45 E4 |lea eax,[local.7]
0040550F |. 8BD8 |mov ebx,eax
00405511 |. 58 |pop eax
00405512 |> 41 |/inc ecx
00405513 |. 51 ||push ecx
00405514 |. 53 ||push ebx
00405515 |. 890B ||mov dword ptr ds:[ebx],ecx
00405517 |. 50 ||push eax
00405518 |. 3BC8 ||cmp ecx,eax
0040551A |. 0F8F 12020000 ||jg cm.00405732
00405520 |. 68 01030080 ||push 0x80000301
00405525 |. 6A 00 ||push 0x0
00405527 |. 68 01000000 ||push 0x1
0040552C |. 68 01030080 ||push 0x80000301
00405531 |. 6A 00 ||push 0x0
00405533 |. FF75 E4 ||push [local.7]
00405536 |. 68 04000080 ||push 0x80000004
0040553B |. 6A 00 ||push 0x0
0040553D |. 8B45 EC ||mov eax,[local.5]
00405540 |. 85C0 ||test eax,eax
00405542 |. 75 05 ||jnz short cm.00405549
00405544 |. B8 884C4800 ||mov eax,cm.00484C88
00405549 |> 50 ||push eax
0040554A |. 68 03000000 ||push 0x3
0040554F |. BB 706A4000 ||mov ebx,cm.00406A70
00405554 |. E8 53120000 ||call cm.004067AC ; 取出第n部分的一个字节
00405559 |. 83C4 28 ||add esp,0x28
0040555C |. 8945 D8 ||mov [local.10],eax
0040555F |. 8B5D FC ||mov ebx,[local.1]
00405562 |. E8 DEC1FFFF ||call cm.00401745 ; 重定义数组
00405567 |. B8 09000000 ||mov eax,0x9
0040556C |. 3BC1 ||cmp eax,ecx
0040556E |. 7C 0D ||jl short cm.0040557D
00405570 |. 68 01000000 ||push 0x1
00405575 |. E8 20120000 ||call cm.0040679A
0040557A |. 83C4 04 ||add esp,0x4
0040557D |> C1E0 02 ||shl eax,0x2
00405580 |. 03D8 ||add ebx,eax
00405582 |. 895D D4 ||mov [local.11],ebx
00405585 |. 8B5D D4 ||mov ebx,[local.11]
00405588 |. 8B03 ||mov eax,dword ptr ds:[ebx]
0040558A |. 50 ||push eax
0040558B |. FF75 D8 ||push [local.10]
0040558E |. E8 12BBFFFF ||call cm.004010A5 ; 再和p比较
00405593 |. 83C4 08 ||add esp,0x8
00405596 |. 83F8 00 ||cmp eax,0x0
00405599 |. B8 00000000 ||mov eax,0x0
0040559E |. 0f94c0 ||sete al
004055A1 |. 8945 D0 ||mov [local.12],eax
004055A4 |. 8B5D D8 ||mov ebx,[local.10]
004055A7 |. 85DB ||test ebx,ebx
004055A9 |. 74 09 ||je short cm.004055B4
004055AB |. 53 ||push ebx
004055AC |. E8 DD110000 ||call cm.0040678E
004055B1 |. 83C4 04 ||add esp,0x4
004055B4 |> 837D D0 00 ||cmp [local.12],0x0
004055B8 |. 0F84 35000000 ||je cm.004055F3
004055BE |. 68 B24C4800 ||push cm.00484CB2 ; /0
004055C3 |. FF75 E8 ||push [local.6] ; |Arg1 = 0077F7F8
004055C6 |. B9 02000000 ||mov ecx,0x2 ; |
004055CB |. E8 44C9FFFF ||call cm.00401F14 ; \cm.00401F14
004055D0 |. 83C4 08 ||add esp,0x8 ; 相等则用'0'替换
004055D3 |. 8945 D8 ||mov [local.10],eax
004055D6 |. 8B45 D8 ||mov eax,[local.10]
004055D9 |. 50 ||push eax
004055DA |. 8B5D E8 ||mov ebx,[local.6]
004055DD |. 85DB ||test ebx,ebx
004055DF |. 74 09 ||je short cm.004055EA
004055E1 |. 53 ||push ebx
004055E2 |. E8 A7110000 ||call cm.0040678E
004055E7 |. 83C4 04 ||add esp,0x4
004055EA |> 58 ||pop eax
004055EB |. 8945 E8 ||mov [local.6],eax
004055EE |. E9 37010000 ||jmp cm.0040572A
004055F3 |> 8B5D FC ||mov ebx,[local.1]
004055F6 |. E8 95C8FFFF ||call cm.00401E90 ; 取出asdfghjklp的长度(已经被分割 即s[1] = 'a' s[2] = 's'...一共十个字节)
004055FB |. 33C9 ||xor ecx,ecx
004055FD |. 50 ||push eax
004055FE |. 8D45 E0 ||lea eax,[local.8]
00405601 |. 8BD8 ||mov ebx,eax
00405603 |. 58 ||pop eax
00405604 |> 41 ||/inc ecx
00405605 |. 51 |||push ecx
00405606 |. 53 |||push ebx
00405607 |. 890B |||mov dword ptr ds:[ebx],ecx
00405609 |. 50 |||push eax
0040560A |. 3BC8 |||cmp ecx,eax
0040560C |. 0F8F 15010000 |||jg cm.00405727 ; 小循环十次
00405612 |. 68 01030080 |||push 0x80000301
00405617 |. 6A 00 |||push 0x0
00405619 |. 68 01000000 |||push 0x1
0040561E |. 68 01030080 |||push 0x80000301
00405623 |. 6A 00 |||push 0x0
00405625 |. FF75 E4 |||push [local.7] ; 第二个循环的循环次数
00405628 |. 68 04000080 |||push 0x80000004
0040562D |. 6A 00 |||push 0x0
0040562F |. 8B45 EC |||mov eax,[local.5] ; 注册码(分割后 即注册码[n])
00405632 |. 85C0 |||test eax,eax
00405634 |. 75 05 |||jnz short cm.0040563B
00405636 |. B8 884C4800 |||mov eax,cm.00484C88
0040563B |> 50 |||push eax
0040563C |. 68 03000000 |||push 0x3
00405641 |. BB 706A4000 |||mov ebx,cm.00406A70
00405646 |. E8 61110000 |||call cm.004067AC ; 取出一个字节
0040564B |. 83C4 28 |||add esp,0x28
0040564E |. 8945 D8 |||mov [local.10],eax
00405651 |. 8B5D FC |||mov ebx,[local.1]
00405654 |. E8 ECC0FFFF |||call cm.00401745
00405659 |. 53 |||push ebx
0040565A |. 51 |||push ecx
0040565B |. 8B45 E0 |||mov eax,[local.8]
0040565E |. 48 |||dec eax
0040565F |. 79 0D |||jns short cm.0040566E
00405661 |. 68 04000000 |||push 0x4
00405666 |. E8 2F110000 |||call cm.0040679A
0040566B |. 83C4 04 |||add esp,0x4
0040566E |> 59 |||pop ecx
0040566F |. 5B |||pop ebx
00405670 |. 3BC1 |||cmp eax,ecx
00405672 |. 7C 0D |||jl short cm.00405681
00405674 |. 68 01000000 |||push 0x1
00405679 |. E8 1C110000 |||call cm.0040679A
0040567E |. 83C4 04 |||add esp,0x4
00405681 |> C1E0 02 |||shl eax,0x2
00405684 |. 03D8 |||add ebx,eax
00405686 |. 895D D4 |||mov [local.11],ebx
00405689 |. 8B5D D4 |||mov ebx,[local.11]
0040568C |. 8B03 |||mov eax,dword ptr ds:[ebx]
0040568E |. 50 |||push eax ; "asdfghjklp"的每个字符(执行完一个小循环就换下一个)
0040568F |. FF75 D8 |||push [local.10]
00405692 |. E8 0EBAFFFF |||call cm.004010A5 ; eax和注册码(分割后 即 注册码[n])一个字节比较
00405697 |. 83C4 08 |||add esp,0x8
0040569A |. 83F8 00 |||cmp eax,0x0
0040569D |. B8 00000000 |||mov eax,0x0
004056A2 |. 0f94c0 |||sete al
004056A5 |. 8945 D0 |||mov [local.12],eax
004056A8 |. 8B5D D8 |||mov ebx,[local.10]
004056AB |. 85DB |||test ebx,ebx
004056AD |. 74 09 |||je short cm.004056B8
004056AF |. 53 |||push ebx
004056B0 |. E8 D9100000 |||call cm.0040678E
004056B5 |. 83C4 04 |||add esp,0x4
004056B8 |> 837D D0 00 |||cmp [local.12],0x0
004056BC |. 0F84 5D000000 |||je cm.0040571F ; 如果相等则不转移
004056C2 |. 68 01030080 |||push 0x80000301
004056C7 |. 6A 00 |||push 0x0
004056C9 |. FF75 E0 |||push [local.8]
004056CC |. 68 01000000 |||push 0x1
004056D1 |. BB F0784000 |||mov ebx,cm.004078F0
004056D6 |. E8 D1100000 |||call cm.004067AC ; 循环次数到文本
004056DB |. 83C4 10 |||add esp,0x10
004056DE |. 8945 D8 |||mov [local.10],eax ; 循环次数
004056E1 |. FF75 D8 |||push [local.10] ; /Arg2 = 0077F768
004056E4 |. FF75 E8 |||push [local.6] ; |Arg1 = 0077F7F8
004056E7 |. B9 02000000 |||mov ecx,0x2 ; |
004056EC |. E8 23C8FFFF |||call cm.00401F14 ; \cm.00401F14
004056F1 |. 83C4 08 |||add esp,0x8
004056F4 |. 8945 D4 |||mov [local.11],eax ; 文本合成 LOCAL6 = LOCAL6 + 到文本(循环次数)(LOCAL6的初始值是0x00)
004056F7 |. 8B5D D8 |||mov ebx,[local.10]
004056FA |. 85DB |||test ebx,ebx
004056FC |. 74 09 |||je short cm.00405707
004056FE |. 53 |||push ebx
004056FF |. E8 8A100000 |||call cm.0040678E
00405704 |. 83C4 04 |||add esp,0x4
00405707 |> 8B45 D4 |||mov eax,[local.11]
0040570A |. 50 |||push eax
0040570B |. 8B5D E8 |||mov ebx,[local.6]
0040570E |. 85DB |||test ebx,ebx
00405710 |. 74 09 |||je short cm.0040571B
00405712 |. 53 |||push ebx
00405713 |. E8 76100000 |||call cm.0040678E
00405718 |. 83C4 04 |||add esp,0x4
0040571B |> 58 |||pop eax
0040571C |. 8945 E8 |||mov [local.6],eax
0040571F |> 58 |||pop eax
00405720 |. 5B |||pop ebx
00405721 |. 59 |||pop ecx
00405722 |.^ E9 DDFEFFFF ||\jmp cm.00405604
00405727 |> 83C4 0C ||add esp,0xC
0040572A |> 58 ||pop eax
0040572B |. 5B ||pop ebx
0040572C |. 59 ||pop ecx
0040572D |.^ E9 E0FDFFFF |\jmp cm.00405512
00405732 |> 83C4 0C |add esp,0xC
00405735 |. 68 04000080 |push 0x80000004
0040573A |. 6A 00 |push 0x0
0040573C |. 8B45 E8 |mov eax,[local.6]
0040573F |. 85C0 |test eax,eax
00405741 |. 75 05 |jnz short cm.00405748
00405743 |. B8 884C4800 |mov eax,cm.00484C88
00405748 |> 50 |push eax
00405749 |. 68 01000000 |push 0x1
0040574E |. BB 40704000 |mov ebx,cm.00407040
00405753 |. E8 54100000 |call cm.004067AC ; 将LOCAL6转换到整数
00405758 |. 83C4 10 |add esp,0x10
0040575B |. 68 01030080 |push 0x80000301
00405760 |. 6A 00 |push 0x0
00405762 |. 50 |push eax
00405763 |. 68 01000000 |push 0x1
00405768 |. BB E0764000 |mov ebx,cm.004076E0
0040576D |. E8 3A100000 |call cm.004067AC ; 再转换成字节集
00405772 |. 83C4 10 |add esp,0x10
00405775 |. 8945 D4 |mov [local.11],eax ; LOCAL.11 = 到字节集(LOCAL.6(整数型))
00405778 |. 68 05000080 |push 0x80000005
0040577D |. 6A 00 |push 0x0
0040577F |. 8B45 D4 |mov eax,[local.11]
00405782 |. 85C0 |test eax,eax
00405784 |. 75 05 |jnz short cm.0040578B
00405786 |. B8 4E4C4800 |mov eax,cm.00484C4E
0040578B |> 50 |push eax
0040578C |. 68 01000000 |push 0x1
00405791 |. BB F0784000 |mov ebx,cm.004078F0
00405796 |. E8 11100000 |call cm.004067AC ; 再转换成文本
0040579B |. 83C4 10 |add esp,0x10
0040579E |. 8945 D0 |mov [local.12],eax
004057A1 |. 8B5D D4 |mov ebx,[local.11]
004057A4 |. 85DB |test ebx,ebx
004057A6 |. 74 09 |je short cm.004057B1
004057A8 |. 53 |push ebx
004057A9 |. E8 E00F0000 |call cm.0040678E
004057AE |. 83C4 04 |add esp,0x4
004057B1 |> FF75 D0 |push [local.12] ; /Arg2 = 00000000
004057B4 |. FF75 DC |push [local.9] ; |Arg1 = 00000000
004057B7 |. B9 02000000 |mov ecx,0x2 ; |
004057BC |. E8 53C7FFFF |call cm.00401F14 ; \cm.00401F14
004057C1 |. 83C4 08 |add esp,0x8
004057C4 |. 8945 CC |mov [local.13],eax ; local.9 + local.12(文本链接)
004057C7 |. 8B5D D0 |mov ebx,[local.12]
004057CA |. 85DB |test ebx,ebx
004057CC |. 74 09 |je short cm.004057D7
004057CE |. 53 |push ebx
004057CF |. E8 BA0F0000 |call cm.0040678E
004057D4 |. 83C4 04 |add esp,0x4
004057D7 |> 8B45 CC |mov eax,[local.13]
004057DA |. 50 |push eax
004057DB |. 8B5D DC |mov ebx,[local.9]
004057DE |. 85DB |test ebx,ebx
004057E0 |. 74 09 |je short cm.004057EB
004057E2 |. 53 |push ebx
004057E3 |. E8 A60F0000 |call cm.0040678E
004057E8 |. 83C4 04 |add esp,0x4
004057EB |> 58 |pop eax
004057EC |. 8945 DC |mov [local.9],eax ; 将LOCAL13的值保存到LOCAL9中
004057EF |. 58 |pop eax
004057F0 |. 5B |pop ebx
004057F1 |. 59 |pop ecx
004057F2 |.^ E9 59FCFFFF \jmp cm.00405450
004057F7 |> 83C4 0C add esp,0xC
004057FA |. 8B45 DC mov eax,[local.9] ; 这时 eax 就是即将弹出的MessageBox的内容。
这样 流程就清楚了。
其实成功的提示信息就是用注册码2凑出来的。。。
如果将"恭喜成功"分成两部分
则有
//恭喜
第一部分:B2CFA7B9(十进制:2999953337) //对应的注册码:sllllgdddj
//成功
第二部分:A6B9C9B3(十进制:2797193651) //对应的注册码:sjljaldhga
这个对应的注册码是怎么来的我就不说了 循环里已经给出来了。
将这两部分用 '%' 连接 就是sllllgdddj%sjljaldhga
因此注册码2就是sllllgdddj%sjljaldhga(第一部分只能存在一个 第二部分只能存在一个)
补充一下:
在注册码2(基础上)的任意部分开头加入多少p都无所谓。因为循环中写出来了 如果和p相等就直接返回继续循环(不会和asdfghjklp比较)。
在注册码2(基础上)的任意部分加入任意字符(不能和asdfghjklp有相同字符 如果加入'%' 那么必须以'%'分割后的文本和"asdfghjklp"没有相同字符(不包括正确的两部分))都可成功。
比如:
sllllgdddj%sjljaldhga //成功
sllllgdddj%sjljaldhga% //成功
%sllllgdddj%sjljaldhga //成功
滑稽sllllgdddj%sjljaldhga滑稽 //成功
滑稽sllllgdddj%sjljaldhga //成功
sllllgdddj%sjljaldhga滑稽 //成功
测试%sllllgdddj%sjljaldhga //成功
测试%测试sllllgdddj%sjljaldhga //成功
%测试sllllgdddj%sjljaldhga //成功
a%测试sllllgdddj%sjljaldhga //失败
测试%asllllgdddj%sjljaldhga //失败
aa%aasllllgdddj%sjljaldhga //失败
s%llllgdddj%sjljaldhga //失败
sllllgdddj%sjljaldhga%sllllgdddj%sjljaldhga //失败
附一张成功图:
这个CM让我学到许多东西 感谢一下@xh5510 大大。{:1_931:}
说起来还是惭愧。。。玩着玩着竟然放弃了 虽然后来又玩了一遍。。。 |
免费评分
-
查看全部评分
本帖被以下淘专辑推荐:
- · 优秀逆向文|主题: 238, 订阅: 93
- · 精品教程|主题: 187, 订阅: 49
- · 脱壳追码|主题: 28, 订阅: 11
|