- UID
- 26865
注册时间2007-2-17
阅读权限20
最后登录1970-1-1
以武会友
该用户从未签到
|
楼主 |
发表于 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论坛, 转载请注明作者并保持文章的完整, 谢谢! |
|