############################################################################## # # # IAR ARM ANSI C/C++ Compiler V4.42A/W32 EVALUATION 22/Sep/2009 10:21:56 # # Copyright 1999-2005 IAR Systems. All rights reserved. # # # # Cpu mode = interwork # # Endian = little # # Stack alignment = 4 # # Source file = D:\pasha\elf\_MY_PROJECT_\_NATICQ2\protect.c # # Command line = D:\pasha\elf\_MY_PROJECT_\_NATICQ2\protect.c -D # # NEWSGOLD -D ELKA -D GUI_INTERFACE -D ICONBAR -D # # kluchnik --preprocess D:\pasha\elf\_MY_PROJECT_\_NAT # # ICQ2\kluchnik\List\ -lC D:\pasha\elf\_MY_PROJECT_\_N # # ATICQ2\kluchnik\List\ -o D:\pasha\elf\_MY_PROJECT_\_ # # NATICQ2\kluchnik\Obj\ -s9 --no_unroll --cpu_mode # # arm --endian little --cpu ARM926EJ-S --stack_align # # 4 --interwork -e --fpu None --dlib_config # # "D:\pasha\Embedded Workbench 4.0 # # Evaluation2\ARM\LIB\dl5tpainl8n.h" -I # # "D:\pasha\Embedded Workbench 4.0 # # Evaluation2\ARM\INC\" --inline_threshold=2 # # List file = D:\pasha\elf\_MY_PROJECT_\_NATICQ2\kluchnik\List\pro # # tect.lst # # Object file = D:\pasha\elf\_MY_PROJECT_\_NATICQ2\kluchnik\Obj\prot # # ect.r79 # # # # # ############################################################################## D:\pasha\elf\_MY_PROJECT_\_NATICQ2\protect.c 1 #include "..\inc\swilib.h" 2 #include "md5.h" 3 4 char *_n = "\n"; 5 6 #define _LOG 7 \ In segment CODE, align 4, keep-with-next 8 static void log(char *text) 9 { \ log: \ 00000000 70402DE9 PUSH {R4-R6,LR} 10 #ifdef _LOG 11 int hFile; 12 unsigned int io_error = 0; 13 hFile = fopen("4:\\naticq_md5.txt",A_ReadWrite + A_Create + A_Append,P_READ+P_WRITE, &io_error); \ 00000004 68509FE5 LDR R5,??log_0 ;; `?` \ 00000008 04D04DE2 SUB SP,SP,#+4 \ 0000000C 0040A0E1 MOV R4,R0 \ 00000010 0010A0E3 MOV R1,#+0 \ 00000014 00108DE5 STR R1,[SP, #+0] \ 00000018 0D30A0E1 MOV R3,SP \ 0000001C 602FA0E3 MOV R2,#+384 \ 00000020 761042E2 SUB R1,R2,#+118 \ 00000024 0500A0E1 MOV R0,R5 \ 00000028 0A0000EF SWI +10 \ 0000002C 0060A0E1 MOV R6,R0 14 if(hFile!=-1) \ 00000030 010076E3 CMN R6,#+1 \ 00000034 0A00000A BEQ ??log_1 15 { 16 fwrite(hFile, (char*)text, strlen((char*)text), &io_error); \ 00000038 0400A0E1 MOV R0,R4 \ 0000003C 1B0000EF SWI +27 \ 00000040 0D30A0E1 MOV R3,SP \ 00000044 0020A0E1 MOV R2,R0 \ 00000048 0410A0E1 MOV R1,R4 \ 0000004C 0600A0E1 MOV R0,R6 \ 00000050 0C0000EF SWI +12 17 // fwrite(hFile, "\r\n", 2, &io_error); 18 fclose(hFile, &io_error); \ 00000054 0D10A0E1 MOV R1,SP \ 00000058 0600A0E1 MOV R0,R6 \ 0000005C 0D0000EF SWI +13 \ 00000060 7180BDE8 POP {R0,R4-R6,PC} 19 } 20 else 21 ShowMSG(1,(int)"Error!"); \ ??log_1: \ 00000064 141085E2 ADD R1,R5,#+20 \ 00000068 0100A0E3 MOV R0,#+1 \ 0000006C 480100EF SWI +328 22 #else 23 return; 24 #endif 25 } \ 00000070 7180BDE8 POP {R0,R4-R6,PC} ;; return \ ??log_0: \ 00000074 ........ DC32 `?` 26 27 \ In segment CODE, align 4, keep-with-next 28 char* get_imei() 29 { \ get_imei: \ 00000000 F0412DE9 PUSH {R4-R8,LR} 30 #ifdef NEWSGOLD 31 unsigned char *addr = (unsigned char *)0xA003E410; \ 00000004 ........ LDR R5,??DataTable2 ;; 0xffffffffa003e410 32 #else 33 unsigned char *addr = (unsigned char *)0xA000065C; 34 #endif 35 char *imei = malloc(17); \ 00000008 1100A0E3 MOV R0,#+17 \ 0000000C 140000EF SWI +20 \ 00000010 0040A0E1 MOV R4,R0 36 zeromem(imei,sizeof(imei)); \ 00000014 0410A0E3 MOV R1,#+4 \ 00000018 1D0100EF SWI +285 37 int i; 38 for(i=0; i<15; i++) \ 0000001C 0000A0E3 MOV R0,#+0 39 { 40 imei[i] = *addr; \ ??get_imei_0: \ 00000020 ........ LDRB R1,[R5], #+1 \ 00000024 0410C0E7 STRB R1,[R0, +R4] 41 addr++; 42 } \ 00000028 010080E2 ADD R0,R0,#+1 \ 0000002C 0F0050E3 CMP R0,#+15 \ 00000030 FAFFFFBA BLT ??get_imei_0 43 44 log("origin imei = "); log(imei); log(_n); \ 00000034 84519FE5 LDR R5,??get_imei_1 ;; `?` \ 00000060 04008DE2 ADD R0,SP,#+4 \ 00000064 0020D5E7 LDRB R2,[R5, +R0] \ 00000068 0D00A0E1 MOV R0,SP \ 0000006C 160000EF SWI +22 86 key[2*j] = a[0]; \ 00000070 0010DDE5 LDRB R1,[SP, #+0] \ 00000074 850084E0 ADD R0,R4,R5, LSL #+1 87 key[2*j+1] = a[1]; 88 } \ 00000078 015085E2 ADD R5,R5,#+1 \ 0000007C 0010C0E5 STRB R1,[R0, #+0] \ 00000080 0110DDE5 LDRB R1,[SP, #+1] \ 00000084 100055E3 CMP R5,#+16 \ 00000088 0110C0E5 STRB R1,[R0, #+1] \ 0000008C F2FFFFBA BLT ??md5_0 89 key[32] = '\0'; \ 00000090 0000A0E3 MOV R0,#+0 \ 00000094 2000C4E5 STRB R0,[R4, #+32] 90 return key; \ 00000098 0400A0E1 MOV R0,R4 \ 0000009C 6CD08DE2 ADD SP,SP,#+108 \ 000000A0 3080BDE8 POP {R4,R5,PC} ;; return \ ??md5_1: \ 000000A4 ........ DC32 `?` 91 } 92 93 \ In segment CODE, align 4, keep-with-next 94 int hex2dec(int c) 95 { 96 if(c >= '0' && c <= '9') c = c-'0'; \ hex2dec: \ 00000000 300050E3 CMP R0,#+48 \ 00000004 020000BA BLT ??hex2dec_0 \ 00000008 3A0050E3 CMP R0,#+58 \ 0000000C 300040B2 SUBLT R0,R0,#+48 \ 00000010 1EFF2FB1 BXLT LR 97 else 98 if(c >= 'a' && c <= 'f') c = 10 + (c-'a'); \ ??hex2dec_0: \ 00000014 610050E3 CMP R0,#+97 \ 00000018 1EFF2FB1 BXLT LR \ 0000001C 670050E3 CMP R0,#+103 \ 00000020 570040B2 SUBLT R0,R0,#+87 99 return c; \ 00000024 1EFF2FE1 BX LR ;; return 100 } 101 \ In segment CODE, align 4, keep-with-next 102 int get_hex_sum(char *hex)//получить сумму строки 103 { \ get_hex_sum: \ 00000000 F0402DE9 PUSH {R4-R7,LR} \ 00000004 0040A0E1 MOV R4,R0 104 int len = strlen(hex); 105 int retval=0; \ 00000008 0060A0E3 MOV R6,#+0 106 for(int i=0 ; i <= len ; i++) \ 0000000C 0070A0E3 MOV R7,#+0 \ 00000010 1B0000EF SWI +27 \ 00000014 0050B0E1 MOVS R5,R0 \ 00000018 0500004A BMI ??get_hex_sum_0 107 { 108 retval+=hex2dec(hex[i]); \ ??get_hex_sum_1: \ 0000001C 0400D7E7 LDRB R0,[R7, +R4] 109 110 /*if(hex[i] >= '0' && hex[i] <= '9') retval += hex[i]-'0'; 111 else 112 if(hex[i] >= 'a' && hex[i] <= 'f') retval += 10 + (hex[i]-'a');*/ 113 } \ 00000020 017087E2 ADD R7,R7,#+1 \ 00000024 ........ BL hex2dec \ 00000028 066080E0 ADD R6,R0,R6 \ 0000002C 070055E1 CMP R5,R7 \ 00000030 F9FFFFAA BGE ??get_hex_sum_1 114 return retval; \ ??get_hex_sum_0: \ 00000034 0600A0E1 MOV R0,R6 \ 00000038 F080BDE8 POP {R4-R7,PC} ;; return 115 } 116 \ In segment CODE, align 4, keep-with-next 117 char *getkey() 118 { \ getkey: \ 00000000 70402DE9 PUSH {R4-R6,LR} \ 00000004 24D04DE2 SUB SP,SP,#+36 119 char imei_part[4][5]; 120 char *hash_part[4]; 121 const char *imei = md5(get_imei()); \ 00000008 ........ BL get_imei \ 0000000C ........ BL md5 \ 00000010 0050A0E1 MOV R5,R0 122 char *hash = malloc(32); \ 00000014 2000A0E3 MOV R0,#+32 \ 00000018 140000EF SWI +20 \ 0000001C 0040A0E1 MOV R4,R0 123 zeromem(hash,32); \ 00000020 2010A0E3 MOV R1,#+32 \ 00000024 1D0100EF SWI +285 124 125 memcpy(imei_part[0],imei, 4); \ 00000028 0420A0E3 MOV R2,#+4 \ 0000002C 0510A0E1 MOV R1,R5 \ 00000030 10008DE2 ADD R0,SP,#+16 \ 00000034 1E0100EF SWI +286 126 memcpy(imei_part[1],imei+4, 4); \ 00000038 0420A0E3 MOV R2,#+4 \ 0000003C 041085E2 ADD R1,R5,#+4 \ 00000040 15008DE2 ADD R0,SP,#+21 \ 00000044 1E0100EF SWI +286 127 memcpy(imei_part[2],imei+8, 4); \ 00000048 0420A0E3 MOV R2,#+4 \ 0000004C 081085E2 ADD R1,R5,#+8 \ 00000050 1A008DE2 ADD R0,SP,#+26 \ 00000054 1E0100EF SWI +286 128 memcpy(imei_part[3],imei+12,4); \ 00000058 0420A0E3 MOV R2,#+4 \ 0000005C 0C1085E2 ADD R1,R5,#+12 \ 00000060 1F008DE2 ADD R0,SP,#+31 \ 00000064 1E0100EF SWI +286 129 130 for(int i=0;i<4;i++) \ 00000068 0060A0E3 MOV R6,#+0 \ 0000006C 0050A0E3 MOV R5,#+0 131 { 132 imei_part[i][4] = '\0'; \ ??getkey_0: \ 00000070 060186E0 ADD R0,R6,R6, LSL #+2 \ 00000074 10108DE2 ADD R1,SP,#+16 \ 00000078 010080E0 ADD R0,R0,R1 \ 0000007C 0450C0E5 STRB R5,[R0, #+4] 133 hash_part[i] = md5(imei_part[i]); \ 00000080 ........ BL md5 \ 00000084 0D10A0E1 MOV R1,SP \ 00000088 060181E7 STR R0,[R1, +R6, LSL #+2] 134 } \ 0000008C 016086E2 ADD R6,R6,#+1 \ 00000090 040056E3 CMP R6,#+4 \ 00000094 F5FFFFBA BLT ??getkey_0 135 136 memcpy(hash, (char*)(hash_part[0]+24), 8); \ 00000098 00009DE5 LDR R0,[SP, #+0] \ 0000009C 0820A0E3 MOV R2,#+8 \ 000000A0 181080E2 ADD R1,R0,#+24 \ 000000A4 0400A0E1 MOV R0,R4 \ 000000A8 1E0100EF SWI +286 137 memcpy(hash+8, (char*)(hash_part[1]+16), 8); \ 000000AC 04009DE5 LDR R0,[SP, #+4] \ 000000B0 0820A0E3 MOV R2,#+8 \ 000000B4 101080E2 ADD R1,R0,#+16 \ 000000B8 080084E2 ADD R0,R4,#+8 \ 000000BC 1E0100EF SWI +286 138 memcpy(hash+16, (char*)(hash_part[2]+8), 8); \ 000000C0 08009DE5 LDR R0,[SP, #+8] \ 000000C4 0820A0E3 MOV R2,#+8 \ 000000C8 081080E2 ADD R1,R0,#+8 \ 000000CC 100084E2 ADD R0,R4,#+16 \ 000000D0 1E0100EF SWI +286 139 memcpy(hash+24, (char*)hash_part[3], 8); \ 000000D4 0C109DE5 LDR R1,[SP, #+12] \ 000000D8 0820A0E3 MOV R2,#+8 \ 000000DC 180084E2 ADD R0,R4,#+24 \ 000000E0 1E0100EF SWI +286 140 hash[31] = '\0'; \ 000000E4 1F50C4E5 STRB R5,[R4, #+31] 141 142 return hash; \ 000000E8 0400A0E1 MOV R0,R4 \ 000000EC 24D08DE2 ADD SP,SP,#+36 \ 000000F0 7080BDE8 POP {R4-R6,PC} ;; return 143 } \ In segment DATA_I, align 4, align-sorted \ _n: \ 00000000 DS8 4 \ 00000004 REQUIRE `?` 144 145 int kkey[]={ \ kkey: \ 00000004 DS8 8 \ 0000000C REQUIRE `?` 146 2752, //kluchnik 147 4048 //ComeWithMe 148 }; 149 150 \ In segment CODE, align 4, keep-with-next 151 char *get_origin_imei() 152 { \ get_origin_imei: \ 00000000 10402DE9 PUSH {R4,LR} 153 char *imei = malloc(16); \ 00000004 1000A0E3 MOV R0,#+16 \ 00000008 140000EF SWI +20 \ 0000000C 0040A0E1 MOV R4,R0 154 zeromem(imei,sizeof(imei)); \ 00000010 0410A0E3 MOV R1,#+4 \ 00000014 1D0100EF SWI +285 155 int i; 156 #ifdef NEWSGOLD 157 unsigned char *addr = (unsigned char *)0xA003E410; \ 00000018 ........ LDR R0,??DataTable2 ;; 0xffffffffa003e410 158 #else 159 unsigned char *addr = (unsigned char *)0xA000065C; 160 #endif 161 162 for(i=0; i<15; i++) \ 0000001C 0010A0E3 MOV R1,#+0 163 { 164 imei[i] = *addr; \ ??get_origin_imei_0: \ 00000020 ........ LDRB R2,[R0], #+1 \ 00000024 0420C1E7 STRB R2,[R1, +R4] 165 addr++; 166 } \ 00000028 011081E2 ADD R1,R1,#+1 \ 0000002C 0F0051E3 CMP R1,#+15 \ 00000030 FAFFFFBA BLT ??get_origin_imei_0 167 imei[15] = '\0'; \ 00000034 0000A0E3 MOV R0,#+0 \ 00000038 0F00C4E5 STRB R0,[R4, #+15] 168 return imei; \ 0000003C 0400A0E1 MOV R0,R4 \ 00000040 1080BDE8 POP {R4,PC} ;; return 169 } 170 171 \ In segment CODE, align 4, keep-with-next 172 int invalidkey() 173 { \ invalidkey: \ 00000000 F04F2DE9 PUSH {R4-R11,LR} 174 int i=0; 175 char *gkey = getkey(); 176 log("getkey = "); log(gkey); log(_n); \ 00000004 78619FE5 LDR R6,??invalidkey_0 ;; `?` \ `?`: \ 00000004 C00A0000D00F DC32 2752, 4048 \ 0000 \ In segment DATA_C, align 1, align-sorted \ `?`: \ 00000000 0A00 DC8 "\012" \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 343A5C6E6174 DC8 "4:\\naticq_md5.txt" \ 6963715F6D64 \ 352E74787400 \ 00000012 0000 DC8 0, 0 \ 00000014 4572726F7221 DC8 "Error!" \ 00 \ 0000001B 00 DC8 0 \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 2530327800 DC8 "%02x" \ 00000005 000000 DC8 0, 0, 0 \ In segment DATA_C, align 4, align-sorted \ `? 12 ? 2 ? 28 ? 8 ?