IDA Pro: IDC scripts for reversing network software binary

Most of the time when we reverse an networking software that process TCP/IP packets, we face with the challenge of creating that same old structures. IDA Pro has inbuilt structures for windows internals data structure. I couldn’t find one for my usage when i was reversing networking software. So i created few IDC scripts that create ARP, IP, TCP, UDP, ICMP structures.

arp.idc:

#include <idc.idc>

static main(void)
{
    auto id;
    id = AddStrucEx(-1,"ARP_HEADER",0);
   
    AddStrucMember(id,"Hardware_type",       0X0,      FF_WORD,    -1,    2);
    AddStrucMember(id,"protocol_type",         0X2,      FF_WORD,    -1,    2);
    AddStrucMember(id,"hardware_len",         0X4,      FF_BYTE,       -1,    1);
    AddStrucMember(id,"protoaddr_len",        0X5,      FF_BYTE,       -1,    1);
    AddStrucMember(id,"opcode",                     0X6,      FF_WORD,   -1,    2);
    AddStrucMember(id,"src_hwd_addr_0",    0X8,      FF_BYTE,       -1,    1);
    AddStrucMember(id,"src_hwd_addr_1",    0X9,      FF_BYTE,       -1,    1);
    AddStrucMember(id,"src_hwd_addr_2",    0Xa,      FF_BYTE,       -1,    1);
    AddStrucMember(id,"src_hwd_addr_3",    0Xb,      FF_BYTE,       -1,    1);
    AddStrucMember(id,"src_proto_addr_0",  0X0c,    FF_BYTE,       -1,    1);
    AddStrucMember(id,"src_proto_addr_1",  0X0d,    FF_BYTE,      -1,    1);
    AddStrucMember(id,"src_proto_addr_2",  0X0e,    FF_BYTE,      -1,    1);
    AddStrucMember(id,"src_proto_addr_3",  0X0f,     FF_BYTE,      -1,    1);
    AddStrucMember(id,"dst_hwd_addr_0",    0X10,    FF_BYTE,      -1,    1);
    AddStrucMember(id,"dst_hwd_addr_1",    0X11,    FF_BYTE,      -1,    1);
    AddStrucMember(id,"dst_hwd_addr_2",    0X12,    FF_BYTE,      -1,    1);
    AddStrucMember(id,"dst_hwd_addr_3",    0X13,    FF_BYTE,      -1,    1);
    AddStrucMember(id,"dst_proto_addr_0",  0X14,    FF_BYTE,      -1,    1);
    AddStrucMember(id,"dst_proto_addr_1",  0X15,    FF_BYTE,      -1,    1);
    AddStrucMember(id,"dst_proto_addr_2",  0X16,    FF_BYTE,      -1,    1);
    AddStrucMember(id,"dst_proto_addr_3",  0X17,    FF_BYTE,      -1,    1);
   
}

ip.idc:

#include <idc.idc>

static main(void)
{
    auto id;
    id = AddStrucEx(-1,"IP_HEADER",0);
   
    AddStrucMember(id,"Version_HdrLen",  0X0,    FF_BYTE,    -1,    1);
    AddStrucMember(id,"TOS",                       0X1,    FF_BYTE,    -1,    1);
    AddStrucMember(id,"Total_len",             0X2,    FF_WORD,    -1,    2);
    AddStrucMember(id,"Identification",     0X4,    FF_WORD,    -1,    2);
    AddStrucMember(id,"Flags_FragOff",     0X6,    FF_WORD,    -1,    2);
    AddStrucMember(id,"TTL",                         0X8,    FF_BYTE,    -1,    1);
    AddStrucMember(id,"ProtocolID",           0X9,    FF_BYTE,    -1,    1);
    AddStrucMember(id,"HDR_CRC",              0X0A,    FF_WORD,    -1,    2);
    AddStrucMember(id,"SRC_IP_0",              0X0C,    FF_BYTE,    -1,    1);
    AddStrucMember(id,"SRC_IP_1",              0X0D,    FF_BYTE,    -1,    1);
    AddStrucMember(id,"SRC_IP_2",              0X0E,    FF_BYTE,    -1,    1);
    AddStrucMember(id,"SRC_IP_3",              0X0F,    FF_BYTE,    -1,    1);
    AddStrucMember(id,"DST_IP_0",              0X10,    FF_BYTE,    -1,    1);
    AddStrucMember(id,"DST_IP_1",              0X11,    FF_BYTE,    -1,    1);
    AddStrucMember(id,"DST_IP_2",              0X12,    FF_BYTE,    -1,    1);
    AddStrucMember(id,"DST_IP_3",              0X13,    FF_BYTE,    -1,    1);
}

tcp.idc:

#include <idc.idc>

static main(void)
{
    auto id;
    id = AddStrucEx(-1,"TCP_HEADER",0);
   
    AddStrucMember(id,"SRC_PORT",    0X0,    FF_WORD,    -1,    2);
    AddStrucMember(id,"DST_PORT",    0X2,    FF_WORD,    -1,    2);
    AddStrucMember(id,"SEQ_NUM",    0X4,    FF_DWRD,    -1,    4);
    AddStrucMember(id,"ACK_NUM",    0X8,    FF_DWRD,    -1,    4);
    AddStrucMember(id,"DataOff_ECN_Ctrlbit",        0X0C,    FF_WORD,    -1,    2);

    AddStrucMember(id,"Window",    0X0E,    FF_WORD,    -1,    2);
    AddStrucMember(id,"IP_CRC",    0X10,    FF_WORD,    -1,    2);
    AddStrucMember(id,"URG_PTR",    0X12,    FF_WORD,    -1,    2);   
}

udp.idc:

#include <idc.idc>

static main(void)
{
    auto id;
    id = AddStrucEx(-1,"UDP_HEADER",0);
   
    AddStrucMember(id,"SRC_PORT",    0X0,    FF_WORD,    -1,    2);
    AddStrucMember(id,"DST_PORT",    0X2,    FF_WORD,    -1,    2);
    AddStrucMember(id,"Length",    0X4,    FF_WORD,    -1,    2);
    AddStrucMember(id,"UDP_CRC",    0X6,    FF_WORD,    -1,    2);
}

icmp.idc:

#include <idc.idc>

static main(void)
{
    auto id;
    id = AddStrucEx(-1,"ICMP_HEADER",0);
   
    AddStrucMember(id,"Type",    0X0,    FF_BYTE,    -1,    1);
    AddStrucMember(id,"Code",    0X1,    FF_BYTE,    -1,    1);
    AddStrucMember(id,"ICMP_CRC",    0X2,    FF_WORD,    -1,    2);
   
}

Advertisements
This entry was posted in IDA Pro and tagged , , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s