Jump to content
adelbak

Please, Can anyone translate this C small function to autoit

Recommended Posts

adelbak

Please, Can anyone translate this C small function to autoit

MTK IMEI Algorithm:

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;
}

you can test  EXE  (Down it from attach)

THANKS

 

Edited by Jos
Removed attachment due to too many (false?) virus warnings

Share this post


Link to post
Share on other sites
Earthshine

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

  • Like 1

My resources are limited. You must ask the right questions

 

Share this post


Link to post
Share on other sites
adelbak

believe me i tried many times but i cant
i have problems with loop

Share this post


Link to post
Share on other sites
Earthshine

Can you post your script so others can also look at it and help?

Even if it does not work 

Edited by Earthshine
  • Like 1

My resources are limited. You must ask the right questions

 

Share this post


Link to post
Share on other sites
adelbak

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

FBkRpTY.png

This generate New IMEI in file (MP0B_001_NEW) with this content:

OcD9rQu.png

 

‍‘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

Share this post


Link to post
Share on other sites
adelbak

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

 

Share this post


Link to post
Share on other sites
Ascer

Your question has been removed from stackoverflow forum.

Please do not help this Seeker, this post will blocked in next few hours.

Share this post


Link to post
Share on other sites
Jos
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 Rules
 
Live for the present,
Dream of the future,
Learn from the past.
  :)

Share this post


Link to post
Share on other sites
Earthshine

Got it

anyway he wants us to do it all it seems 

Edited by Earthshine

My resources are limited. You must ask the right questions

 

Share this post


Link to post
Share on other sites
Subz

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.

Share this post


Link to post
Share on other sites
Earthshine

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 by Earthshine

My resources are limited. You must ask the right questions

 

Share this post


Link to post
Share on other sites
Jowy

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 ?

  • Like 1

Share this post


Link to post
Share on other sites
adelbak
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:

 

#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 by adelbak

Share this post


Link to post
Share on other sites
Jowy
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:

 

#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..

Share this post


Link to post
Share on other sites
Jowy

Here you go :dance: @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

#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:

 

IMEI.png

Edited by Jowy
  • Like 2

Share this post


Link to post
Share on other sites
Bilgus

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

$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 by Bilgus
  • Like 1

Share this post


Link to post
Share on other sites
Earthshine

why write their code at all? what do they learn?


My resources are limited. You must ask the right questions

 

Share this post


Link to post
Share on other sites
Jowy

@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 by Jowy
  • Like 2

Share this post


Link to post
Share on other sites
Earthshine

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 by Earthshine
  • Like 2

My resources are limited. You must ask the right questions

 

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

×