RSS
people

How to write obfuscated code?

Obfuscated codes are source codes which are difficult to understand and adapt. There are many reasons people obfuscate codes: some wants to hide the code because they don’t want anyone else to copy/reuse portions of their code, sometimes people want to win competitions , sometimes they want to impress others and sometimes they do because they have too much of free time and its fun. If you want to see some cool example of obfuscated code, check this out.

So, how do we do it? If you are a decent enough programmer with little bit of creativity, there are endless possibilities you can innovate. I’m listing most common ones here:

  • Replace variable names with non-meaningful ones, e.g. replacing int i with int xxxxxxx or better int lIlIIllIIl.
  • Replace numeric constants with expressions, e.g. replacing 232 with (0x14b6+2119-0x1c15)
  • Replace characters in strings with their hex escapes, e.g. turning string "cust" into "\x63\x75\x73\x74"
  • Remove or obfuscate the comments.
  • Delete all line breaks, spaces, tabs. You can also arrange them to look like a shape. (See example here)
  • Use Macros. Real complex one. Simple Example: #define MIN( x, y)  ( ( x) > ( y) ? ( y) : ( x) )
  • Obfuscate the macros using techniques mentioned above. Example 1: #define lIlIIlIIIl( IIIlIlIlll, IlIIIllIll) ( ( IIIlIlIlll) > ( IlIIIllIll) ? ( IlIIIllIll) : ( IIIlIlIlll) ) or Example 2: #define OO0O00O000( O000O0O0OO, O0O000OO0O) ( ( O000O0O0OO) > ( O0O000OO0O) ? ( O0O000OO0O) : ( O000O0O0OO) ) In first case, we used combination of l and I and in second example we used combination of O (capital alphabet) and 0 (zero). (Notice that small O and zero looks almost same. “o0″ 1st one is vowel O and second one is digit 0) So, we can use this also.
  • Use _ and __ as identifiers.
  • Extended ASCII characters are perfectly valid as variable names in some languages, including ß, Ð, and ñ characters. They are almost impossible to type without copying/pasting in a simple text editor and they look cool.
  • Use Continuation to hide variables:
    Instead of using
    #define local_var xy_z
    break up “xy_z” onto two lines:
    #define local_var xy\
    _z // local_var OK

  • Be innovative with preprocessor directives. Through clever use of defines and ifdefs, a master of obfuscation can make header files declare different things depending on how many times they are included. This becomes especially interesting when one header is included in another header. Here is a particularly devious example: (taken from reference given below)
    #ifndef DONE
     
    #ifdef TWICE
     
    // put stuff here to declare 3rd time around
    void g(char* str);
    #define DONE
     
    #else // TWICE
    #ifdef ONCE
     
    // put stuff here to declare 2nd time around
    void g(void* str);
    #define TWICE
     
    #else // ONCE
     
    // put stuff here to declare 1st time around
    void g(std::string str);
    #define ONCE
     
    #endif // ONCE
    #endif // TWICE
    #endif // DONE

    This one gets fun when passing g() a char*, because a different version of g() will be called depending on how many times the header was included.

Be imaginative and sky is your limit. There are also some tools available to obfuscate the codes. One such example is Stunnix. For more ways to obfuscate, read Roedy Green’s How To Write Unmaintainable Code.

3 Comments | Tags: , ,

Make a textarea Hindi transliterable

Transliteration is not an unfamiliar word these days. When you write Hindi in roman script and it automatically converts in Devanagari, then the user of your application feels happy. Like google indic transliteration page or orkut scraps, you can make any textarea. All you need to know is about “Google AJAX Language API“.

Without much discussion, let’s see how this works. This is the minimal code required.

1
2
3
4
5
<html>
  <head>
    <!-- Following line is necessary to include api -->
    <script type="text/javascript" src="http://www.google.com/jsapi"></script>
    <script type="text/javascript">
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
      // Load the Google Transliteration API
      google.load("elements", "1", {
            packages: "transliteration"
          });
 
      function onLoad() {
        var options = {
          sourceLanguage: 'en',            //en for English
          destinationLanguage: ['hi'],    //hi for Hindi
          shortcutKey: 'ctrl+g',   //key combination to toggle between languages
          transliterationEnabled: true
        };
 
        var control =
            new google.elements.transliteration.TransliterationControl(options);
 
        // List all the IDs of textarea/textboxes below
        // These IDs should be present in HTML code
        var ids = [ "transl1", "transl2" ];
 
        control.makeTransliteratable(ids);
      }
      google.setOnLoadCallback(onLoad);
29
30
31
32
33
34
35
36
37
    </script>
  </head>
  <body>
  <center>Type in Hindi (Press Ctrl+g to toggle)</center>
    <br>Title: <input type='textbox' id="transl1"/>
    <br>Body:<br>
    <textarea id="transl2" style="width:600px;height:200px"></textarea>
  </body>
</html>

Right now transliteration is supported for Arabic, Hindi, Kannada, Malayalam, Tamil & Telugu. (Language codes: ar, hi, kn, ml, ta, te respectively).

If you want to write text in Malayalam instead of Hindi then only line 14 of above script will change as

14
      destinationLanguage: ['ml'],

Optionally we can also show a button control to toggle between English and the indic language. We just need to add one line in onLoad function of script.

25
      control.showControl('translControl');

How to enable Hindi writing in wordpress comment box?

We can use the same concept to make wordpress comment box transliterable in Indian languages. Only 4 simple steps.

  1. Note down id of your comment textarea in comments.php file of your theme. (say id=”comment”)
  2. copy the lines between <head>and </head> in the script written above.
  3. paste the copied code in header.php file of your theme, inside head section.
  4. replace the line var ids = [ "transl1", "transl2" ]; with id of your comment textarea. (var ids = [ "comment" ]; if ID noted in step 1 was comment)

Based on this concept, I have created a wordpress plugin which allows visitors to comment in Hindi. (Other languages to be added soon). Once you install the plugin, none of the steps are needed. Visit plugin page here.

3 Comments | Tags: , , , , , , , , , ,

Write an SMS Application – 2

If you have not read first part of “Write an SMS Application”, read it here.

Continuing from next time, let’s assume that we registered a keyword ‘QUOTE’. It means that any message which starts with QUOTE (or quote or QuOtE) and sent to 56767888 will call our AppURL http://webkoof.com/quote.php. This is how it will exactly happen:

  1. Someone sends QUOTE <anything after it> to 56767888. (Please note that the space after QUOTE is needed. QUOTER will not call your appURL)
  2. SMSGupShup will recieve the message and will call our AppURL with sender’s phone number and content of the SMS.
  3. They will pass the sender’s phone number and SMS to our application as GET parameters. Which means that if someone with phone number 9876543210 sends QUOTE to 56767888 then they will actually call http://webkoof.com/quote.php?msisdn=919876543210&content=QUOTE

Notice that parameter name for phone number is msisdn and for SMS content is content. Also notice that phone number is always prefixed by the country code (91 for India).

Our applicaton should start with GETting these parameters.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
$sender = $_GET["msisdn"];  // Get the phone number
$content = $_GET["content"]; // Get the message
 
/* Remember that an user can send anything after QUOTE to the application.
So, QUOTE GANDHI will also come to your application and so will QUOTE xxx.
Let's make sure that we recieved only QUOTE or send an error.           */
 
if ($content == 'QUOTE')
       $reply = selectQuote();  //selectQuote is a function, which we need to define.
else
       $reply = 'You have sent wrong command. You should only send QUOTE to 56767888.';
 
fucntion selectQuote() {
 
       /* Do something and find out a quote. You can use a pre defined array of quotes
          and pick one. or you can fetch a RSS feed of quotes from somewhere and pick one.
          Right now, I'm returning a fixed quote every time. */
 
        $quote = "There is no gain without pain";
        return $quote;
}

In the code till now, we decided what to send based on what we get. Please remember that choosing the quote (selectQuote function) can be a very simple algorithm which involves picking up one random quotes from a given array (or text file or even mysql database) or it may be a complex one involving RSS feeds. The way you select the quote is a programming problem and it may vary from user to user. In this case, we are returning the same quote every time because we want to learn the SMS App flow in simplistic manner.

So, we finally decided what to send back ($reply variable) and to whom ($sender variable). How will we send back the SMS then? It is not as complex as it may seem. If your script outputs in a given JSON or XML format, SMSGupShup will handle all the dirty work and automatically send the SMS. Acceptable formats are following:

1. JSON

[{ "msisdn":"919876543210", "content":"Our Reply here"},
{"msisdn":"919876543211", "content":"Another message to same or different number"}]

2. XML

<ApplicationResponse>
     <Response>
           <msisdn>919876543210</msisdn>
           <content>Our Reply here</content>
      </Response>
      <Response>
            <msisdn>919876543211</msisdn>
            <content>Another message to same or different number</content>
      </Response>
<ApplicationResponse>

Notice that a single incoming SMS can result in sending more than one messages as response to different numbers. But, for our simple application we only need to send one message to only one user. So, we need to format our response in the given format. We can use simple echo command or more advanced json_encode command. Continuing our quote.php file:

24
25
26
// Using simple echo fucntion
echo "[ { \"msisdn\":\"$sender\", \"content\":\"$reply\"}]";
?>

Alternatively, you can also use json_encode function (PHP5). Although it seem little complex but, for creating jsons in other complex cases are too much to handle using echo.

24
25
26
27
28
// Using more advanced json_encode function.
$reponseArray = array('msisdn'=>$sender, 'content'=>$reply);
$json_response = json_encode($responseArray);
echo "[$json_response]";
?>

Similarly you can also choose to output XML format. Again, it does not matter if you use echo to create your XML or you use other complex functions to write XML.

Hence, we created our first SMS application which is very simple but gives us good enough idea of the flow logic involved. Wait for complexities.

And ya…! Happy Holi. :)

3 Comments | Tags: , , , , ,

Write an SMS Application – 1

We encounter SMS application on a daily basis. Voting on reality shows, opinion polls on newspaper or your daily horoscope on SMS – everything is an SMS Application (or as we lazy developers call it – SMS App). Just until few months back, it was very difficult for a novice programmer to write an SMS app. It was only expert’s cup of tea. But then SMSGupShup launched an application programming interface (API) using which anyone with little knowledge of programming can write an SMS App.

In order to write an application, first thing we need to know is how these apps work. Any app will have two clear parameters associated to it. First is shortcode (The number which is used to communicate with the app) and second Keyword (The first word of any SMS Response). Let’s understand this using an example. Consider an App designed to calculate love compatibility score between two persons. If you visit the actual app page here, you will see the line “SMS to 56767888: Love <name1> <name2> “. It indicates that if you want to calculate love score between JOHN and BIPASA then you need to send LOVE JOHN BIPASA to 5676788. In this example, shortcode is 56767888 and keyword is LOVE.

So, why shortcode and keywords are important? Well, shortcode are just like mobile numbers. So, the app will recieve only messages sent to a particular shortcode for the obvious reason and on a single shortcode there are various apps running, so the keyword determines which message should go to which app. SMSGupShup provides you a shortcode and keywords for any app you want to write. (Keywords. Because complex apps can have more than one keyword). To apply for API access go here. Did I mention it is FREE?

On the registration form you will see one unfamiliar Input field namely ‘App URL’. So, what is this AppURL? To understand appURL, you need to know how this API works internally. Let’s continue with our example of Love application. What happens (internally) if someone sends LOVE JOHN BIPASA to 56767888? (Assume that mobile number of the person is 9876543210.

  1. Since the shortcode 56767888 is owned by SMSGupShup, the message goes to them.
  2. Now SMSGupShup takes the message and reads the keyword, which is LOVE in this case.
  3. Since everyone registered their own keywords with SMSGupShup, they send this whole message (LOVE JOHN BIPASA) and the incoming number (9876543210) to LOVE Application.
  4. Love Application takes the number and the SMS. Process it. and calculated the love score using some algorithm (Say 80%). And send back a response to SMSGupShup containing what SMS to send (Your Love score is 80%) and Whom (9876543210). Responses are sent in XML or JSON format, which we will discuss later
  5. SMSGupShup takes the response and sends the SMS to given number.

Read and understand the process completely.

Important step to note here is STEP 3. What does it mean that they send the message to love application? Well, Application is nothing but a file (written in PHP, Java or even C) somewhere on the web. SMSGupShup needs to know where to send the messages for your particular App. AppURL is URL of this particular file. (Which you can host anywhere on web)

So, if you are planning to put your application file (which will process the incoming SMS and gives back response to user) at http://example.com/app.php then this URL will be your AppURL. Now let’s assume that we want to develop an application QUOTE, which will send back a nice quote to the user.

AppName: Quotation

Keyword: QUOTE

AppURL: http://webkoof.com/quote.php (This is the file we have to write.)

Break Time. We will write our application (quote.php) in next session. :)

2 Comments | Tags: , , , , , ,

French/Italian Dictionary via SMS

There are two very good services available which can be used to create SMS translator application. First one is obviously google language API and second one is SMSGupShup’s App Platform.

Using these excellent mediums I created one SMS translation application.

How it works?

Send TRANS FR your-string-here to 56767888 and you will get translated version of your english text in French. Instead of FR, you can use IT for italian, DE for german etc.

Examples:

TRANS FR Hello Madam!

Response: bonjour Madame!

TRANS IT Hello Madam!

Response: Signora ciao!

TRANS DE Good Morning!

Response: Guten Morgen!

Note:  The mobile shortcode 56767888 provided by smsgupshup is valid only in India.

No Comments | Tags: , , , , , , , , , ,