您的位置:首页 > 其它

一个简单的CM分析

2009-11-28 22:14 239 查看
这个CM没有难点,值得学习的地方就是它将用到的API函数动态解密,这样可以使Cracker无法直接在API上下断,核心算法作者写得很弱,可能只是为了练习加密API函数。

以下是解密相应的API函数:
004016D3 . 68 84404000 PUSH 破解我.00404084
004016D8 . 50 PUSH EAX
004016D9 . E8 02020000 CALL 破解我.004018E0 ; 解密kernel32.dll
004016DE . 8B3D 04304000 MOV EDI,DWORD PTR DS:[<&KERNEL32.GetModu>; kernel32.GetModuleHandleA
004016E4 . 83C4 08 ADD ESP,8
004016E7 . 8D4C24 0C LEA ECX,DWORD PTR SS:[ESP+C]
004016EB . 51 PUSH ECX ; /pModule
004016EC . FFD7 CALL EDI ; /GetModuleHandleA
004016EE . 8D5424 0C LEA EDX,DWORD PTR SS:[ESP+C]
004016F2 . 68 94404000 PUSH 破解我.00404094
004016F7 . 52 PUSH EDX
004016F8 . A3 38424000 MOV DWORD PTR DS:[404238],EAX
004016FD . E8 DE010000 CALL 破解我.004018E0 ; 解密user32.dll
00401702 . 83C4 08 ADD ESP,8
00401705 . 8D4424 0C LEA EAX,DWORD PTR SS:[ESP+C]
00401709 . 50 PUSH EAX
0040170A . FFD7 CALL EDI ; kernel32.GetModuleHandleA
0040170C . 8D4C24 0C LEA ECX,DWORD PTR SS:[ESP+C]
00401710 . 68 A0404000 PUSH 破解我.004040A0 ; ASCII "eGVrPMAcFFPGQQ"
00401715 . 51 PUSH ECX
00401716 . A3 34424000 MOV DWORD PTR DS:[404234],EAX
0040171B . E8 C0010000 CALL 破解我.004018E0 ; GetProcAddress
00401720 . A1 38424000 MOV EAX,DWORD PTR DS:[404238]

00401770 $ E8 5BFCFFFF CALL 破解我.004013D0 ; 解密GetWindowTextA
00401775 . E8 96FDFFFF CALL 破解我.00401510 ; 解密GetProcAddress
0040177A . E8 E1FDFFFF CALL 破解我.00401560 ; 解密MessageBoxA
0040177F . E8 ECFCFFFF CALL 破解我.00401470 ; 解密GetDlgItemTextA"
00401784 . E8 97FCFFFF CALL 破解我.00401420 ; 解密WriteProcessMemory"

004014C0 > /83EC 14 SUB ESP,14
004014C3 . |8D4424 00 LEA EAX,DWORD PTR SS:[ESP]
004014C7 . |68 C0404000 PUSH 破解我.004040C0 ; ASCII "mRGLrPMAGQQ"
004014CC . |50 PUSH EAX
004014CD . |E8 0E040000 CALL 破解我.004018E0 ; 解密OpenProcess
004014D2 . |8B15 38424000 MOV EDX,DWORD PTR DS:[404238] ; kernel32.7C800000
004014D8 . |8D4C24 08 LEA ECX,DWORD PTR SS:[ESP+8]

以下是Serial的算法:
00401186 . 33C0 XOR EAX,EAX
00401188 . 8A0D 44424000 MOV CL,BYTE PTR DS:[404244]
0040118E . 33C0 XOR EAX,EAX
00401190 . 84C9 TEST CL,CL
00401192 . A3 00424000 MOV DWORD PTR DS:[404200],EAX
00401197 74 15 JE SHORT 破解我.004011AE
00401199 > 8A88 45424000 MOV CL,BYTE PTR DS:[EAX+404245]
0040119F . 40 INC EAX
004011A0 . 84C9 TEST CL,CL
004011A2 .^ 75 F5 JNZ SHORT 破解我.00401199 ; 获取输入字串长度
004011A4 . 83F8 0A CMP EAX,0A ; 长度必须为10
004011A7 . A3 00424000 MOV DWORD PTR DS:[404200],EAX
004011AC 74 41 JE SHORT 破解我.004011EF ; 长度不为10则执行下面的失败语句
004011AE > 68 54404000 PUSH 破解我.00404054
004011B3 . 68 0C424000 PUSH 破解我.0040420C ; ASCII "GetCurrentProcessId"
004011B8 . E8 23070000 CALL 破解我.004018E0
004011BD . 83C4 08 ADD ESP,8
004011C0 . 6A 00 PUSH 0
004011C2 . 8D05 0C424000 LEA EAX,DWORD PTR DS:[40420C]
004011C8 . 50 PUSH EAX
004011C9 . 6A 00 PUSH 0
004011CB . 6A 00 PUSH 0
004011CD . 6A 04 PUSH 4
004011CF . A1 00304000 MOV EAX,DWORD PTR DS:[<&KERNEL32.ExitPro>
004011D4 . 8B0D 34424000 MOV ECX,DWORD PTR DS:[404234] ; USER32.77D10000
004011DA . 83C0 05 ADD EAX,5
004011DD . 50 PUSH EAX
004011DE . 68 38404000 PUSH 破解我.00404038 ; ASCII "oGQQCEG`MZc"
004011E3 . 51 PUSH ECX
004011E4 . E8 07080000 CALL 破解我.004019F0
004011E9 . 83C4 0C ADD ESP,0C
004011EC . 83C4 14 ADD ESP,14
004011EF > 0FBE3D 444240>MOVSX EDI,BYTE PTR DS:[404244] ; 取第1个字符
004011F6 . 81E7 03000080 AND EDI,80000003 ; 保留SF位与低两位
004011FC . 79 05 JNS SHORT 破解我.00401203 ; SF位为0则跳
004011FE . 4F DEC EDI ; SF位为1,EDI减1
004011FF . 83CF FC OR EDI,FFFFFFFC
00401202 . 47 INC EDI ; EDI加1
00401203 > B8 01000000 MOV EAX,1
00401208 > 0FBE90 444240>MOVSX EDX,BYTE PTR DS:[EAX+404244]
0040120F . 81E2 03000080 AND EDX,80000003
00401215 . 79 05 JNS SHORT 破解我.0040121C
00401217 . 4A DEC EDX
00401218 . 83CA FC OR EDX,FFFFFFFC
0040121B . 42 INC EDX
0040121C > 03FA ADD EDI,EDX ; 对前5个字符的每个字符的低两位进行相加
0040121E . 40 INC EAX
0040121F . 83F8 04 CMP EAX,4 ; 对输入的前5个字符进行操作
00401222 .^ 7E E4 JLE SHORT 破解我.00401208 ; 小于等于4跳
00401224 . 0FBE05 494240>MOVSX EAX,BYTE PTR DS:[404249] ; 第5个字符
0040122B . 99 CDQ
0040122C . B9 03000000 MOV ECX,3
00401231 . 893D 08424000 MOV DWORD PTR DS:[404208],EDI ; 前5个字符和保存起来
00401237 . F7F9 IDIV ECX ; 第5个字符除以3
00401239 . B9 06000000 MOV ECX,6
0040123E . 8BF2 MOV ESI,EDX
00401240 > 0FBE81 444240>MOVSX EAX,BYTE PTR DS:[ECX+404244]
00401247 . 99 CDQ
00401248 . BB 03000000 MOV EBX,3
0040124D . F7FB IDIV EBX ; 除以3
0040124F . 03F2 ADD ESI,EDX ; 将每次的余数相加,即mod 3
00401251 . 41 INC ECX
00401252 . 83F9 09 CMP ECX,9
00401255 .^ 7E E9 JLE SHORT 破解我.00401240
00401257 . 3BFE CMP EDI,ESI ; 比较前4个字符的和与后6个字符mod 3后的和
00401259 . 890D 00424000 MOV DWORD PTR DS:[404200],ECX ; 保存字符串长度10
0040125F . 8935 04424000 MOV DWORD PTR DS:[404204],ESI ; 保存后6个字符mod 3后的和
00401265 75 43 JNZ SHORT 破解我.004012AA ; 不相等就跳到失败处
00401267 . 68 70404000 PUSH 破解我.00404070
0040126C . 68 0C424000 PUSH 破解我.0040420C ; ASCII "GetCurrentProcessId"
00401271 . E8 6A060000 CALL 破解我.004018E0 ; 翻译加密的字符串

KeyGen代码:
#include <windows.h>
#include <stdio.h>

int Key(char *input)
{
int i,k[5];
for(i=0;input[i]!=0;i++)
{
k[i]=input[i]%3;
printf("%d",k[i]);
}
printf("%s/n",input);
return 0;
}

int main(int argc,char* argv[])
{
char ch[5];

printf("Input 5 chars:/n");
scanf("%s",ch);
printf("The password is:/n");
Key(ch);
system("pause");

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: