zbnysjwsnd8 发表于 2017-8-1 22:12

一个新鲜CM的追码(简略分析)

本帖最后由 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"合在一起
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 ,eax
004039C7|.68 244C4800   push cm.00484C24                         ; /tmp.tmp
004039CC|.FF75 FC       push                            ; |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 ,eax                        ;路径合成(临时目录 + tmp.tmp)
然后将一个可执行文件的字节集写到tmp.tmp中
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,                        ;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的回调函数
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 ,eax                        ; |
00403A67|.8D45 FC       lea eax,                        ; |
00403A6A|.50            push eax                                 ; |Arg1 = 00000000
00403A6B|.E8 C00A0000   call cm.00404530                         ; \cm.00404530
00403A70|.8B5D FC       mov ebx,                        ;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运行 重新点击[按钮]。
程序首先取出第一个编辑框的内容然后转换成整数
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 ,eax
00402C64|.68 04000080   push 0x80000004
00402C69|.6A 00         push 0x0
00402C6B|.8B45 F8       mov eax,
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 ,eax

程序又获取了第二个编辑框的内容 然后转换成字节集
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 ,eax
00402CB6|.68 04000080   push 0x80000004
00402CBB|.6A 00         push 0x0
00402CBD|.8B45 F0       mov eax,
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

然后调用这个函数
00402CEF|> \8D45 EC       lea eax,                        ;指向第二个编辑框的内容(字节集)的指针的指针
00402CF2|.50            push eax                                 ; /Arg3 = 0019F47C
00402CF3|.B8 8F784800   mov eax,tmp.0048788F                     ; |ASCII "out"
00402CF8|.8945 E8       mov ,eax                        ; |
00402CFB|.8D45 E8       lea eax,                        ; |ASCII "out"
00402CFE|.50            push eax                                 ; |Arg2 = 0019F47C
00402CFF|.FF75 F4       push                            ; |第一个编辑框的内容(整数型)
00402D02|.E8 12020000   call tmp.00402F19                        ; \tmp.00402F19

F7跟进去。
程序申请一个叫做 out 的窗口消息
00402F44|.FF33          push dword ptr ds:                  ;tmp.0048788F
00402F46|.B8 07000000   mov eax,0x7
00402F4B|.E8 C9280000   call tmp.00405819                        ;新申请一个窗口消息(名字叫做out)
00402F50|.3965 EC       cmp ,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 ,eax                        ;保存消息号 这里是0xC342

然后将第一个编辑框的内容转换成整数型 充当窗口句柄 判断这个窗口是否接受鼠标或键盘输入
0040300A|.FF75 08       push                            ;窗口句柄(第一个编辑框的内容(整数型))
0040300D|.B8 0C000000   mov eax,0xC
00403012|.E8 02280000   call tmp.00405819                        ;判断窗口是否允许接受键盘或鼠标输入
00403017|.3965 EC       cmp ,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
00403342|.FF75 D8       push
00403345|.FF75 E0       push                            ;tmp.00441431
00403348|.FF75 FC       push                            ;out 消息
0040334B|.FF75 08       push                            ;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处
直接找到这段代码
00404F9B|.6A 00         push 0x0                                 ; /Arg3 = 00000000
00404F9D|.8D45 EC       lea eax,                        ; |
00404FA0|.50            push eax                                 ; |Arg2 = 0019FAAC
00404FA1|.8D45 F0       lea eax,                        ; |输入的假的注册码(在第二个框中)
00404FA4|.50            push eax                                 ; |Arg1 = 0019FAAC
00404FA5|.E8 C9010000   call cm.00405173                         ; \验证

来到这里:
004051B8|> \FF75 0C       push                            ; /Arg2 = 0019FAA8
004051BB|.FF75 08       push                            ; |假的注册码
004051BE|.E8 11000000   call cm.004051D4                         ; \cm.004051D4

跟进去 来到验证CALL
这段代码调用的call是易语言的 分割文本 函数
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,
004053D1|.8B03          mov eax,dword ptr ds:               ;假的注册码
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中的文本)
0040543C|.8945 F4       mov ,eax
0040543F|.8B5D F4       mov ebx,
00405442|.E8 49CAFFFF   call cm.00401E90                         ;取出分割后的文本的成员个数(注册码2被"%"分割)
00405447|.33C9          xor ecx,ecx
00405449|.50            push eax
0040544A|.8D45 F0       lea eax,
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:,ecx
00405455|.50            |push eax
00405456|.3BC8          |cmp ecx,eax
00405458|.0F8F 99030000 |jg cm.004057F7
0040545E|.8B5D F4       |mov ebx,
00405461|.E8 DFC2FFFF   |call cm.00401745
00405466|.53            |push ebx
00405467|.51            |push ecx
00405468|.8B45 F0       |mov eax,
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 ,ebx                      ;注册码2被 "%" 分割
00405496|.8B5D D8       |mov ebx,
00405499|.8B03          |mov eax,dword ptr ds:
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:,byte ptr ds:;拷贝第n部分(n是循环的次数)
004054B4|>50            |push eax
004054B5|.8B5D EC       |mov ebx,
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 ,eax
004054C9|.B8 884C4800   |mov eax,cm.00484C88
004054CE|.50            |push eax
004054CF|.8B5D E8       |mov ebx,
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 ,eax
004054E3|.68 04000080   |push 0x80000004
004054E8|.6A 00         |push 0x0
004054EA|.8B45 EC       |mov eax,
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,
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:,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
00405536|.68 04000080   ||push 0x80000004
0040553B|.6A 00         ||push 0x0
0040553D|.8B45 EC       ||mov eax,
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 ,eax
0040555F|.8B5D FC       ||mov ebx,
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 ,ebx
00405585|.8B5D D4       ||mov ebx,
00405588|.8B03          ||mov eax,dword ptr ds:
0040558A|.50            ||push eax
0040558B|.FF75 D8       ||push
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 ,eax
004055A4|.8B5D D8       ||mov ebx,
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 ,0x0
004055B8|.0F84 35000000 ||je cm.004055F3
004055BE|.68 B24C4800   ||push cm.00484CB2                     ; /0
004055C3|.FF75 E8       ||push                          ; |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 ,eax
004055D6|.8B45 D8       ||mov eax,
004055D9|.50            ||push eax
004055DA|.8B5D E8       ||mov ebx,
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 ,eax
004055EE|.E9 37010000   ||jmp cm.0040572A
004055F3|>8B5D FC       ||mov ebx,
004055F6|.E8 95C8FFFF   ||call cm.00401E90                     ;取出asdfghjklp的长度(已经被分割 即s = 'a' s = 's'...一共十个字节)
004055FB|.33C9          ||xor ecx,ecx
004055FD|.50            ||push eax
004055FE|.8D45 E0       ||lea eax,
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:,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                         ;第二个循环的循环次数
00405628|.68 04000080   |||push 0x80000004
0040562D|.6A 00         |||push 0x0
0040562F|.8B45 EC       |||mov eax,                     ;注册码(分割后 即注册码)
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 ,eax
00405651|.8B5D FC       |||mov ebx,
00405654|.E8 ECC0FFFF   |||call cm.00401745
00405659|.53            |||push ebx
0040565A|.51            |||push ecx
0040565B|.8B45 E0       |||mov eax,
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 ,ebx
00405689|.8B5D D4       |||mov ebx,
0040568C|.8B03          |||mov eax,dword ptr ds:
0040568E|.50            |||push eax                              ;"asdfghjklp"的每个字符(执行完一个小循环就换下一个)
0040568F|.FF75 D8       |||push
00405692|.E8 0EBAFFFF   |||call cm.004010A5                      ;eax和注册码(分割后 即 注册码)一个字节比较
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 ,eax
004056A8|.8B5D D8       |||mov ebx,
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 ,0x0
004056BC|.0F84 5D000000 |||je cm.0040571F                        ;如果相等则不转移
004056C2|.68 01030080   |||push 0x80000301
004056C7|.6A 00         |||push 0x0
004056C9|.FF75 E0       |||push
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 ,eax                  ;循环次数
004056E1|.FF75 D8       |||push                      ; /Arg2 = 0077F768
004056E4|.FF75 E8       |||push                         ; |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 ,eax                  ;文本合成 LOCAL6 = LOCAL6 + 到文本(循环次数)(LOCAL6的初始值是0x00)
004056F7|.8B5D D8       |||mov ebx,
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,
0040570A|.50            |||push eax
0040570B|.8B5D E8       |||mov ebx,
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 ,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,
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 ,eax                      ;LOCAL.11 = 到字节集(LOCAL.6(整数型))
00405778|.68 05000080   |push 0x80000005
0040577D|.6A 00         |push 0x0
0040577F|.8B45 D4       |mov eax,
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 ,eax
004057A1|.8B5D D4       |mov ebx,
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                          ; /Arg2 = 00000000
004057B4|.FF75 DC       |push                         ; |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 ,eax                      ;local.9 + local.12(文本链接)
004057C7|.8B5D D0       |mov ebx,
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,
004057DA|.50            |push eax
004057DB|.8B5D DC       |mov ebx,
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 ,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,                        ;这时 eax 就是即将弹出的MessageBox的内容。

这样 流程就清楚了。
其实成功的提示信息就是用注册码2凑出来的。。。
如果将"恭喜成功"分成两部分
则有
//恭喜
第一部分:B2CFA7B9(十进制:2999953337) //对应的注册码:sllllgdddj
//成功
第二部分:A6B9C9B3(十进制:2797193651) //对应的注册码:sjljaldhga
这个对应的注册码是怎么来的我就不说了 循环里已经给出来了。{:1_918:}
将这两部分用 '%' 连接 就是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 //失败
附一张成功图:


{:1_932:}这个CM让我学到许多东西 感谢一下@xh5510 大大。{:1_931:}

说起来还是惭愧。。。玩着玩着竟然放弃了 虽然后来又玩了一遍。。。{:301_971:}

Hmily 发表于 2017-8-2 16:45

父子进程这部分挺有意思,加精鼓励一下,完善一下所有过程吧,期待更多分享。

a7107925 发表于 2017-8-22 01:47

能帮我破解一个机器码的软件么,软件包下载地址:https://t.cn/RCJeTQf破解后我给你报酬
还有一款软件E盾网络验证的下载地址https://t.cn/RCzG7Yf
破解后加我QQ205352916给你报酬

jackli7758 发表于 2017-8-1 22:32

支持 一下支持

西交范略 发表于 2017-8-1 22:35

我更喜欢写成psllllgdddj%psjljaldhga的形式

zbnysjwsnd8 发表于 2017-8-1 22:36

本帖最后由 zbnysjwsnd8 于 2017-8-1 22:52 编辑

西交范略 发表于 2017-8-1 22:35
我更喜欢写成psllllgdddj%psjljaldhga的形式
其实有没有p都是可以的
如果有p就被换成0
然后直接返回
不过p只能在每个成员的开头吧。。
是这样么?

qiaoqiaota 发表于 2017-8-2 05:15

这个分析让我学到许多东西 感谢一下

qqqmyj 发表于 2017-8-2 09:50

感谢这么详细的分析过程!

zbnysjwsnd8 发表于 2017-8-2 11:59

qqqmyj 发表于 2017-8-2 09:50
感谢这么详细的分析过程!

这也算详细吗?

onacp 发表于 2017-8-2 13:03

学习了。很详细

zbnysjwsnd8 发表于 2017-8-2 16:57

Hmily 发表于 2017-8-2 16:45
父子进程这部分挺有意思,加精鼓励一下,完善一下所有过程吧,期待更多分享。

谢谢Hmily大大的鼓励。我会继续努力的
页: [1] 2 3 4 5 6 7
查看完整版本: 一个新鲜CM的追码(简略分析)