adelbak Posted February 26, 2018 Share Posted February 26, 2018 (edited) Please, Can anyone translate this C small function to autoit MTK IMEI Algorithm: expandcollapse popupint calc_imei(char inp_imei[15], char out_imei[12]) { char out_mask[12] = {0xAB, 0xA0, 0x6F, 0x2F, 0x1F, 0x1E, 0x9A, 0x45, 0x0, 0x0, 0x0, 0x0}; int i=0, j=0; for (i=0, j=0; i < 15; i++, j++) { if (inp_imei[i] < '0' || inp_imei[i] > '9') { return 1; } out_imei[j] = (inp_imei[i] - '0'); if (i >= 14) break; if (inp_imei[i+1] < '0' || inp_imei[i+1] > '9') { return 1; } out_imei[j] += ((inp_imei[i+1] - '0') << 4); out_imei[j] = out_imei[j] ^ out_mask[j]; i++; } out_imei[j] = out_imei[j] ^ out_mask[j]; out_imei[8] = 0x57; //Может быть и 0x0, ни на что не влияет out_imei[9] = 0xDB; //Может быть и 0x0, ни на что не влияет out_imei[10] = out_imei[11] = 0; for (i = 0; i < 10; i++) { if (i & 0x1) { out_imei[11] += out_imei[i]; } else { out_imei[10] += out_imei[i]; } } return 0; } you can test EXE (Down it from attach) THANKS Edited March 1, 2018 by Jos Removed attachment due to too many (false?) virus warnings Link to comment Share on other sites More sharing options...
Earthshine Posted February 26, 2018 Share Posted February 26, 2018 I don’t think folks are going to want to do your work for you. You would not learn anything. Autoit has arrays and for loops so this is not really that hard. Post what you tried so far for better results adelbak 1 My resources are limited. You must ask the right questions Link to comment Share on other sites More sharing options...
adelbak Posted February 26, 2018 Author Share Posted February 26, 2018 believe me i tried many times but i cant i have problems with loop Link to comment Share on other sites More sharing options...
Earthshine Posted February 26, 2018 Share Posted February 26, 2018 (edited) Can you post your script so others can also look at it and help? Even if it does not work Edited February 26, 2018 by Earthshine adelbak 1 My resources are limited. You must ask the right questions Link to comment Share on other sites More sharing options...
adelbak Posted February 26, 2018 Author Share Posted February 26, 2018 Im coding MTK imei repair tool, and i need this algo to generate imei file and inject it NVRAM file This algo convert IMEI to HEX Examble from original tool: imei.exe 531302165213560 501939357823635 This generate New IMEI in file (MP0B_001_NEW) with this content: ‘ON:/ےEWغ}.®1ü|ک,¬@WغEô IN hex: 9E 91 4F 4E 3A 2F FF 45 57 DB 7D 2E AE 31 FC 7C 98 2C AC 40 57 DB 45 F4 Link to comment Share on other sites More sharing options...
adelbak Posted February 26, 2018 Author Share Posted February 26, 2018 Let's Start with this Func calc_imei($inp_imei) Local $out_mask[12] = [0xAB, 0xA0, 0x6F, 0x2F, 0x1F, 0x1E, 0x9A, 0x45, 0x0, 0x0, 0x0, 0x0] For 1 To 15 ;Your code Next $out_imei = BitXOR(1,$inp_imei) Return $out_imei EndFunc Link to comment Share on other sites More sharing options...
Ascer Posted February 26, 2018 Share Posted February 26, 2018 Your question has been removed from stackoverflow forum. Please do not help this Seeker, this post will blocked in next few hours. Link to comment Share on other sites More sharing options...
Developers Jos Posted February 26, 2018 Developers Share Posted February 26, 2018 2 hours ago, Ascer said: Please do not help this Seeker, this post will blocked in next few hours. I don't see any report for this thread yet with a reason why this is against our forum rules ... Jos SciTE4AutoIt3 Full installer Download page - Beta files Read before posting How to post scriptsource Forum etiquette Forum Rules Live for the present, Dream of the future, Learn from the past. Link to comment Share on other sites More sharing options...
Earthshine Posted February 26, 2018 Share Posted February 26, 2018 (edited) Got it anyway he wants us to do it all it seems Edited February 26, 2018 by Earthshine My resources are limited. You must ask the right questions Link to comment Share on other sites More sharing options...
Subz Posted February 26, 2018 Share Posted February 26, 2018 Looking at the cache of stackoverflow, they closed that post because he didn't post any code, there wasn't anything nefarious so don't see why it would be blocked on AutoIt forums. Link to comment Share on other sites More sharing options...
Earthshine Posted February 26, 2018 Share Posted February 26, 2018 (edited) Ok. I’ll look at it when I get in office but he better post code here. Not Gimme deh Codez im about learning. If they’re not coming here to learn and they’re wasting their time and mine He’s already got most of the difficult stuff done just need to create the arrays and fill them with the shit that he needs I noticed that he’s not passing two arrays in the main function and he needs two of them Edited February 26, 2018 by Earthshine My resources are limited. You must ask the right questions Link to comment Share on other sites More sharing options...
Jowy Posted February 27, 2018 Share Posted February 27, 2018 Hello adelbak, I need to ask you a question: Are you intending to increment twice the "i" variable in the for loop ? the first for statement initialize i to 0 and j to 0 and an the end of the for loop, I can see is i++, which means, you are incrementing "i" by 1 and also, the for loop when it reaches the close brace "}" will also check for the condition if "i" still less than 15 , if that ok, also increment "i" again. So you are incrementing "i" twice . Also, I can see that you are incrementing "j" at the same time. My question is : Are you intentionally incrementing "i" twice ? if yes, then last "i++" should be removed and then the for loop at the beginning should be like this if I understood your code correctly: int i=0, j=0; //for (i=0, j=0; i < 15; i++, j++) for (; i < 15;) { if (inp_imei[i] < '0' || inp_imei[i] > '9') { return 1; } out_imei[j] = (inp_imei[i] - '0'); if (i >= 14) break; if (inp_imei[i+1] < '0' || inp_imei[i+1] > '9') { return 1; } out_imei[j] += ((inp_imei[i+1] - '0') << 4); out_imei[j] = out_imei[j] ^ out_mask[j]; //i++; i+=2; j++; } is that what you intended ? to increment "i" twice ? and "j" will be always incremented to 1 ? adelbak 1 Link to comment Share on other sites More sharing options...
adelbak Posted February 27, 2018 Author Share Posted February 27, 2018 (edited) 10 hours ago, Jowy said: Hello adelbak, I need to ask you a question: Are you intending to increment twice the "i" variable in the for loop ? the first for statement initialize i to 0 and j to 0 and an the end of the for loop, I can see is i++, which means, you are incrementing "i" by 1 and also, the for loop when it reaches the close brace "}" will also check for the condition if "i" still less than 15 , if that ok, also increment "i" again. So you are incrementing "i" twice . Also, I can see that you are incrementing "j" at the same time. My question is : Are you intentionally incrementing "i" twice ? if yes, then last "i++" should be removed and then the for loop at the beginning should be like this if I understood your code correctly: int i=0, j=0; //for (i=0, j=0; i < 15; i++, j++) for (; i < 15;) { if (inp_imei[i] < '0' || inp_imei[i] > '9') { return 1; } out_imei[j] = (inp_imei[i] - '0'); if (i >= 14) break; if (inp_imei[i+1] < '0' || inp_imei[i+1] > '9') { return 1; } out_imei[j] += ((inp_imei[i+1] - '0') << 4); out_imei[j] = out_imei[j] ^ out_mask[j]; //i++; i+=2; j++; } is that what you intended ? to increment "i" twice ? and "j" will be always incremented to 1 ? Thanx Jowy 1-Are you intending to increment twice the "i" variable in the for loop ? YES For help, This is the full source: expandcollapse popup#include <string.h> #include <stdio.h> #include <stdarg.h> #include <stdlib.h> //#include "calcimei.h" #define OUT_FILE "MP0B_001_NEW" int main(int argc, char *argv[]) { char *str = "357369035621901"; FILE* output; char inp_imei[15]; char out_imei[12] = {0}; int i, ret; char *mode; if (argc < 2 || strlen(argv[1])!=15 || (argc==3 && strlen(argv[2])!=15)) { fprintf(stdout, "Use: %s <IMEI_1 15 digits> [IMEI_2 15 digits]\n", argv[0]); return 1; } for (i=1; i < argc; i++) { memset(inp_imei, 0, sizeof(inp_imei)); memset(out_imei, 0, sizeof(out_imei)); strncpy(inp_imei, argv[i], sizeof(inp_imei)); fprintf(stdout, "New IMEI %d (15 digits):%s\n", i, inp_imei); ret = calc_imei(&inp_imei, &out_imei); if ( ret ) { fprintf(stderr, "Invalid IMEI %d format!\n", i); return 1; } mode="w"; if (i==2) { mode="a"; } output = fopen(OUT_FILE, mode); fwrite(out_imei, 1, sizeof(out_imei), output); fclose(output); } fprintf(stdout, "New IMEI in file = %s\n", OUT_FILE); return 0; } int calc_imei(char inp_imei[15], char out_imei[12]) { char out_mask[12] = {0xAB, 0xA0, 0x6F, 0x2F, 0x1F, 0x1E, 0x9A, 0x45, 0x0, 0x0, 0x0, 0x0}; int i=0, j=0; for (i=0, j=0; i < 15; i++, j++) { if (inp_imei[i] < '0' || inp_imei[i] > '9') { return 1; } out_imei[j] = (inp_imei[i] - '0'); if (i >= 14) break; if (inp_imei[i+1] < '0' || inp_imei[i+1] > '9') { return 1; } out_imei[j] += ((inp_imei[i+1] - '0') << 4); out_imei[j] = out_imei[j] ^ out_mask[j]; i++; } out_imei[j] = out_imei[j] ^ out_mask[j]; out_imei[8] = 0x57; //Может быть и 0x0, ни на что не влияет out_imei[9] = 0xDB; //Может быть и 0x0, ни на что не влияет out_imei[10] = out_imei[11] = 0; for (i = 0; i < 10; i++) { if (i & 0x1) { out_imei[11] += out_imei[i]; } else { out_imei[10] += out_imei[i]; } } return 0; } Edited February 27, 2018 by adelbak Link to comment Share on other sites More sharing options...
Jowy Posted February 28, 2018 Share Posted February 28, 2018 14 hours ago, adelbak said: Thanx Jowy 1-Are you intending to increment twice the "i" variable in the for loop ? YES For help, This is the full source: expandcollapse popup#include <string.h> #include <stdio.h> #include <stdarg.h> #include <stdlib.h> //#include "calcimei.h" #define OUT_FILE "MP0B_001_NEW" int main(int argc, char *argv[]) { char *str = "357369035621901"; FILE* output; char inp_imei[15]; char out_imei[12] = {0}; int i, ret; char *mode; if (argc < 2 || strlen(argv[1])!=15 || (argc==3 && strlen(argv[2])!=15)) { fprintf(stdout, "Use: %s <IMEI_1 15 digits> [IMEI_2 15 digits]\n", argv[0]); return 1; } for (i=1; i < argc; i++) { memset(inp_imei, 0, sizeof(inp_imei)); memset(out_imei, 0, sizeof(out_imei)); strncpy(inp_imei, argv[i], sizeof(inp_imei)); fprintf(stdout, "New IMEI %d (15 digits):%s\n", i, inp_imei); ret = calc_imei(&inp_imei, &out_imei); if ( ret ) { fprintf(stderr, "Invalid IMEI %d format!\n", i); return 1; } mode="w"; if (i==2) { mode="a"; } output = fopen(OUT_FILE, mode); fwrite(out_imei, 1, sizeof(out_imei), output); fclose(output); } fprintf(stdout, "New IMEI in file = %s\n", OUT_FILE); return 0; } int calc_imei(char inp_imei[15], char out_imei[12]) { char out_mask[12] = {0xAB, 0xA0, 0x6F, 0x2F, 0x1F, 0x1E, 0x9A, 0x45, 0x0, 0x0, 0x0, 0x0}; int i=0, j=0; for (i=0, j=0; i < 15; i++, j++) { if (inp_imei[i] < '0' || inp_imei[i] > '9') { return 1; } out_imei[j] = (inp_imei[i] - '0'); if (i >= 14) break; if (inp_imei[i+1] < '0' || inp_imei[i+1] > '9') { return 1; } out_imei[j] += ((inp_imei[i+1] - '0') << 4); out_imei[j] = out_imei[j] ^ out_mask[j]; i++; } out_imei[j] = out_imei[j] ^ out_mask[j]; out_imei[8] = 0x57; //Может быть и 0x0, ни на что не влияет out_imei[9] = 0xDB; //Может быть и 0x0, ни на что не влияет out_imei[10] = out_imei[11] = 0; for (i = 0; i < 10; i++) { if (i & 0x1) { out_imei[11] += out_imei[i]; } else { out_imei[10] += out_imei[i]; } } return 0; } Ok, I'll write for you the code, but hope you will do it next time. I'll publish it in couple of hours. You need to learn AutoIT basics and the documentation will help you out later on.. Link to comment Share on other sites More sharing options...
Jowy Posted February 28, 2018 Share Posted February 28, 2018 (edited) Here you go @adelbak, I need to mention that you can pass as many IMEIs params as you want, it's not limited to 1 or 2 params expandcollapse popup#Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Change2CUI=y #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** ; Written by Jowy ; Creation of IMEI file ; Creation Date: 28/02/2018 #Region Include #include <FileConstants.au3> #include <Array.au3> #include <String.au3> #EndRegion Include #Region Variables #cs test params: 531302165213560 501939357823635 Global Const $sStr = "357369035621901" #ce Global Const $aOutMask = [0xAB, 0xA0, 0x6F, 0x2F, 0x1F, 0x1E, 0x9A, 0x45, 0x0, 0x0, 0x0, 0x0] Global $hOutputFile = 0 Global Const $sOUT_FILE = "MP0B_001_NEW" Global Const $iZero = Asc("0") Global $sFileContent = "" #EndRegion Variables #Region Main ;~ check if no parameters where provided; i.e. no imei If $CmdLine[0] = 0 Then PrintUsage() Exit 1 EndIf For $i = 1 To $CmdLine[0] ConsoleWrite("New IMEI " & $i & " (15 digits): " & $CmdLine[$i] & @CRLF) Local $aReturn = ParseIMEI($CmdLine[$i]) If Not @error Then WriteToFile($aReturn) Else ConsoleWrite("Invalid IMEI " & $CmdLine[$i] & " format!" & @CRLF) CloseFile() Exit 1 EndIf Next ConsoleWrite("New IMEI in file = " & $sOUT_FILE & @CRLF) CloseFile() #EndRegion Main #Region Functions Func CloseFile() If $hOutputFile <> 0 Then FileClose($hOutputFile) EndIf EndFunc ;==>CloseFile Func WriteToFile(ByRef $aArray) If $hOutputFile = 0 Then $hOutputFile = FileOpen(@ScriptDir & "\" & $sOUT_FILE, $FO_OVERWRITE + $FO_ANSI) ; I'm using overwrite, so if previous file exists, it will be overwritten. EndIf If $hOutputFile <> -1 Then For $xItem In $aArray FileWrite($hOutputFile, BinaryMid($xItem, 1, 1)) Next Else ConsoleWrite("Unable to open file for writing !" & @CRLF) Exit 1 EndIf EndFunc ;==>WriteToFile Func PrintUsage() ConsoleWrite("Usage: " & @CRLF & @ScriptName & " <IEMI_1 15 digits> [IMEI_2 15 digits] ... [IMEI_X 15 digits]" & @CRLF) EndFunc ;==>PrintUsage Func ParseIMEI($sIMEI) Local $aOutput If StringLen($sIMEI) = 15 And StringIsDigit($sIMEI) Then $aOutput = Calc_IMEI($sIMEI) Return SetError(0, 0, $aOutput) Else Return SetError(1, 1, "") EndIf EndFunc ;==>ParseIMEI Func Calc_IMEI($sInput) Local $j = 0 Local $aOutput[12] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ;~ Local $aInput = StringRegExp($sInput, "(?i)(\d)", 3) Local $aInput = StringToASCIIArray($sInput) ;~ _ArrayDisplay($aInput) For $i = 0 To UBound($aInput) - 1 Step 2 ; (15 - 1 = 14) ;~ since $sInput is always having digits from 0 to 9, there is no need to check any digit as all the string have been checked $aOutput[$j] = ($aInput[$i] - $iZero) If $i >= 14 Then ExitLoop EndIf $aOutput[$j] += BitShift(($aInput[$i + 1] - $iZero), -4) $aOutput[$j] = BitXOR($aOutput[$j], $aOutMask[$j]) $j += 1 Next $aOutput[$j] = BitXOR($aOutput[$j], $aOutMask[$j]) $aOutput[8] = 0x57 $aOutput[9] = 0xDB $aOutput[10] = 0 $aOutput[11] = 0 For $i = 0 To 9 If BitAND($i, 0x1) Then $aOutput[11] += $aOutput[$i] Else $aOutput[10] += $aOutput[$i] EndIf Next Return $aOutput EndFunc ;==>Calc_IMEI #EndRegion Functions Here are my results: Edited February 28, 2018 by Jowy adelbak and Subz 2 Link to comment Share on other sites More sharing options...
Bilgus Posted February 28, 2018 Share Posted February 28, 2018 (edited) Well darn I guess I should have checked to see if someone else was doing it before I started and you did a full conversion too nice jowy expandcollapse popup$sImei = InputBox("test imei", "imei", 0) $aRet = calc_imei($sImei) If @error Then MsgBox(0, "error", "pos: " & @extended & " is invalid") Local $sOut = "" For $i = 0 To UBound($aRet) - 1 $sOut &= " " & Hex($aRet[$i], 2) Next MsgBox(0, "Hex Out", $sOut) Func calc_imei($s_Imei) Local Const $aInvalid[12] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] Local Const $aMask[12] = [0xAB, 0xA0, 0x6F, 0x2F, 0x1F, 0x1E, 0x9A, 0x45, 0x0, 0x0, 0x0, 0x0] Local $a_Imei = StringToASCIIArray($s_Imei, "") Local $a_Out = $aInvalid If Not IsArray($a_Imei) Or UBound($a_Imei) <> 15 Then Return SetError(1, 0, $aInvalid) ;wrong length $j = 0 For $i = 0 To UBound($a_Imei) - 1 Step 2 ; for (i=0, j=0; i < 15; i++, j++);; i++; If $a_Imei[$i] < Asc('0') Or $a_Imei[$i] > Asc('9') Then Return SetError(2, $i, $aInvalid) ;if (inp_imei[i] < '0' || inp_imei[i] > '9') $a_Out[$j] = $a_Imei[$i] - Asc('0') ;out_imei[j] = (inp_imei[i] - '0'); If $i < 14 Then ;if (i >= 14) break; If $a_Imei[$i + 1] < Asc('0') Or $a_Imei[$i + 1] > Asc('9') Then Return SetError(2, $i + 1, $aInvalid) $a_Out[$j] += BitShift($a_Imei[$i + 1] - Asc('0'), -4) ;out_imei[j] += ((inp_imei[i+1] - '0') << 4);left shift 4 $a_Out[$j] = BitXOR($a_Out[$j], $aMask[$j]) ;out_imei[j] = out_imei[j] ^ out_mask[j]; $j += 1 EndIf Next $a_Out[$j] = BitXOR($a_Out[$j], $aMask[$j]) ;out_imei[j] = out_imei[j] ^ out_mask[j]; $a_Out[8] = 0x57 ;out_imei[8] = 0x57; //????? ???? ? 0x0, ?? ?? ??? ?? ?????? $a_Out[9] = 0xDB ;out_imei[9] = 0xDB; //????? ???? ? 0x0, ?? ?? ??? ?? ?????? $a_Out[10] = 0 ;out_imei[10] = out_imei[11] = 0 $a_Out[11] = 0 ; ;simple checksum For $i = 0 To 9 Step 2 ;for (i = 0; i < 10; i++) $a_Out[10] += $a_Out[$i] ;;out_imei[10] += out_imei[i]; $a_Out[11] += $a_Out[$i + 1] ;if (i & 0x1); out_imei[11] += out_imei[i] Next Return $a_Out EndFunc Edited February 28, 2018 by Bilgus adelbak 1 Link to comment Share on other sites More sharing options...
Earthshine Posted February 28, 2018 Share Posted February 28, 2018 why write their code at all? what do they learn? My resources are limited. You must ask the right questions Link to comment Share on other sites More sharing options...
Jowy Posted February 28, 2018 Share Posted February 28, 2018 (edited) @Earthshine, I agree with you, I wrote the code so @adelbak can learn how can be done in AutoIT, but for sure next time he will do things by his own. Also, the trick is not actually by writing the function only, it was also by saving the output to a file, because showing a message box by itself and trying to write the string will not solve the issue as 4 bytes of data for every char will be written, but instead we have to have 1 byte for every char. That's why I wrote all the whole script Edited February 28, 2018 by Jowy adelbak and Earthshine 2 Link to comment Share on other sites More sharing options...
Earthshine Posted February 28, 2018 Share Posted February 28, 2018 (edited) yes. you can still do the challenge! do it! and then eek it out so they learn. that's what this site tries to do anyway. Edited February 28, 2018 by Earthshine Jowy and adelbak 2 My resources are limited. You must ask the right questions Link to comment Share on other sites More sharing options...
Bilgus Posted February 28, 2018 Share Posted February 28, 2018 Well being that his upload is a virus or at least a false positive and he had the source I doubt he will do much of any learning since it would have been just as easy to recompile it from source as convert to Autoit https://www.virustotal.com/#/file/8f65e7741f0c543f38a8e1f09f1fcf191babfabbc83c793a9f152c681f258471/detection adelbak 1 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now