交响诗篇 发表于 2007-3-7 10:07:18

失业的娱乐-IDA逆向工程入门(二)-汇编程序(1)

作者:layper
【文章标题】: 失业的娱乐-IDA逆向工程入门(二)-汇编程序(1)
【文章作者】: layper
【作者邮箱】: [email protected]
【作者主页】: 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,      <[email protected]>            ?
; ?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

;
;
                  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
                  db54h      ; T
                  db20h
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db6Ah      ; j
                  db20h
                  db    0
                  db    0
                  db    8
                  db20h
                  db    0
                  db    0
                  db4Ch      ; L
                  db20h
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db84h      ; ?
                db20h
                  db    0
                  db    0
                  db    0
                  db20h
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db76h      ; v
                  db20h
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db5Ch      ; \
                  db20h
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db9Dh      ; ?
                db    1
                  db4Dh      ; M
                  db65h      ; e
                  db73h      ; s
                  db73h      ; s
                  db61h      ; a
                  db67h      ; g
                  db65h      ; e
                  db42h      ; B
                  db6Fh      ; o
                  db78h      ; x
                  db41h      ; A
                  db    0
                  db75h      ; u
                  db73h      ; s
                  db65h      ; e
                  db72h      ; r
                  db33h      ; 3
                  db32h      ; 2
                  db2Eh      ; .
                  db64h      ; d
                  db6Ch      ; l
                  db6Ch      ; l
                  db    0
                  db    0
                  db80h      ;

交响诗篇 发表于 2007-3-7 10:10:50

db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  db    0
                  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.

--------------------------------------------------------------------------------
【版权声明】: 本文原创于UnPacKcN论坛, 转载请注明作者并保持文章的完整, 谢谢!

avel 发表于 2007-3-27 12:34:41

??????????????

是楼主写的么?

如果是

我是很佩服哦!!!/:06

jisheng 发表于 2007-4-2 16:26:22

不错,学习啊.

zsl01 发表于 2008-9-17 14:03:47

估计是汇编语言,看不懂。

雲飛揚 发表于 2008-9-22 17:34:36

学习了,谢谢楼主,期待下一篇!

zsl01 发表于 2008-9-28 11:12:43

估计是汇编语言,看不懂

PIJIU 发表于 2010-3-8 08:44:35

这一块是楼主写的,后面的是复制粘贴的.

.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

garyye 发表于 2010-3-8 10:43:41

谢谢分享。。。
页: [1]
查看完整版本: 失业的娱乐-IDA逆向工程入门(二)-汇编程序(1)