一个新鲜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:} 父子进程这部分挺有意思,加精鼓励一下,完善一下所有过程吧,期待更多分享。 能帮我破解一个机器码的软件么,软件包下载地址:https://t.cn/RCJeTQf破解后我给你报酬
还有一款软件E盾网络验证的下载地址https://t.cn/RCzG7Yf
破解后加我QQ205352916给你报酬 支持 一下支持 我更喜欢写成psllllgdddj%psjljaldhga的形式 本帖最后由 zbnysjwsnd8 于 2017-8-1 22:52 编辑
西交范略 发表于 2017-8-1 22:35
我更喜欢写成psllllgdddj%psjljaldhga的形式
其实有没有p都是可以的
如果有p就被换成0
然后直接返回
不过p只能在每个成员的开头吧。。
是这样么? 这个分析让我学到许多东西 感谢一下 感谢这么详细的分析过程! qqqmyj 发表于 2017-8-2 09:50
感谢这么详细的分析过程!
这也算详细吗? 学习了。很详细 Hmily 发表于 2017-8-2 16:45
父子进程这部分挺有意思,加精鼓励一下,完善一下所有过程吧,期待更多分享。
谢谢Hmily大大的鼓励。我会继续努力的