home *** CD-ROM | disk | FTP | other *** search
/ Reverse Code Engineering RCE CD +sandman 2000 / ReverseCodeEngineeringRceCdsandman2000.iso / RCE / Gthorne / reopsahl / gij!ida.txt < prev    next >
Text File  |  2000-05-25  |  16KB  |  354 lines

  1.  
  2.                            The Idea Of IDA 
  3.                     (A Small Primer For IDA Newbies)
  4.  
  5.                                 By
  6.                            
  7.                                  Gij
  8.  
  9. Hi there, gij here, i'm guessing most of you are reading this because you've
  10. heard about IDA and are thinking "why is it better then wdasm?", or you have
  11. already gotten IDA, but found it to complicated to use.
  12. This is being written to help you out with your first steps in using IDA.
  13. Hope it helps...
  14.  
  15. The Disassembling Challenge
  16. ---------------------------
  17.  
  18. Most software today is written using high level languages: C, C++, VB,
  19. JAVA, Delphi, etc'.
  20. These are ( generally speaking ) compiled languages that turn high-level
  21. code into the low-level code form that the computer understand, Assembler.
  22. We need to make a distinction between a Decompiler and a Disassembler.
  23. A decompiler takes a binary file generated by a compiler and try to reverse it
  24. into the high level language the file was compile from.
  25. So for example a C++ decompiler would take an .exe made by Visual C++ or any
  26. other compiler and turn out a C++ source file. A good decompiler is very hard
  27. to make.
  28. A Disassembler on the other hand, will take a binary file that could have been
  29. written in almost any language, and disassemble into an Assembler source file.
  30.  
  31. A good disassembler needs to be able to fairly accurately distinguish between
  32. data and code.
  33. a good decompiler needs to do that AND be able to understand what code
  34. construct in the original high-level language generated this code.
  35.  
  36. so what is IDA? neither. it's a hybrid between the two types of programs.
  37. IDA stands for "Interactive Disassembler", and it is. but it also has a of the
  38. characteristics of a decompiler, namely it's FLIRT feature.
  39.  
  40. Those of you who have programmed in c, or indeed ever try to debug a windows
  41. program, know that every program uses some functions supplied by the compiler
  42. or as part of the Win32 API.
  43. "printf()" is one example, all c programs that call printf, and are compiled
  44. by the same compiler have the same piece of code inside them.
  45. In the compilation process the compiler links in the code for the "printf()"
  46. function from it's included libraries.
  47.  
  48. This opens up an opportunity for a disassembler to recognize the code pattern
  49. of a particular function and pin a useful name on it.
  50. This also saves us from the embarrassment of tracing through a function for 20
  51. minutes only to discover it's some compiler's variant of "fseek()".
  52. It saves us time by helping us understand what the program is doing easily
  53. by letting us see what functions it calls.
  54.  
  55. This is exactly what FLIRT does, the FLIRT libraries that come with many
  56. signatures of functions from various compilers, not only for C but also
  57. for Pascal, Delphi and others.
  58. in a way You get the best of both worlds, IDA let's you reverse any binary file
  59. from any language, while taking advantage of the shared nature of compiler
  60. libraries.
  61. You can get more information on FLIRT at the IDA home page.
  62.  
  63. IDA vs. Wdasm
  64. --------------
  65.  
  66. Those of you who have been using Wdasm up till now, will need to make a slight
  67. switch in attitude when moving over to IDA.
  68. Wdasm, takes in a file and gives out a disassembly. that's it.
  69.  
  70. IDA is INTERACTIVE. this means the disassembly you get is very much editable,
  71. you can change code to be marked as data, and the other way around.
  72. you can add comments, see cross-references ( very useful, we'll get to it later )
  73. , and probably a whole lot more.
  74. That's probably why most people consider it more complex, or heavier then Wdasm.
  75. in IDA, you have to do more work, but you can accomplish much more.
  76. it's possible to completely reverse an application inside IDA, generate a source
  77. and have it compile to a byte-identical exe file. ( I'm not saying it's easy
  78. though ).
  79.  
  80. IDA by itself adds comments to some API calls or INT's, And using some tools
  81. availible, you can add your own comments to the databases.
  82.  
  83. The Use of IDA
  84. --------------
  85.  
  86. There are two version of IDA you can use,  idaw.exe and idax.exe.
  87. idaw.exe is a windows exe, while idax.exe is a dos file.
  88. I heard it said it's better to use idaw.exe because as a windows program
  89. it has less trouble with memory.
  90. I personally use idax.exe because i've found that with international versions
  91. of windows idaw.exe tends to have problems when typing in text.
  92.  
  93. One Important thing to remember, and thank you to whatever kind soul on
  94. #cracking who helped me understand this when i was starting out with IDA ,
  95. is that once you feed IDA an exe, dll, or whatever file, upon exit it saves
  96. a Disassembly database with the extension .IDB, when you wish to continue
  97. work on the disassembly, you do not reload the binary file, but tell IDA
  98. to load the .IDB file. once you've generated the .IDB file for a program
  99. you no longer need the original EXE, all changes to the disassembly are
  100. made an stored in the .IDB file.
  101.  
  102. OK, let's get down to some real-life use of IDA.
  103.  
  104. Actual Use Of IDA
  105. -----------------
  106.  
  107. You can load a program into IDA in 2 ways:
  108. 1) on the command line: "idax.exe c:\target\program.exe"
  109. 2) through the file dialog which appears when starting IDA without
  110.    a filename  argument.
  111.  
  112. Once you load the program into IDA, it will show you a panel of options to
  113. choose from, the default options are chosen for you according to the file
  114. format you loaded.
  115. The other options are either advanced ( meaning, if you need them, you know
  116. what how to use them ), or self-explanatory.
  117.  
  118. IDA then goes through 2 phases:
  119. 1) Actual Disassembly, including separation of program into code and data
  120.    areas. This is not fool-proof, IDA does make mistakes some times, don't
  121.    expect to run a program through IDA and have a 100% percent accurate
  122.    disassembly. IDA does come as close as anything i've ever seen.
  123.    At this phase, it also marks functions and analyses their stack arguments,
  124.    assigns label names to jump and call destinations, separates the file
  125.    into segments if needed, and probably more.
  126.  
  127. 2) If IDA recognize the file as compiled by a supported compiler, it will
  128.    load a signature file, and try to assign names to as many function as
  129.    possible.
  130.  
  131. After IDA has finished doing it's work, you can see some of the results of
  132. the disassembly, besides the main screen, where the disassembly is shown,
  133. the is also the status window, where information about what IDA is doing
  134. is shown, and other screen you can activate to see information about the
  135. disassembly.
  136. To switch between the window you can use the "Windows" menu, or F6 and
  137. Shift-F6 to go back and forth between windows.
  138.  
  139. The Disassembly window can be divided into 3 parts:
  140. 1) segment:offset ( to the left )
  141. 2) code/data  ( Taking up most of the width of the screen ).
  142. 3) Comments, These are actually part of the disassembly, but sometimes
  143.    contain Important information like Cross-references and API call info.
  144.  
  145. All in All, the disassembly screen should look familiar if you've ever written
  146. asm code.
  147.  
  148. An IDA Disassembly is divided into 3 types of areas/entries:
  149. 1) Code.
  150. 2) Data.
  151. 3) Unexplored.
  152.  
  153. You can distinguish between code and data just like you would in a normal asm
  154. file. data is preceded by some sort of data specifier: db,dw,dd,dt,dq....
  155. You can detect unexplored code by looking at the left part of the screen,
  156. unexplored areas are marked by a "greyed out" segment:offset.
  157. Unexplored areas are the areas to which no reference is made in code
  158. ( it's not jumped or called to, or incorporated in to the code flow of
  159. the program in any other way. ), or as data ( that area is not read or written
  160. by code.)
  161.  
  162. These places usually ( always? ) contain 0's, and are usually not relevant
  163. to the code, unless IDA missed marking some area as code, which references this
  164. area. This illustrates another point, with any change you make to the
  165. disassembly IDA checks if it can deduce anything else about the rest of the
  166. programs from the changes you've made. so for example, if you mark a data
  167. areas as code, IDA will look at it, and if it sees a jump to some unexplored
  168. space, it will mark that area as code, same with data, if that new code you've
  169. marked reads or writes to a previously unexplored address, IDA will mark that
  170. area as data.
  171.  
  172. To change the markings of an area, you select it using the mouse, then press
  173. one of 3 keys:
  174.  
  175. 1) 'c', marks that area as code.
  176. 2) 'd', marks that area as data, if you do not select an area, but place the
  177.    cursor at a line, and press 'd', you will cycle through the data specifiers
  178.    available. if you mark an area, you can use 'a' to declare it a string,
  179.    which will make IDA automatically give the string name, and show it as "123",
  180.    instead of "db 31h,32h,33h" for example.
  181.    you can also use '*' to make it an array of data, which will pop up a dialog
  182.    where you can set various options concerning the array (this is the same as
  183.    marking an area and pressing 'd' ).
  184.  
  185. 3) 'u', marks that area as unexplored.
  186.  
  187. Names
  188. -----
  189.  
  190. Names are the most Important part of a disassembly, it's the difference between
  191. 'loc_0_200' and 'Show_Splash_Screen' that makes it possible to understand a
  192. program bit by bit.
  193. To change the name of a label, or create a new one, position the cursor at the
  194. desired line and press 'n', a dialog will appear which will let you enter or
  195. modify the label name.
  196.  
  197.  
  198. Cross-references And Information Screens
  199. ---------------------------------
  200.  
  201. I've already mentioned Cross-references in this article a few times, it's only
  202. fair that i should explain what they are to those who do not know.
  203. a reference is created when a certain piece of code uses another area in some
  204. way, this could be a call ( one piece of code calls another ), a jump , or a
  205. read or write operation to a data location.
  206. IDA keeps track of this references, and maintains a table of cross-references
  207. for every label in the disassembly. for example:
  208.  
  209. seg000:0200
  210. seg000:0200 loc_0_200:                              ; CODE XREF: _main+1EAjump tablesj
  211. seg000:0200                 cmp     word_1B90_14C, 0
  212. seg000:0205                 jz      loc_0_20A
  213. seg000:0207                 jmp     loc_0_2F2
  214.  
  215. This means that the label loc_0_200 is referenced as CODE ( jump or call, thus
  216. "CODE XREF" ) by another location in the program, to see the list of places
  217. that reference this location, position the cursor at the line of the label,
  218. and select "Cross references" from the "View" Menu, a window should appear with
  219. a list of locations, you can jump to that location by selecting it in the window
  220. and pressing ENTER.
  221. IDA also keeps tabs of your little "field-trips" inside the code, so after
  222. you've traced 12 function deep into the code you can press ESC to get back to
  223. the place you where before your present location.
  224. Data Cross Reference are Much the same, no need to explain them separately.
  225.  
  226. Cross references are very Important because they give us a little info about
  227. a piece of code or data by telling us it is related to another piece of code.
  228. so potentially, if you've understood one piece of code, you can us it as an
  229. "anchor" into other locations in the program.
  230.  
  231. I should take a minute to tell you about the other items in the view menu,
  232. even though they are fairly self-explanatory:
  233.  
  234. 1)  Disassembly: shows you the Disassembly screen for the current file.
  235.  
  236. 2)  Functions:   shows you a list of location marked as function entry points.
  237.  
  238. 3)  Names:       shows you a complete list of FLIRT Recognized functions, and
  239.                  locations marked as strings.
  240.  
  241. 4)  Signatures:  shows you the FLIRT signature files currently loaded and
  242.                  applied to the file, you can manually add other signature
  243.                  files here.
  244.  
  245. 5)  Segments:    shows you the created segments
  246.  
  247. 6)  Segment registers:
  248.                  it seems to show you the changes in, and the value of, each
  249.                  segment register  between any range of locations in the file.
  250.  
  251. 7)  Selectors:   This Is Pmode related, won't show anything normally, perhaps
  252.                  you need to add them manually. probably used when disassembling
  253.                  extenders, or something else that's fairly dodgy.
  254.  
  255. 8)  Cross references: you know.
  256.  
  257. 9)  Structures: You can define structures and assign them to data areas, this
  258.                 will show the currently defines structs. ( see how advanced IDA
  259.                 is? )
  260.  
  261. 10) Enumerations:
  262.                 I think Enum's are used to give Names to numbers, or maybe array
  263.                 elements. i've never had to use it, normally, neither would you.
  264.  
  265.  
  266. Comments
  267. --------
  268.  
  269. There are two types of comments: repeatable and regular.
  270.  
  271. 1) Repeatable: made by pressing ';', when adding this sort of comment
  272.    to a function, the comment will appear next to any call to that function
  273.    anywhere in the file.
  274.  
  275. 2) Regular: when adding this sort of comment, it will appear only once, at the
  276.    location you've entered it.
  277.  
  278.  
  279. Marking Positions
  280. -----------------
  281.  
  282. Sometimes after disassembling for a while, you want to mark a location it
  283. could be the beginning of the data strings section, an Important function,
  284. your lucky number as an offset, whichever.
  285. IDA has a feature that let's you mark positions, and give the mark a name.
  286. to plant a mark, got the location you wish to mark, and then press Alt-M, or
  287. select "Mark Location" from the "Navigate" Menu, this will pop up a window,
  288. press enter on an empty line ( if there are no marked location, they will
  289. all be blank ), a dialog will appear asking what name you wish to give to that
  290. mark, this is NOT like generating a label for a location, only the marked
  291. positions table will show that name.
  292. To go to a marked position, select "Jump To/Marked Position" out of the
  293. "Navigate Menu", a list of marked positions will show up, choose the one you
  294. want to jump to and press ENTER.
  295.  
  296. Getting Around
  297. --------------
  298.  
  299. Sometimes You need to get around IDA, and you just can't be bothered to do it by
  300. pressing PgUp a 3-digit number of times.
  301. That's when you can use the "Navigate" menu, the sub menus you need are:
  302.  
  303. 1) Jump to: You can go to a specific address,function,string,segment,
  304.             entry point,cross reference, marked positions etc'.
  305.  
  306. 2) Search for: allows you to search for text, specific operands to an
  307.             instruction, next code/data/unexplored, etc'.
  308.  
  309. Exporting
  310. ---------
  311.  
  312. Those of us that write articles ( yeah, me too ), use IDA to rip code out
  313. and paste it into our text as examples.
  314. To do this you need to export the code you want to a file, and that is done
  315. by using the "File/Produce Output File" menu item.
  316. there are 3 options we care about right now:
  317.  
  318. 1) Produce ASM file: this will put out an .ASM file that you should be able
  319.    to feed TASM or MASM with.
  320.  
  321. 2) Produce LST file: same, but will also put segment:offset pairs into the
  322.    file, use this for articles.
  323.  
  324. 3) Produce DIF file: IDA can also server as a patcher, look at
  325.    "EDIT/Patch Program", if you modify the program and use this option
  326.    you will get a file similar to the output of the dos program "fc".
  327.  
  328.  
  329. Final Notes
  330. -----------
  331.  
  332. There is more to write about IDA, you should know that it has a scripting
  333. language, which let's you automate some rather mundane disassembling procedures.
  334. If you would like to learn more about IDA scripting, check the help file for
  335. syntax and a list of functions, and you can also get some very nice scripts
  336. at mammon's place.
  337.  
  338. For real-life examples of cracking with IDA i direct you to the normal place
  339. ( you know )m plenty of articles out there.
  340.  
  341. I Appreciate Input on my articles, comments and criticism, you can reach me
  342. on EFNET's #cracking4newbies, or at my email at gij <at sign> iname.com, i
  343. can't promise a reply, but i do read all my mail.
  344.  
  345. GREETZ
  346. ------
  347.  
  348. All The Guys (and girl) On #c4n: Never has so much newbiness been in the hands
  349.                                  of so few people.
  350.  
  351.     Gij.
  352.         yep.
  353.  
  354.