这次在破解TraceMe的时候,我有看过别人的视频。但是我并没有按照别人思路走,而是完全安全自己的思路试了一次。结果破解成功。新手学破解,如果有不对的地方,还请指出来。

004013A0 crackmes.<ModuleEntryPoint>        /$                                   push    ebp ; EP入口
004013A1 |. 8BEC mov ebp, esp ;保护数据,入栈。方便程序结束后返回
004013A3 |. 6A FF push -
004013A5 |. D0404000 push 004040D0
004013AA |. D41E4000 push 00401ED4 ; SE handler installation
004013AF |. :A1 mov eax, dword ptr fs:[]
004013B5 |. push eax
004013B6 |. : mov dword ptr fs:[], esp
004013BD |. 83EC sub esp,
004013C0 |. push ebx ;将参数压入桟
004013C1 |. push esi ;将参数压入桟
004013C2 |. push edi ;将参数压入桟
004013C3 |. E8 mov dword ptr ss:[ebp-], esp ;将当前桟数据取出保存地址
004013C6 |. FF15 call near dword ptr ds:[<&KERNEL32.Ge>; kernel32.GetVersion ;调用
004013CC |. 33D2 xor edx, edx ;Edx清0
004013CE |. 8AD4 mov dl, ah
004013D0 |. mov dword ptr ds:[], edx
004013D6 |. 8BC8 mov ecx, eax
004013D8 |. 81E1 FF000000 and ecx, 0FF
004013DE |. 890D mov dword ptr ds:[], ecx
004013E4 |. C1E1 shl ecx,
004013E7 |. 03CA add ecx, edx
004013E9 |. 890D mov dword ptr ds:[], ecx
004013EF |. C1E8 shr eax,
004013F2 |. A3 1C554000 mov dword ptr ds:[40551C], eax
004013F7 |. 33F6 xor esi, esi ;清0
004013F9 |. push esi ;将输入压桟
004013FA |. E8 A1090000 call 00401DA0 ;跟进去以后发现是heapcreate函数。创建辅助堆栈
004013FF |. pop ecx ;将ECX值取出
|. 85C0 test eax, eax ;比较EAX值,这个时候值永远是成立的。 垃圾指令,跳过
|. jnz short 0040140C ;EIP指向: 0040140C
|. 6A 1C push 1C
|. E8 B0000000 call 004014BB
0040140B |. pop ecx
0040140C |> FC mov dword ptr ss:[ebp-], esi
0040140F |. E8 E1070000 call 00401BF5
|. FF15 call near dword ptr ds:[<&KERNEL32.Ge>; [GetCommandLineA ;调用API
0040141A |. A3 185A4000 mov dword ptr ds:[405A18], eax
0040141F |. E8 9F060000 call 00401AC3
|. A3 mov dword ptr ds:[], eax
|. E8 call ;CALL没一个一个跟了,直接单步补过
0040142E |. E8 8A030000 call 004017BD
|. E8 A7000000 call 004014DF ;CALL没一个一个跟了,直接单步补过
|. D0 mov dword ptr ss:[ebp-], esi
0040143B |. 8D45 A4 lea eax, dword ptr ss:[ebp-5C] ;数据入栈,然后调用API
0040143E |. push eax ; /pStartupinfo
0040143F |. FF15 3C404000 call near dword ptr ds:[<&KERNEL32.Ge>; \GetStartupInfoA
|. E8 1B030000 call
0040144A |. 9C mov dword ptr ss:[ebp-], eax
0040144D |. F645 D0 test byte ptr ss:[ebp-],
|. je short
|. 0FB745 D4 movzx eax, word ptr ss:[ebp-2C]
|. EB jmp short 0040145C
|> 6A 0A push 0A 数据入栈,然后调用API
0040145B |. pop eax
0040145C |> push eax
0040145D |. FF75 9C push dword ptr ss:[ebp-]
|. push esi
|. push esi ; /pModule
|. FF15 call near dword ptr ds:[<&KERNEL32.Ge>; \GetModuleHandleA 数据入栈,然后调用API
|. push eax
|. E8 92FBFFFF call ;当运行到 程序弹出。

7E46B05E USER32.GetDlgItemTextA                 8BFF                               mov     edi, edi                         ;  USER32.GetDlgItemTextA  API地址
7E46B060 /. push ebp ;保存地址
7E46B061 |. 8BEC mov ebp, esp
7E46B063 |. FF75 0C push dword ptr ss:[ebp+C] ; /ControlID 参数入栈, ControlID
7E46B066 |. FF75 push dword ptr ss:[ebp+] ; |hWnd 参数入栈,hWnd
7E46B069 |. E8 0093FBFF call GetDlgItem ; \GetDlgItem 调用API,GetDlgItem。返回窗口中指定参数ID的子元素的句柄
7E46B06E |. 85C0 test eax, eax ;通过比较,判断以上是否正常,
7E46B070 |. 0E je short 7E46B080 ;标志位没改变。跳转没实现 继续走
7E46B072 |. FF75 push dword ptr ss:[ebp+] ; /Count 参数入栈
7E46B075 |. FF75 push dword ptr ss:[ebp+] ; |Buffer 参数入栈
7E46B078 |. push eax ; |hWnd 参数入栈
7E46B079 |. E8 ED70FCFF call GetWindowTextA ; \GetWindowTextA ;函数原形为:GetDlgItem(控件ID)->GetWindowText(eax); 7E46B07E |. EB 0E jmp short 7E46B08E ;段间短跳转。无条件跳到7E46B08E
7E46B080 |> 837D cmp dword ptr ss:[ebp+],
7E46B084 |. je short 7E46B08C
7E46B086 |. 8B45 mov eax, dword ptr ss:[ebp+]
7E46B089 |. C600 mov byte ptr ds:[eax],
7E46B08C |> 33C0 xor eax, eax
7E46B08E |> 5D pop ebp 将bp基址指针取出。
7E46B08F \. C2 retn RETURN to crackmes.004011B6

004011B6                                     .  8D8C24 9C000000                    lea     ecx, dword ptr ss:[esp+9C]
004011BD . 6A push ; /Count = (.) 将参数入栈
004011BF . push ecx ; |Buffer
004011C0 . E8030000 push 3E8 ; |ControlID = 3E8 (.)
004011C5 . push esi ; |hWnd
004011C6 . 8BD8 mov ebx, eax ; |
004011C8 . FFD7 call near edi ; \GetDlgItemTextA 返回到 GetDlgItemTextA 地址

//又进入了7E46B05E这个地址了。

7E46B05E USER32.GetDlgItemTextA                 8BFF                               mov     edi, edi
7E46B060 /. push ebp
7E46B061 |. 8BEC mov ebp, esp
7E46B063 |. FF75 0C push dword ptr ss:[ebp+C] ; /ControlID
7E46B066 |. FF75 push dword ptr ss:[ebp+] ; |hWnd
7E46B069                                    |.  E8 0093FBFF                        call    GetDlgItem                       ; \GetDlgItem
7E46B06E |. 85C0 test eax, eax
7E46B070 |. 0E je short 7E46B080
7E46B072 |. FF75 push dword ptr ss:[ebp+] ; /Count
7E46B075 |. FF75 push dword ptr ss:[ebp+] ; |Buffer
7E46B078 |. push eax ; |hWnd
7E46B079 |. E8 ED70FCFF call GetWindowTextA ; \GetWindowTextA
7E46B07E |. EB 0E jmp short 7E46B08E
7E46B080  |> 837D cmp dword ptr ss:[ebp+],
7E46B084                                    |.                                 je      short 7E46B08C
7E46B086 |. 8B45 mov eax, dword ptr ss:[ebp+]
7E46B089 |. C600 mov byte ptr ds:[eax],
7E46B08C |> 33C0 xor eax, eax
7E46B08E |> 5D pop ebp 改变基址指针
7E46B08F \. C2 retn ; 返回到 004011CA

004011CA                                     .  8A4424 4C                          mov     al, byte ptr ss:[esp+4C]
004011CE . 84C0 test al, al ;比较AL值
004011D0 . je short
004011D2 . 83FB cmp ebx, ;比较偏移地址值。应该就是我们输入的admin长度的值?
004011D5 . 7C jl short ; 我们来让他进行跳转,更改标志位
004011D7 . 8D5424 4C lea edx, dword ptr ss:[esp+4C] ;桟中取数据。
004011DB . push ebx ;将数据依次取出在压入桟。
004011DC . 8D8424 A0000000 lea eax, dword ptr ss:[esp+A0]
004011E3 . push edx;
这儿其实就相当于:
fucntion: xxxoo Cstring username = GetDlgItemTextA(idc1);
Cstring password = GetDlgItemTextA(idc2); if(lstrlen(username) > || lstrlen(password) > )
{
xxoo(username,password)
}
004011E4                                     .                                   push    eax  将数据依次取出在压入桟。
004011E5 . E8 call ;这儿是个WSprintfW调用。将用户写入到了另外一个变量里
004011EA . 8B3D BC404000 mov edi, dword ptr ds:[<&USER32.GetD>; USER32.GetDlgItem ;调用API
004011F0 . 83C4 0C add esp, 0C ;将桟大小抬高。
004011F3 . 85C0 test eax, eax ;比较返回值,跳转成立,标志位改变、。
004011F5 . je short 0040122E ;条件跳转。 该标志位,继续往下走。
004011F7 . 8D4C24 0C lea ecx, dword ptr ss:[esp+C]
004011FB . push ecx ; /String2
004011FC . E4544000 push 004054E4 ; |String1 = crackmes.004054E4;开辟空间
. FF15 call near dword ptr ds:[<&KERNEL32.ls>; \lstrcpyA ;拷贝字符串。
. 6A push ; /Enable = FALSE
. 6A 6E push 6E ; |/ControlID = 6E (.)
0040120B . push esi ; ||hWnd
0040120C . FFD7 call near edi ; |\GetDlgItem API参数,这儿做的应该就是将我们控件获取的字符串复制给了其他的变量了。
0040120E . 8B1D A4404000 mov ebx, dword ptr ds:[<&USER32.Enab>; |USER32.EnableWindow
. push eax ; |hWnd
. FFD3 call near ebx ; \EnableWindow
. 6A push ; /Enable = FALSE
. E8030000 push 3E8 ; |/ControlID = 3E8 (.)
0040121E . push esi ; ||hWnd
0040121F . FFD7 call near edi ; |\GetDlgItem
. push eax ; |hWnd
. FFD3 call near ebx ; \EnableWindow
. E8030000 push 3E8 ; /ControlID = 3E8 (.)
. push esi ; |hWnd
0040122A . FFD7 call near edi ; \GetDlgItem
0040122C . EB jmp short ;字符串拷贝完毕,准备跳转。

                                     >                                   push    eax                              ; /hWnd
. FF15 A8404000 call near dword ptr ds:[<&USER32.SetF>; \SetFocus
. 6A push ; /BeepType = MB_OK
0040126A . FF15 AC404000 call near dword ptr ds:[<&USER32.Mess>; \MessageBeep
. 8B0D E0544000 mov ecx, dword ptr ds:[4054E0] ; crackmes.
. 6A push ; /lParam = NULL
. push ; |DlgProc = crackmes.
0040127D . push esi ; |hOwner
0040127E . 6A push ; |pTemplate =
. push ecx ; |hInst =>
. FF15 C8404000 call near dword ptr ds:[<&USER32.Dial>; \DialogBoxParamA 继续调用API,成功破解完毕。

逆向破解学习二之<TraceMe>的更多相关文章

  1. 20155305《网络对抗》PC平台逆向破解(二)

    20155305<网络对抗>PC平台逆向破解(二) shellcode注入 1.shellcode shellcode是一段代码,溢出后,执行这段代码能开启系统shell. 2.构造方法 ...

  2. 20155311《网络对抗》PC平台逆向破解(二)

    20155311<网络对抗>PC平台逆向破解(二) shellcode注入 什么是shellcode? shellcode是一段代码,溢出后,执行这段代码能开启系统shell. 前期准备- ...

  3. 20155307《网络对抗》PC平台逆向破解(二)

    20155307<网络对抗>PC平台逆向破解(二) shellcode注入 什么是shellcode? shellcode是一段代码,溢出后,执行这段代码能开启系统shell. 前期准备- ...

  4. 20155334 网络对抗PC平台逆向破解(二)

    注入Shellcode并运行攻击 shellcode就是一段机器指令(code) 通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe) ...

  5. 20145331魏澍琛 《网络对抗技术》 PC平台逆向破解

    20145331魏澍琛 <网络对抗技术> PC平台逆向破解 学习任务 1.shellcode注入:shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中 ...

  6. 20155324《网络对抗》Exp1 PC平台逆向破解(5)M

    20155324<网络对抗>Exp1 PC平台逆向破解(5)M 实验目标 本次实践的对象是一个名为~pwn1~的~linux~可执行文件. 该程序正常执行流程是:~main~调用~foo~ ...

  7. 2018-2019-2 20165237《网络攻防技术》Exp1 PC平台逆向破解

    2018-2019-2 20165237<网络攻防技术>Exp1 PC平台逆向破解 一.实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调 ...

  8. 2018-2019-2 20165234 《网络对抗技术》 Exp1 PC平台逆向破解

    实验一 PC平台逆向破解 实验目的 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另 ...

  9. 20165221 《网络对抗技术》EXP1 PC平台逆向破解

    20165221 <网络对抗技术>EXP1 PC平台逆向破解 一.实验内容 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函 ...

随机推荐

  1. Linux Debian 如何部署 Qt?

    Linux Debian 如何部署 Qt? 在这里以 HelloWorld 为例 目录结构如下: . ├── HelloWorld ├── HelloWorld.sh ├── imageformats ...

  2. Unity字体文件放Resources和打成ab对比

    情况一:公共字体打成ab的时候,加载A界面的时候加载了font的ab,卸载A和font的ab后,接着加载B界面,加载了font的ab,卸载B和font的ab,这时候字体对应的asset会在内存里有两份 ...

  3. Hosts文件的位置

    Operating System Version(s) Location Unix, Unix-like, POSIX   /etc/hosts Microsoft Windows 3.1 %WinD ...

  4. 我的Android进阶之旅------>android中service的onStartCommand()方法中intent为null的问题

    今天在维护公司的一个APP的时候,突然爆了空指针异常, Caused by: java.lang.NullPointerException: Attempt to invoke virtual met ...

  5. Eclipse中svn操作

    1.主干和分支间合并代码 合并根据目标不同分为2种: 1.分支合并到主干:主要用在修复完生产BUG,并上线之后.需把改动的代码合并到主干上. 2.主干合并到分支:公用的逻辑改动,需反映到所有并行的分支 ...

  6. mysql-5.7.16-linux-glibc2.5-x86_64精简后的主从配置

    1.创建复制账号,并授予复制权限CREATE USER 'fansik'@'10.%' IDENTIFIED BY 'fansik';GRANT REPLICATION SLAVE ON *.* TO ...

  7. C#类和结构(1)

    1.结构功能特性? 实现代码? 结构用struct关键字定义的,与类类似,但有本质区别.结构实质是一个值类型,它不需要对分配的. 结构的特性: (1).结构作为参数传递时,是值传递. (2).结构的构 ...

  8. 【整理学习Hadoop】H D F S 一个分布式文件系统

    Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统.它和现有的分布式文件系统有很多共同点.但同时,它和其他的分布式文件系统的区别 ...

  9. python更新模块

    pip install -U 模块名 # 这是 python2+ 版本的用法更新模块 pip3 install -U 模块名 # 这是 python3+ 版本的用法更新模块

  10. Protobuf支持 pointf

    Protobuf支持 pointf序列化 加入:ProtoBuf.Meta.RuntimeTypeModel.Default.Add(typeof(System.Drawing.PointF), fa ...