小默

[zz]失业的娱乐-IDA逆向工程入门(二)

【文章标题】: 失业的娱乐-IDA逆向工程入门(二)-汇编程序(1)
【文章作者】: layper
【作者邮箱】: layper@yahoo.com.cn
【作者主页】: http://blog.csdn.net/layper/
【下载地址】: 自己搜索下载
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  这个是第二篇,入门就要从最简单的开始!!!!!!!!
  
  为什么选汇编程序,因为在IDA逆向出来的就是汇编语言.所以选这个是最好入门的.在这之前你先准备好几样工具,IDA,masm32汇编工具包并安装好,
  在radasm设置好你的路径.
  
  (一)最简单的win32汇编程序源码
  hellow.asm
  
  .386
  .model flat,stdcall
  option casemap:none
  include WINDOWS.INC
  include user32.inc
  include kernel32.inc
  includelib user32.lib
  includelib kernel32.lib
  .data
  sztitle db "你好",0
  sztext db "你好!祝你有个好的开始!!!",0
  .code
  start:
  invoke MessageBox,NULL,offset sztext,offset sztitle,MB_OK
  invoke ExitProcess,NULL
  end start
  
  
  radasm默认编译.无资源段
  
  
  
  (二)IDA自动识别的反汇编代码(未优化直接保存)
  
  
  
  ;
  ; 赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?
; ?This file is generated by The Interactive Disassembler (IDA)      ?
; ?Copyright (c) 2006 by DataRescue sa/nv,  <ida@datarescue.com>      ?
; ?Licensed to: Paul Ashton - Blue Lane Technologies (1-user Advanced 03/2006)  ?s
  ; 韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?
;
  ; Input  MD5   :  10721E858F8E4DA3413D6FBFAE63E7B3
  
  ; File Name   :  D:\lyp\hellow\hellow.exe
  ; Format      :  Portable executable for  80386 (PE)
  ; Imagebase   :  400000
  ; Section 1. (virtual address 00001000)
  ; Virtual size      : 00000026 (   38.)
  ; Section size in file    : 00000200 (  512.)
  ; Offset to raw  data for section: 00000400
  ; Flags  60000020: Text Executable Readable
  ; Alignment  : default
  
      .686p
      .mmx
      .model flat
  
  ; 屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?

  ; Segment type:  Pure code
  ; Segment permissions: Read/Execute
  _text    segment  para public 'CODE' use32
      assume cs:_text
      ;org 401000h
      assume es:nothing, ss:nothing, ds:_data, fs:nothing, gs:nothing
  
  ; *************** S U B  R O U T  I N E ***************************************
  
  
      public start
  start    proc near
      push  0    ; uType
      push  offset Caption  ; "你好"
      push  offset Text  ; "你好!祝你有个好的开始!!!"
      push  0    ; hWnd
      call  MessageBoxA
  
      push  0    ; uExitCode
      call  ExitProcess
  
  start    endp
  
  ; [00000006 BYTES: COLLAPSED FUNCTION MessageBoxA. PRESS KEYPAD  "+" TO EXPAND]
  ; [00000006 BYTES: COLLAPSED FUNCTION ExitProcess. PRESS KEYPAD  "+" TO EXPAND]
      align 200h
  _text    ends
  
  ; Section 2. (virtual address 00002000)
  ; Virtual size      : 00000092 (  146.)
  ; Section size in file    : 00000200 (  512.)
  ; Offset to raw  data for section: 00000600
  ; Flags  40000040: Data Readable
  ; Alignment  : default
  ;
  ; Imports from kernel32.dll
  ;
  ; 屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?

  ; Segment type:  Externs
  ; _idata
  ; void __stdcall ExitProcess(UINT uExitCode)
      extrn __imp_ExitProcess:dword ;  DATA XREF: ExitProcessr
  
  ;
  ; Imports from user32.dll
  ;
  ; int __stdcall  MessageBoxA(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType)
      extrn __imp_MessageBoxA:dword ;  DATA XREF: MessageBoxAr
  
  
  ; 屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?

  ; Segment type:  Pure data
  ; Segment permissions: Read
  _rdata    segment  para public 'DATA' use32
      assume cs:_rdata
      ;org 402010h
      db  54h  ; T
      db  20h
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db  6Ah  ; j
      db  20h
      db    0
      db    0
      db    8
      db  20h
      db    0
      db    0
      db  4Ch  ; L
      db  20h
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db  84h  ; ?
    db  20h
      db    0
      db    0
      db    0
      db  20h
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db  76h  ; v
      db  20h
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db  5Ch  ; \
      db  20h
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db  9Dh  ; ?
    db    1
      db  4Dh  ; M
      db  65h  ; e
      db  73h  ; s
      db  73h  ; s
      db  61h  ; a
      db  67h  ; g
      db  65h  ; e
      db  42h  ; B
      db  6Fh  ; o
      db  78h  ; x
      db  41h  ; A
      db    0
      db  75h  ; u
      db  73h  ; s
      db  65h  ; e
      db  72h  ; r
      db  33h  ; 3
      db  32h  ; 2
      db  2Eh  ; .
      db  64h  ; d
      db  6Ch  ; l
      db  6Ch  ; l
      db    0
      db    0
      db  80h  ; ?
      db    0
      db  45h  ; E
      db  78h  ; x
      db  69h  ; i
      db  74h  ; t
      db  50h  ; P
      db  72h  ; r
      db  6Fh  ; o
      db  63h  ; c
      db  65h  ; e
      db  73h  ; s
      db  73h  ; s
      db    0
      db  6Bh  ; k
      db  65h  ; e
      db  72h  ; r
      db  6Eh  ; n
      db  65h  ; e
      db  6Ch  ; l
      db  33h  ; 3
      db  32h  ; 2
      db  2Eh  ; .
      db  64h  ; d
      db  6Ch  ; l
      db  6Ch  ; l
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
      db    0
  _rdata    ends
  
  ; Section 3. (virtual address 00003000)
  ; Virtual size      : 0000001E (   30.)
  ; Section size in file    : 00000200 (  512.)
  ; Offset to raw  data for section: 00000800
  ; Flags  C0000040: Data Readable  Writable
  ; Alignment  : default
  ; 屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?

  ; Segment type:  Pure data
  ; Segment permissions: Read/Write
  _data    segment  para public 'DATA' use32
      assume cs:_data
      ;org 403000h
  ; char Caption[]
  Caption    db '你好',0             ; DATA XREF: start+2o
  ; char Text[]
  Text    db '你好!祝你有个好的开始!!!',0 ; DATA XREF: start+7o
      align 200h
  _data    ends
  
  
      end start
  用radasm编译成功,不用修改!!!
  
  (三)比对文件
  
  (1)模式定义
  相同度:
  
  .386                                                .686p                      ;不同
  无                                                  .mmx
  .model flat,stdcall                                 .model flat        
  option casemap:none                                 无                         ;不同
  
  我的IDA默认的为686p模式,model语句无语言模式,无option语句.
  
  (2)inc文件,lib文件去向
  
  源文件中的
  include WINDOWS.INC
  include user32.inc
  include kernel32.inc
  includelib user32.lib
  includelib kernel32.lib
  消失在代码中,要寻找回他们!!
  这几个语句其实就是连接系统的dll文件的,在反汇编代码中寻找user32.dll,kernel32.dll,找到这里
  ; Imports from kernel32.dll
  ;
  ; 屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?
  
  ; Segment type:  Externs
  ; _idata
  ; void __stdcall ExitProcess(UINT uExitCode)
      extrn __imp_ExitProcess:dword ;  DATA XREF: ExitProcessr
  
  ;
  ; Imports from user32.dll
  ;
  ; int __stdcall  MessageBoxA(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType)
      extrn __imp_MessageBoxA:dword ;  DATA XREF: MessageBoxAr
  
  注释很明白了,输入表有两个dll在_idata段,include语句的在_idata段找寻.
  
  (3)段定义的变化
  源代码中段定义是这样
  .段名
  而反汇编中的段定义
  段名    segment  para public 'DATA' use32
      assume cs:_data
  段名    ends
  传统的dos汇编写法.
  
  (4)段的增减
  我们通过比对,发现段的数量跟我们原本的不一致
  原本我们只有两个段
  .data和.code段,而反汇编后变成
  .text和.idata和.rdata和.data段
  经过仔细辨认你就可以发现
  反汇编的text段就是源代码中的.code段,data段是代码段,.idata和.rdata是编译器生成的,而idata是寻找include语句的地方,
  .idata基本没什么用处,可以删掉.
  
  (5)数据段
  通过比对发现基本上一致无什么增加,增加了一个    align 200h
  删掉即可.
  
  (6)代码段变化
  入口函数变化
                  public start
  start    proc near
      push  0    ; uType
      push  offset Caption  ; "你好"
      push  offset Text  ; "你好!祝你有个好的开始!!!"
      push  0    ; hWnd
      call  MessageBoxA
  
      push  0    ; uExitCode
      call  ExitProcess
  
  start    endp
  
  。。。。。。
  
  。。。。。。。
  
      end start
  
  注意end start放在了所有段后面
  
  到这里我们大体上看完这个程序反汇编的大体轮廓。
  
--------------------------------------------------------------------------------
【经验总结】
  (1)模式定义少了语言模式和opention语句,我们要看情况是否加回上去。
  (2)include语句寻找_idata中的dll名,得到常用包含库文件.
  (3).rdate段不用看,可以删掉
  (4)入口开始处寻找start.
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2007年03月02日 13:56:14

posted on 2009-12-25 12:10 小默 阅读(658) 评论(0)  编辑 收藏 引用 所属分类: Tools


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

留言簿(13)

随笔分类(287)

随笔档案(289)

漏洞

搜索

积分与排名

最新评论

阅读排行榜