用IDA pro 反汇编分析第一个窗口程序====2楼部分更新
前面的废话:虽然说这些东西看了甚至是学了以后,比较让人沮丧----因为学的越多,越感觉自己啥都不懂,但是还是要学啊,学了看了总比不学不看的强。了解这些对理解win32汇编有很大的帮助,对于以后想从事软件安全和系统底层的工作的朋友,也可以先了解一下。 还是希望能有更多的朋友看看学学,大家共同进步。我也刚开始弄了几天,感觉挺有意思的。
=================================================
说起IDA ,真是一件伤心事。一直都想学习用的,可每次一打开,看到满眼的按钮和窗口,就头晕,然后就关上。。。就这样过了好多好多年。
最近感觉头脑比较灵活了,估计是吃了那么久的脑残片,见了效果。所以又找出来IDA。看看用IDA打开第一个窗口程序是啥样。
写这个帖子基本上没啥主要目的,说逆向呢 又有源码,说看反汇编呢 结果又和
win32的代码区别不大,说是学习IDA呢 我也只是会打开它的界面而已。。。也就是没事闲的蛋疼 打字磨磨指甲。。。写这个困难很大,因为好多东西很难表述清楚明白,所以不知道会写到哪儿就蹬腿了,尽量多写吧。
===========================================================
源代码经过相应的编译器处理以后,成为2进制文件,win32系统下就是符合PE规范的2进制文件。通常的2进制文件,是没有源代码来参照的。我们出于学习的目的,
用有源码的这个窗口程序来分析。
程序代码:
.text:00401000 ; .text:00401000 ; +-------------------------------------------------------------------------+ .text:00401000 ; | This file has been generated by The Interactive Disassembler (IDA) | .text:00401000 ; | Copyright (c) 2009 by Hex-Rays, <support@ .text:00401000 ; | License info: DE-69EF-47B4-12 | .text:00401000 ; | Licensed User | .text:00401000 ; +-------------------------------------------------------------------------+ .text:00401000 ; .text:00401000 ; Input MD5 : 02BDBF81D93D5D0251D5D7FFAE1F7627 .text:00401000 .text:00401000 ; File Name : C:\Documents and Settings\Administrator\桌面\90FirstWindow.exe .text:00401000 ; Format : Portable executable for 80386 (PE) .text:00401000 ; Imagebase : 400000 .text:00401000 ; Section 1. (virtual address 00001000) .text:00401000 ; Virtual size : 000001DC ( 476.) .text:00401000 ; Section size in file : 00000200 ( 512.) .text:00401000 ; Offset to raw data for section: 00000400 .text:00401000 ; Flags 60000020: Text Executable Readable .text:00401000 ; Alignment : default .text:00401000 .text:00401000 .686p .text:00401000 .mmx .text:00401000 .model flat .text:00401000 .text:00401000 ; =========================================================================== .text:00401000 .text:00401000 ; Segment type: Pure code .text:00401000 ; Segment permissions: Read/Execute .text:00401000 _text segment para public 'CODE' use32 .text:00401000 assume cs:_text .text:00401000 ;org 401000h .text:00401000 assume es:nothing, ss:nothing, ds:_data, fs:nothing, gs:nothing .text:00401000 .text:00401000 ; =============== S U B R O U T I N E ======================================= .text:00401000 .text:00401000 ; Attributes: bp-based frame .text:00401000 .text:00401000 ; int __stdcall sub_401000(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) .text:00401000 sub_401000 proc near ; DATA XREF: sub_401089+43o .text:00401000 .text:00401000 hdc = dword ptr -54h .text:00401000 Rect = tagRECT ptr -50h .text:00401000 Paint = tagPAINTSTRUCT ptr -40h .text:00401000 hWnd = dword ptr 8 .text:00401000 Msg = dword ptr 0Ch .text:00401000 wParam = dword ptr 10h .text:00401000 lParam = dword ptr 14h .text:00401000 .text:00401000 push ebp .text:00401001 mov ebp, esp .text:00401003 add esp, 0FFFFFFACh .text:00401006 push ebx .text:00401007 push edi .text:00401008 push esi .text:00401009 mov eax, [ebp+Msg] .text:0040100C cmp eax, 0Fh .text:0040100F jnz short loc_40104F .text:00401011 lea eax, [ebp+Paint] .text:00401014 push eax ; lpPaint .text:00401015 push [ebp+hWnd] ; hWnd .text:00401018 call BeginPaint .text:0040101D mov [ebp+hdc], eax .text:00401020 lea eax, [ebp+Rect] .text:00401023 push eax ; lpRect .text:00401024 push [ebp+hWnd] ; hWnd .text:00401027 call GetClientRect .text:0040102C push 25h ; format .text:0040102E lea eax, [ebp+Rect] .text:00401031 push eax ; lprc .text:00401032 push 0FFFFFFFFh ; cchText .text:00401034 push offset chText ; "Win32 Assembly, Simple and powerful !" .text:00401039 push [ebp+hdc] ; hdc .text:0040103C call DrawTextA .text:00401041 lea eax, [ebp+Paint] .text:00401044 push eax ; lpPaint .text:00401045 push [ebp+hWnd] ; hWnd .text:00401048 call EndPaint .text:0040104D jmp short loc_401080
用IDA打开第一个窗口程序以后,默认是图形界面,按空格,转换为反汇编窗口,
可以看到,从00401000开始,记得好象默认装载是400000,为什么多了1000呢?
又记得似乎是和重定位块有关,具体可以看看重定位表那部分。
重点来看这部分:
.text:00401000 ; Attributes: bp-based frame 以EBP为栈指针。
.text:00401000
.text:00401000 ; int __stdcall sub_401000(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
.text:00401000 sub_401000 proc near ; DATA XREF: sub_401089+43o
.text:00401000
.text:00401000 hdc = dword ptr -54h
.text:00401000 Rect = tagRECT ptr -50h
.text:00401000 Paint = tagPAINTSTRUCT ptr -40h
.text:00401000 hWnd = dword ptr 8
.text:00401000 Msg = dword ptr 0Ch
.text:00401000 wParam = dword ptr 10h
.text:00401000 lParam = dword ptr 14h
IDA里有个基本块的概念,基本块就是连续执行的一串指令,没有任何分支,只要基本块中第一条指令执行,那么这个基本块的最后一条指令也肯定会被执行到。
IDA是很智能的,它通过前期分析,已经将00401000开始的一段代码标记为基本块,
并给它取名为sub_401000 甚至认出了这个基本块所需的参数(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)。
但是这个基本块是干什么的呢?我们还不知道,然后看下面这一句
.text:00401000 sub_401000 proc near ; DATA XREF: sub_401089+43o
IDA给出的注释很强大,DATA XREF: sub_401089+43o 这个表示,这个基本块以数据的形式(奇怪 怎么不是代码形式呢)被sub_401089+43这个位置引用,O表示是偏移量引用,类似的,还可能有j 跳转引用,P 函数调用引用。
我们先去sub_401089+43看看,
.text:004010CC mov [ebp+var_30.lpfnWndProc], offset sub_401000
这一看就明白了,回想一下源码,lpfnWndProc很熟悉吧。那么offset sub_401000
自然就是那个啥了吧。。。
知道了sub_401000基本块的用途,那么自然就很容易分析了。
继续看,
.text:00401000 hdc = dword ptr -54h
.text:00401000 Rect = tagRECT ptr -50h
.text:00401000 Paint = tagPAINTSTRUCT ptr -40h
.text:00401000 hWnd = dword ptr 8
.text:00401000 Msg = dword ptr 0Ch
.text:00401000 wParam = dword ptr 10h
.text:00401000 lParam = dword ptr 14h
这部分就是IDA自动分析出来的这个基本块(说成函数也可以吧)所使用的栈桢概况。
休息。。。
[ 本帖最后由 你们都要疼我哦 于 2010-5-23 15:28 编辑 ]