标题:用IDA pro 反汇编分析第一个窗口程序====2楼部分更新
取消只看楼主
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
结帖率:92.31%
 问题点数:0 回复次数:4 
用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 编辑 ]
搜索更多相关主题的帖子: IDA pro 汇编 窗口 
2010-05-21 22:01
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
得分:0 
因为牵扯到一些前提知识,补充一下。
基本块:前面讲过 是一段没有分支的从头到尾可执行的最大指令块。
栈桢:是程序运行时在栈中分配的内存块,运行时创建 退出时收回。
      和栈桢有关的寄存器一般是esp和ebp。通过观察栈桢,可以了解
      函数或子程序的参数和内部分配的局部变量等。
交叉参考:某个已命名的位置,被其他地方引用,会以注释的形式表示出来。

---------------------------------------待补充

.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只列出在函数内部直接出现使用过的栈变量,
__stdcall 表明这是由函数自己清除栈空间。
上面这个栈桢,我们应该很熟悉,从右到左参数入栈,然后CALL,默认把返回地址
压入,然后压入ebp, 其结果为[ebp]为保存的ebp,[ebp+4]为返回地址,[ebp+8]为第一个参数。。。  保存过ebp以后,esp开辟栈空间,并始终指向栈顶,以ebp为
栈基址进行参数或者局部变量的寻址。dword ptr  8 这个形式是表示距离[ebp]的字节数。我们从这个栈桢可以看出,局部变量最终使用了多少个字节,也可以计算出详细的局部变量分配情况。



[ 本帖最后由 你们都要疼我哦 于 2010-5-23 12:04 编辑 ]

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2010-05-21 22:02
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
得分:0 
再占坑

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2010-05-21 22:02
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
得分:0 
多占一个

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2010-05-21 22:02
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
得分:0 
鼓足勇气再占一个

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2010-05-21 22:02



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-307653-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.136912 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved