【文章标题】: "易语言写的一个漂亮的creakme"破解分析
【文章作者】: netwind
【下载地址】: 自己搜索下载
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
1、去掉neg.
od加载程序,bp MessageBoxA下断。f9运行,断下,取消断点,堆栈如下分布:
0012F9F4 10062176 /CALL 到 MessageBoxA 来自 krnln.10062170
0012F9F8 00000000 |hOwner = NULL
0012F9FC 0040C0CF |Text = "本关你要去掉我(*^__^*) 嘻嘻",A1,"",AD,"",A1,"",AD,""
0012FA00 0040C0CB |Title = "NAG"
0012FA04 00002000 \Style = MB_OK|MB_TASKMODAL
在代码窗口 右键 转到 10062170 ,也就是跳到call MessageBoxA的地方了
1006216B . 50 push eax ; /Style
1006216C . 52 push edx ; |Title
1006216D . 51 push ecx ; |Text
1006216E . 6A 00 push 0 ; |hOwner = NULL
10062170 . FF15 A0260C10 call dword ptr [<&USER32.MessageBoxA>>; \MessageBoxA
10062176 . 5F pop edi
这个就是neg窗口 开始想改下跳转 跳过去,但发现 这段代码 在creakme.exe 释放的一个库文件里
并且api调用都是调用这里的,改库文件麻烦。
我们在 call 下一行 pop edi 下断 f9运行弹出neg ,点确定, 然后单步 f8 几下子,
程序流程就回到 creakme.exe本身的代码区域了,如下:
00472368 68 04000080 push 80000004
0047236D 6A 00 push 0
0047236F 68 CBC04000 push 0040C0CB ; ASCII "NAG"
00472374 68 01030080 push 80000301
00472379 6A 00 push 0
0047237B 68 00000000 push 0
00472380 68 04000080 push 80000004
00472385 6A 00 push 0
00472387 68 CFC04000 push 0040C0CF
0047238C 68 03000000 push 3
00472391 BB 00030000 mov ebx, 300
00472396 E8 82040000 call 0047281D
0047239B 83C4 28 add esp, 28
程序返回到了0047239b 很显然call 0047281d就是用来弹neg的,我们直接nop它 保存,第一关就过了。
2、使按钮和输入框有效
按钮和输入框由CreateWindowExA创建,其是否有效是由该函数的输入参数style的值决定。
那么我们的思路就是在改函数创建button 和 edit 控件时 把输入参数给该掉,就可以了。
cm调用的 代码都是在它释放的库文件里
我们直接修改它的库文件。
在程序开始部分简单跟几下 或者断WriteFileA你会发现 它释放如下文件
C:\Documents and Settings\netwind\Local Settings\Temp\E_4\krnln.fnr
程序调用的api都是在这个文件里的。
我们直接od加载
右键,查找所有模块间调用 找到CreateWindowExA,双击,有如下代码:
100AE0D3 |. FF50 5C call dword ptr [eax+5C]
100AE0D6 |. 85C0 test eax, eax
100AE0D8 0F85 03BF0000 jnz 100B9FE1 //这个跳转 是我修改了的 //这里始终都跳,也可以写jmp,
100AE0DE 90 nop
100AE0DF 90 nop
100AE0E0 90 nop
100AE0E1 90 nop //这里的指令执行不到,没用被我nop了
100AE0E2 90 nop
100AE0E3 90 nop
100AE0E4 90 nop
100AE0E5 90 nop
100AE0E6 90 nop
100AE0E7 90 nop
100AE0E8 |> 57 push edi
100AE0E9 |. 56 push esi
100AE0EA |. E8 F8FEFFFF call 100ADFE7
100AE0EF |. FF75 D0 push dword ptr [ebp-30] ; /lParam
100AE0F2 |. FF75 D4 push dword ptr [ebp-2C] ; |hInst
100AE0F5 |. FF75 D8 push dword ptr [ebp-28] ; |hMenu
100AE0F8 |. FF75 DC push dword ptr [ebp-24] ; |hParent
100AE0FB |. FF75 E0 push dword ptr [ebp-20] ; |Height
100AE0FE |. FF75 E4 push dword ptr [ebp-1C] ; |Width
100AE101 |. FF75 E8 push dword ptr [ebp-18] ; |Y
100AE104 |. FF75 EC push dword ptr [ebp-14] ; |X
100AE107 |. FF75 F0 push dword ptr [ebp-10] ; |Style
100AE10A |. FF75 F4 push dword ptr [ebp-C] ; |WindowName
100AE10D |. FF75 F8 push dword ptr [ebp-8] ; |Class
100AE110 |. FF75 FC push dword ptr [ebp-4] ; |ExtStyle
100AE113 |. FF15 58250C10 call dword ptr [<&USER32.CreateWindow>; \CreateWindowExA
push dword ptr [ebp-10] ; |Style 就是这个参数决定着button ,edit 是否激活的。
我们就把上面来个跳转找 到一 空白区 加几条指令 判断Style 的值,换成我们想要的值然后再跳回来。
这里是我加的 修改style参数的代码,空白空间不连续,我多来了几个跳转。
100B9FE1 817D F0 002F0>cmp dword ptr [ebp-10], 4C012F00 //这个就是原button 的style.
100B9FE8 90 nop
100B9FE9 74 17 je short 100BA002 如果是这个4c012f00就去修改了它
100B9FEB EB 55 jmp short 100BA042 如果不是就继续往下判断是不是edit的stye.
100B9FED 90 nop
100B9FEE 90 nop
100B9FEF 90 nop
。。。。。。。。。。
100BA002 C745 F0 80008>mov dword ptr [ebp-10], 50800080 //把button的style改为 50800080使有效
100BA009 ^ E9 DA40FFFF jmp 100AE0E8 //改完后返回去
。。。。。。。。。
100BA042 817D F0 80080>cmp dword ptr [ebp-10], 44010880 //到这判断是不是edit 的参数44010880
100BA049 74 3A je short 100BA085 //是就跳去修改
100BA04B ^ E9 9840FFFF jmp 100AE0E8 //不是就返回
。。。。。。。。。。。。。。。。。。。。。
100BA085 C745 F0 80000>mov dword ptr [ebp-10], 44000080 //修改edit 的style参数为4400080
100BA08C 74 4A jmp short 100BA0D8 //改完后返回 这里空间不够,多跳了一下
。。。。。。。。。。。。。
100BA0D8 ^ E9 0B40FFFF jmp 100AE0E8
好了,修改完毕 保存 。
这时 重新打开 cm 运行发现,还是没效果,其实cm每运行时 都重新释放那个库,所以,下面我们让它只生产一次。
重加载cm bp WriteFile用上面类似方法断下,有如下代码:
004013C7 . 8D85 68FDFFFF lea eax, dword ptr [ebp-298]
004013CD . 50 push eax
004013CE . E8 FD1E0000 call 004032D0
004013D3 . /E9 81000000 jmp 00401459 //这里又被我改了
004013D8 |90 nop
004013D9 |90 nop
004013DA |90 nop
004013DB |90 nop
004013DC . |53 push ebx ; /hTemplateFile
004013DD . |68 80000000 push 80 ; |Attributes = NORMAL
004013E2 . |6A 02 push 2 ; |Mode = CREATE_ALWAYS
004013E4 . |53 push ebx ; |pSecurity
004013E5 . |53 push ebx ; |ShareMode
004013E6 . |68 00000040 push 40000000 ; |Access = GENERIC_WRITE
004013EB . |50 push eax ; |FileName
004013EC . |FF15 20704000 call dword ptr [<&KERNEL32.CreateFile>; \CreateFileA
004013F2 . |83F8 FF cmp eax, -1
004013F5 . |8945 08 mov dword ptr [ebp+8], eax
004013F8 . |74 17 je short 00401411
004013FA . |8D4D D8 lea ecx, dword ptr [ebp-28]
004013FD . |53 push ebx ; /pOverlapped
004013FE . |51 push ecx ; |pBytesWritten
004013FF . |57 push edi ; |nBytesToWrite
00401400 . |56 push esi ; |Buffer
00401401 . |50 push eax ; |hFile
00401402 . |FF15 0C704000 call dword ptr [<&KERNEL32.WriteFile>>; \WriteFile
00401408 . |FF75 08 push dword ptr [ebp+8] ; /hObject
0040140B . |FF15 08704000 call dword ptr [<&KERNEL32.CloseHandl>; \CloseHandle
00401411 > |03F7 add esi, edi
00401413 . |3B75 F4 cmp esi, dword ptr [ebp-C]
00401416 .^|0F82 51FFFFFF jb 0040136D
0040141C . |385D A4 cmp byte ptr [ebp-5C], bl
0040141F . |75 0C jnz short 0040142D
00401421 > |C745 FC 20814>mov dword ptr [ebp-4], 00408120 ; ASCII "Not found the kernel library!"
00401428 . |E9 92000000 jmp 004014BF
0040142D > |8D85 6CFEFFFF lea eax, dword ptr [ebp-194]
00401433 . |50 push eax
00401434 . |8D85 68FDFFFF lea eax, dword ptr [ebp-298]
0040143A . |50 push eax
0040143B . |E8 801E0000 call 004032C0
00401440 . |8D45 A4 lea eax, dword ptr [ebp-5C]
00401443 . |50 push eax
00401444 . |8D85 68FDFFFF lea eax, dword ptr [ebp-298]
0040144A . |50 push eax
0040144B . |E8 801E0000 call 004032D0
00401450 . |83C4 10 add esp, 10
00401453 . |8D85 68FDFFFF lea eax, dword ptr [ebp-298]
00401459 > \50 push eax ; /FileName
0040145A . FF15 04704000 call dword ptr [<&KERNEL32.LoadLibrar>; \LoadLibraryA
你会发现每次他都生成一个库 再loadlibraryA,我们发现在004013CE . E8 FD1E0000 call 004032D0
执行完后eax,保存的就是要生成库的路径,那么我们直接从这jmp 到loadlibrary的地方,就避免了他每次重生产那库了。
修改完保存,再把上面修改好的库放到对应的目录
再运行cm,就一切ok了。
3、解密
od加载我们修改好的,bp MessageBoxA 断下后 堆栈如下:
0012F830 10062176 /CALL 到 MessageBoxA 来自 krnln.10062170
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课