一个简单的CM分析

 

 

这个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位为1EDI1

004011FF   .  83CF FC       OR EDI,FFFFFFFC

00401202   .  47            INC EDI                                  ;  EDI1

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;

}

好的,以下是一个简单的示例: 假设我们有一组数据,表示不同人员的身高和体重,保存在一个名为“data.csv”的文件中。我们想要使用 Matlab 对这些数据进行分析,得出它们的平均值、标准差等统计量,以及绘制出它们的散点图。 首先,我们需要读取数据文件。在 Matlab 中,可以使用“readtable”函数来读取 csv 文件。具体代码如下: ```matlab data = readtable('data.csv'); ``` 接下来,我们可以使用“mean”、“std”等函数来计算平均值、标准差等统计量。例如,要计算身高和体重的平均值和标准差,可以使用以下代码: ```matlab height_mean = mean(data.Height); height_std = std(data.Height); weight_mean = mean(data.Weight); weight_std = std(data.Weight); ``` 最后,我们可以使用“scatter”函数来绘制散点图。具体代码如下: ```matlab scatter(data.Height, data.Weight); xlabel('Height (cm)'); ylabel('Weight (kg)'); ``` 这样就完成了数据分析的过程。完整的代码如下: ```matlab data = readtable('data.csv'); height_mean = mean(data.Height); height_std = std(data.Height); weight_mean = mean(data.Weight); weight_std = std(data.Weight); scatter(data.Height, data.Weight); xlabel('Height (cm)'); ylabel('Weight (kg)'); ``` 当然,这只是一个简单的示例。在实际的数据分析中,可能需要更复杂的计算和可视化操作。但是,Matlab 提供了丰富的函数库和工具箱,可以帮助我们轻松地处理各种数据分析任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值