第四章 逆向分析技术

4.1.1 启动函数

004013A0 >/$ 55 push ebp
004013A1 |. 8BEC mov ebp,esp
004013A3 |. 6A FF push -0x1
004013A5 |. 68 D0404000 push TraceMe.004040D0
004013AA |. 68 D41E4000 push TraceMe.00401ED4 ; SE 处理程序安装
004013AF |. 64:A1 0000000>mov eax,dword ptr fs:[0]
004013B5 |. 50 push eax
004013B6 |. 64:8925 00000>mov dword ptr fs:[0],esp
004013BD |. 83EC 58 sub esp,0x58
004013C0 |. 53 push ebx
004013C1 |. 56 push esi
004013C2 |. 57 push edi
004013C3 |. 8965 E8 mov [local.6],esp
004013C6 |. FF15 44404000 call dword ptr ds:[<&KERNEL32.GetVersion>; kernel32.GetVersion
004013CC |. 33D2 xor edx,edx ; ntdll.KiFastSystemCallRet
004013CE |. 8AD4 mov dl,ah
004013D0 |. 8915 28554000 mov dword ptr ds:[0x405528],edx ; ntdll.KiFastSystemCallRet
004013D6 |. 8BC8 mov ecx,eax
004013D8 |. 81E1 FF000000 and ecx,0xFF
004013DE |. 890D 24554000 mov dword ptr ds:[0x405524],ecx
004013E4 |. C1E1 08 shl ecx,0x8
004013E7 |. 03CA add ecx,edx ; ntdll.KiFastSystemCallRet
004013E9 |. 890D 20554000 mov dword ptr ds:[0x405520],ecx
004013EF |. C1E8 10 shr eax,0x10
004013F2 |. A3 1C554000 mov dword ptr ds:[0x40551C],eax ; (\n
004013F7 |. 33F6 xor esi,esi
004013F9 |. 56 push esi
004013FA |. E8 A1090000 call TraceMe.00401DA0
004013FF |. 59 pop ecx ; kernel32.7C817077
00401400 |. 85C0 test eax,eax
00401402 |. 75 08 jnz short TraceMe.0040140C
00401404 |. 6A 1C push 0x1C
00401406 |. E8 B0000000 call TraceMe.004014BB
0040140B |. 59 pop ecx ; kernel32.7C817077
0040140C |> 8975 FC mov [local.1],esi
0040140F |. E8 E1070000 call TraceMe.00401BF5
00401414 |. FF15 40404000 call dword ptr ds:[<&KERNEL32.GetCommand>; [GetCommandLineA
0040141A |. A3 185A4000 mov dword ptr ds:[0x405A18],eax
0040141F |. E8 9F060000 call TraceMe.00401AC3
00401424 |. A3 04554000 mov dword ptr ds:[0x405504],eax
00401429 |. E8 48040000 call TraceMe.00401876
0040142E |. E8 8A030000 call TraceMe.004017BD
00401433 |. E8 A7000000 call TraceMe.004014DF
00401438 |. 8975 D0 mov [local.12],esi
0040143B |. 8D45 A4 lea eax,[local.23]
0040143E |. 50 push eax ; /pStartupinfo = NULL
0040143F |. FF15 3C404000 call dword ptr ds:[<&KERNEL32.GetStartup>; \GetStartupInfoA
00401445 |. E8 1B030000 call TraceMe.00401765
0040144A |. 8945 9C mov [local.25],eax
0040144D |. F645 D0 01 test byte ptr ss:[ebp-0x30],0x1
00401451 |. 74 06 je short TraceMe.00401459
00401453 |. 0FB745 D4 movzx eax,word ptr ss:[ebp-0x2C]
00401457 |. EB 03 jmp short TraceMe.0040145C
00401459 |> 6A 0A push 0xA
0040145B |. 58 pop eax ; kernel32.7C817077
0040145C |> 50 push eax
0040145D |. FF75 9C push [local.25]
00401460 |. 56 push esi
00401461 |. 56 push esi ; /pModule = ""
00401462 |. FF15 38404000 call dword ptr ds:[<&KERNEL32.GetModuleH>; \GetModuleHandleA
00401468 |. 50 push eax
00401469 |. E8 92FBFFFF call TraceMe.00401000 Main 函数

4.1.2 函数

1.函数的识别

call 函数 跳转至 函数位置并将 下一条指令地址 入栈 用于return

2.函数的参数

(1) 利用栈 传递参数

三种调用约定

利用 ebp 存储esp 值指向栈顶,访问参数

ebp+ x=> 参数

ebp-x=>局部变量

(2)利用寄存器传递参数 (fastcall)

没有标准,由编译器开发人员制定

3.函数的返回值

一般情况放置在eax寄存器中,当返回值过大,高32位会放到edx寄存器中

也可以按传引用的方式传回返回值

00401000 /$ 83EC 08 sub esp,0x8  // 为 变量分配栈空间
00401003 |. 8D4424 04 lea eax,dword ptr ss:[esp+0x4]
00401007 |. 8D4C24 00 lea ecx,dword ptr ss:[esp] // eax ecx分别指向 两个变量
0040100B |. 50 push eax
0040100C |. 51 push ecx ; // eax ecx 做为参数 入栈
0040100D |. C74424 08 050>mov dword ptr ss:[esp+0x8],0x5
00401015 |. C74424 0C 060>mov dword ptr ss:[esp+0xC],0x6 //为eax ecx 指向位置 赋值
0040101D |. E8 1E000000 call return.00401040

函数 代码

00401040 /$ 8B4424 08 mov eax,dword ptr ss:[esp+0x8]
00401044 |. 8B4C24 04 mov ecx,dword ptr ss:[esp+0x4] //获取地址
00401048 |. 8B00 mov eax,dword ptr ds:[eax]
0040104A |. 8B11 mov edx,dword ptr ds:[ecx] //从地址内读值
0040104C |. 3BD0 cmp edx,eax
0040104E |. 7D 02 jge short return.00401052
00401050 |. 8901 mov dword ptr ds:[ecx],eax //如果 edx 小于eax,将 eax的值,赋值给 ecx 指向的位置
00401052 > C3 retn

4.1.3数据结构

1.菊部变量 (雾

(1)利用栈存放局部变量

(2)利用寄存器

2.全橘变量(雾

通常位于数据区块(.data)的一个固定地址处

3.数组

通过基址加变址访问。

4.14 虚函数

对象的东西完全忘掉了,具体在内存时怎么存储的也不记得了…本节 先放着,回头看了另一本小黄书(封面为黄色的书 《C++反汇编与逆向分析技术揭秘》)回来补上…

4.15 控制语句

1.IF-THEN-ELSE语句

cmp a,b

jz (jnz) xxxx

2.Switch 语句

本质为多个IF THEN 语句嵌套

未优化

0040101D |. 837D F8 01 cmp [local.2],0x1
00401021 |. 74 0E je short 未优化编.00401031
00401023 |. 837D F8 02 cmp [local.2],0x2
00401027 |. 74 17 je short 未优化编.00401040
00401029 |. 837D F8 0A cmp [local.2],0xA
0040102D |. 74 20 je short 未优化编.0040104F

优化

00401017 |. 48 dec eax ; Switch (cases 1..A)
00401018 |. 74 3B je short 优化编译.00401055
0040101A |. 48 dec eax
0040101B |. 74 27 je short 优化编译.00401044
0040101D |. 83E8 08 sub eax,0x8
00401020 |. 74 11 je short 优化编译.00401033

把 cmp 替换成 dec 和 sub 0x8,判断是否等于0,如果输入的数值为1,dec 一次 就等于0,可以判断输入的数值为1,以此类推

dec 指令更短,执行速度更快。

跳转表:

00401010 |. 8B4C24 08 mov ecx,dword ptr ss:[esp+0x8]
00401014 |. 83C4 08 add esp,0x8
00401017 |. 8D41 FF lea eax,dword ptr ds:[ecx-0x1] ; Switch (cases 1..7)
0040101A |. 83F8 06 cmp eax,0x6 //判断 eax -1 是否大于6,如果大于6 为默认情况。
0040101D |. 77 7E ja short switch.0040109D 默认情况跳转
0040101F |. FF2485 B01040>jmp dword ptr ds:[eax*4+0x4010B0] ; switch.00401048

先判断非 default 的情况,然后 从跳转表的基址算起, 用数值乘以4并相加跳转到相应位置

3.转移指令

短转移:无条件及有条件转移机器码均为2字节

无条件:EB00h~EB7Fh 向后转移, 80h~FFh向前转移

长转移:无转移的机器码为5字节,条件转移为6字节

无条件:机器码E9

4.条件设置指令

若符合条件,置1,否则置0

00401000 /$ 68 30604000 push 4_5_5.00406030 ; /Title = "计算器"
00401005 |. 6A 00 push 0x0 ; |Class = 0x0
00401007 |. FF15 9C504000 call dword ptr ds:[<&USER32.FindWindowA>>; \FindWindowA
0040100D |. F7D8 neg eax
0040100F |. 1BC0 sbb eax,eax
00401011 |. 24 FC and al,0xFC
00401013 |. 83C0 05 add eax,0x5

neg EAX 判断 eax 是否为0 ,结果存入 CF 标志位

sbb eax,eax = 0 – CF 不是0 为0,非0 为1, 如果CF 为1, eax为 -1,否则为0.

and 0xFC

如果 eax 为-1, and 结果为-4, 如果eax 为0, 结果为0.

eax 结果为 -4, +5 后为1, 结果为0,加5后为5.

4.1.6 循环语句

利用ecx 作为计数器

优化后

感觉这个优化后直接变成while 循环了…

4.1.7数学运算符

  1. 整数 加法减法

一般情况,编译为 add sub指令,

优化的情况下可以编译为lea 指令

2. 整数乘法

一般被编译为 imul,或mul 指令,

2的指数幂可以做左移运算。

3.整数的除法

可以被编译为div 和idiv 指令

cdq 用于扩展位数,将eax的最高位扩展到 edx 中,即若eax 最高位为1,edx全为1,若为0,edx全为0

还有很多的除法优化运算。

评论

  1. 大漠苍鹰
    10月前
    2021-1-08 10:07:19

    👍

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇