第二章 动态分析技术

2.1.3 基本操作 Trace Me 分析

查看TraceMe的模块

可以看到有GetDlgItemTextA, 获取文本框内数据的函数,我们可以在这里下断点。

F7 进入 入口点:

00401469 |. E8 92FBFFFF call TraceMe.00401000

00401000 /$ 8B4424 04 mov eax,dword ptr ss:[esp+0x4] ; TraceMe.00400000
00401004 |. 6A 00 push 0x0 ; /lParam = NULL
00401006 |. 68 D0104000 push TraceMe.004010D0 ; |DlgProc = TraceMe.004010D0
0040100B |. 6A 00 push 0x0 ; |hOwner = NULL
0040100D |. 6A 65 push 0x65 ; |pTemplate = 0x65
0040100F |. 50 push eax ; |hInst = 00400000
00401010 |. A3 E0544000 mov dword ptr ds:[0x4054E0],eax ; |TraceMe.00400000
00401015 |. FF15 C8404000 call dword ptr ds:[<&USER32.DialogBoxPar>; \DialogBoxParamA

调用窗口函数,弹出窗口

程序主窗口,随意输入用户名及密码

点击Check,程序停在 GetDlgItemTextA 处

通过GetDlgItemTextA的参数我们可以得知 存放 用户名与序列号的 内存地址为

0012FA8C, (ASCII “abcdef”)

0012FADC, (ASCII “wobuzhidao”)

我们继续运行跑过第二次调用然后 Ctrl F9 执行到return 处,单步执行出来,来到主程序内。

我们可以看到 用户名被 复制了第一个byte 到al 中进行比较判断 用户名是否为空,以及判断用户名的长度 (为GetDlgItemTextA返回值,在 EBX中)

我们输入的用户名和序列号被 分别lea 到edx 和 eax 内,以及 ebx (用户名长度)被入栈作为下面函数的参数,可以猜到这个函数应该就是计算序列号的地方,需要重点关注。我们单步F7进入

然后可以看到算法部分,说实话不看书上的解析我估计要看好久才能看出来 循环变量…

首先 edi 被赋值为 len (用户名长度)

ecx = 3 eax = 0

如果ecx 小于 edi, 继续执行,否则跳转。结束序列号生成。

push ebx (ebx 另有他用,所以先备份一下ebx值,入栈)

eax 与 7 作比较,如果小于7 ,继续执行,否则将eax 置零

将 ecx ebx 置零,

00401364 |. 8A1429 |mov dl,byte ptr ds:[ecx+ebp]
00401367 |. 8A98 30504000 |mov bl,byte ptr ds:[eax+0x405030]

ebp 指向地址存储用户名,ebp+ecx 即 用户名的第ecx+1个字母,本例中第一次循环为d

下一行代码中 第一次循环eax 为0, 0x405030 指向一个全局变量,为0C,可见 0x405030存着 一个数组,包含7个 数据。

0040136D |. 0FAFD3 |imul edx,ebx
00401370 |. 03F2 |add esi,edx

第4个字母的值,与 全局变量中的第一个值相乘,并加入 esi 中,第一次循环esi 为0

ecx, eax ++,然后进入下一次循环。

到此算法应该比较清楚了,从用户名的第四个字母开始

第四个字母 * 全局变量中的第一个

第五个字母*全局变量中的第二个

以此类推并把结果相加,就可以得出序列号了。

继续执行,我们可以直接在lstrcmpA中看到明文的序列号,4148, 和我们自己输入的。

我们可以通过算法写出注册机。也可以直接对程序进行爆破。

程序验证成功就不会跳转,我们可以直接把这个跳转nop掉。即任何情况都不会跳转,自然我们输入任何数据都可以 “恭喜你,成功”了

2.1.4 常用断点

  • INT3 断点, 替换断点位置内容为 0xCC 触发调试器异常来中断程序。

优点:可以下无数个断点

缺点:容易被检测

  • 硬件断点:利用硬件寄存器下断
  • 内存断点 : 对所设地址 赋予不可访问,不可写属性来触发异常
  • 内存访问一次性断点: 在内存段上下断点
  • 消息断点

下断后程序会停在 系统领空,在 内存界面中,对text 内存段下访问断点,并执行程序,就会停在程序领空了。

  • 条件断点
    • 按寄存器条件中断
    • 按储存器条件下断
按Shift F2 下断

储存器下断:bp CreateFileA,[STRING [esp+4]]==”c:\1212.txt”

  • 条件记录断点

Shift F4,

记录的数据会在Log中

评论

  1. 大漠苍鹰
    10月前
    2021-1-07 13:17:51

    挺专业啊

发送评论 编辑评论


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