首页
社区
课程
招聘
[旧帖] 申请邀请码之"ZyCkm01.exe" 0.00雪花
2011-1-16 21:02 1861

[旧帖] 申请邀请码之"ZyCkm01.exe" 0.00雪花

2011-1-16 21:02
1861
申请邀请码之"ZyCkm01.exe"
1.为了获得传说中的邀请码,不得不做好步步为营屡败屡战的长久作战准备
2.呵呵,下面我们有请目标程序闪亮登场
3."ZyCkm01.exe"昂首挺胸大摇大摆的走上前来,浑然不觉一把恶魔之刃已抵在他的脑后
4.请问"ZyCkm01.exe",您今天带来的是什么表演呢?
5.只见"ZyCkm01.exe"跑动了起来,我们看到了两编辑框和一个按钮
6."在我的两个编辑框里输入正确的内容并单击按钮后会有成功提示,否则提示失败"
7.原来这厮就是一个普通的CrackMe(见底部备注1),好,那请我们的"PEiD"评委讲话
8."我没什么好说的,看他那样就是Microsoft Visual C++ 6.0学校毕业的",不愧是久经沙场的老革命呀
9.虽说这位"ZyCkm01.exe"其实是"易语言静态编译"的,不过确实也属于"Microsoft Visual C++ 6.0"的范畴
10.好吧,玩笑话就至此为止了
11.OD载入,F9运行
12.在内容一和内容二中随便输入些内容或者不输入,单击按钮
13.弹出"错误"信息
14.这个弹出信息框是调用了"USER32.MessageBoxA"
15.在命令栏(OD窗口的左下角)里输入"bp MessageBoxA"并回车。目的是让调试器在调用"MessageBoxA"时断下
16.重复第12行的步骤
17.OD中断
18.按F8往下面单步执行
19.至77D5082A处继续F8时弹出了"错误"信息,因为此处的"CALL MessageBoxExA"指令所致
20.现在是在系统领空,不用管他做了些什么(烧杀抢掠由他去),主要目的是回到程序领空(见底部备注2)
21.单击"错误"信息的确定按钮,继续F8执行77D5082F处的"POP EBP"指令
22.现在到了77D50830处,也就是"RET 10"指令的地方
23.观察堆栈窗口,即OD右下角部分,看到栈顶的值为"00401416",也就是将要返回到程序领空。
25.F8,执行"RET 10"指令
/*40140B*/  PUSH    EAX
/*40140C*/  PUSH    EDX
/*40140D*/  PUSH    ECX
/*40140E*/  PUSH    0
/*401410*/  CALL    DWORD PTR [<&USER32.MessageBoxA>]
/*401416*/  POP     EDI  //执行第25行的操作将会来到此处
26.从401416处开始F8单步

/*401493*/  RET  //执行此行命令后将会返回到调用此子程序的地方
27.一路顺畅的走到401493处后依然按下F8

/*419C21*/  MOV     EAX, DWORD PTR [ESP+C]  //执行第27行的操作将会来到此处
/*419C25*/  MOV     EDX, DWORD PTR [ESP+10]
/*419C29*/  MOV     ECX, DWORD PTR [ESP+14]
/*419C2D*/  ADD     ESP, 18
/*419C30*/  RET  //继续返回到上级调用处
28.单步至419C30处后继续按下F8

/*4011B7*/  PUSH    00469B5D
/*4011BC*/  PUSH    3
/*4011C1*/  MOV     EBX, 00401370
/*4011C6*/  CALL    0040121F
/*4011CB*/  ADD     ESP, 28  //执行第28行的操作将会来到此处
/*4011CE*/  MOV     ESP, EBP
/*4011D0*/  POP     EBP
29.往上滚动鼠标,发现到了一处代码比较多的地方

004010C0  |.  8945 FC       MOV     DWORD PTR [EBP-4], EAX
004010C3  |.  68 4C9B4600   PUSH    00469B4C                         ;  ASCII "hhc"
004010C8  |.  FF75 FC       PUSH    DWORD PTR [EBP-4]
004010CB  |.  E8 34FFFFFF   CALL    00401004
004010D0  |.  83C4 08       ADD     ESP, 8
004010D3  |.  83F8 00       CMP     EAX, 0
004010D6  |.  B8 00000000   MOV     EAX, 0
004010DB  |.  0F94C0        SETE    AL
004010DE  |.  8945 F8       MOV     DWORD PTR [EBP-8], EAX
004010E1  |.  8B5D FC       MOV     EBX, DWORD PTR [EBP-4]
004010E4  |.  85DB          TEST    EBX, EBX
004010E6  |.  74 09         JE      SHORT 004010F1
004010E8  |.  53            PUSH    EBX
004010E9  |.  E8 37010000   CALL    00401225
004010EE  |.  83C4 04       ADD     ESP, 4
004010F1  |>  837D F8 00    CMP     DWORD PTR [EBP-8], 0
004010F5      0F84 58000000 JE      00401153
004010FB  |.  6A FF         PUSH    -1
004010FD  |.  6A 08         PUSH    8
004010FF  |.  68 03000116   PUSH    16010003
00401104  |.  68 01000152   PUSH    52010001
00401109  |.  E8 1D010000   CALL    0040122B
0040110E  |.  83C4 10       ADD     ESP, 10
00401111  |.  8945 F4       MOV     DWORD PTR [EBP-C], EAX
00401114  |.  68 509B4600   PUSH    00469B50                         ;  ASCII "seaely"
00401119  |.  FF75 F4       PUSH    DWORD PTR [EBP-C]
30.可以看到OD已经分析出了两个字符串"hhc"和"seaely"

31.接着从最开始的第一条指令开始分析
004010A1  /.  55            PUSH    EBP
004010A2  |.  8BEC          MOV     EBP, ESP
004010A4  |.  81EC 14000000 SUB     ESP, 14
004010AA  |.  6A FF         PUSH    -1
004010AC  |.  6A 08         PUSH    8
004010AE  |.  68 02000116   PUSH    16010002
004010B3  |.  68 01000152   PUSH    52010001
004010B8  |.  E8 6E010000   CALL    0040122B                         ;  取出内容一的文本
004010BD  |.  83C4 10       ADD     ESP, 10
004010C0  |.  8945 FC       MOV     DWORD PTR [EBP-4], EAX           ;  将内容一的文本传递给第一个局部变量
004010C3  |.  68 4C9B4600   PUSH    00469B4C                         ;  ASCII "hhc"
004010C8  |.  FF75 FC       PUSH    DWORD PTR [EBP-4]                ;  我在内容一里输入的是"qwert"
004010CB  |.  E8 34FFFFFF   CALL    00401004                         ;  执行后发现eax的值变为1了,估计就是说传进去的两个值不相等吧
004010D0  |.  83C4 08       ADD     ESP, 8
004010D3  |.  83F8 00       CMP     EAX, 0
004010D6  |.  B8 00000000   MOV     EAX, 0
004010DB  |.  0F94C0        SETE    AL                               ;  百度了一下,说这是相等置位,但还是不知道是啥意思
004010DE  |.  8945 F8       MOV     DWORD PTR [EBP-8], EAX           ;  将第二个局部变量赋值0
004010E1  |.  8B5D FC       MOV     EBX, DWORD PTR [EBP-4]           ;  将第一个局部变量的值给ebx,执行后ebx="qwert"
004010E4  |.  85DB          TEST    EBX, EBX
004010E6  |.  74 09         JE      SHORT 004010F1
004010E8  |.  53            PUSH    EBX
004010E9  |.  E8 37010000   CALL    00401225                         ;  将"qwert"作为参数传入,执行后eax又变成1了?
004010EE  |.  83C4 04       ADD     ESP, 4
004010F1  |>  837D F8 00    CMP     DWORD PTR [EBP-8], 0
004010F5      75 5C         JNZ     SHORT 00401153                   ;  规规矩矩的单步到此处后发现他要跳到00401153处了,还有内容二都不判断了,看来露馅了,不能让他跳,JZ改为JNZ
004010F7      90            NOP
004010F8      90            NOP
004010F9      90            NOP
004010FA      90            NOP
004010FB  |.  6A FF         PUSH    -1
004010FD  |.  6A 08         PUSH    8
004010FF  |.  68 03000116   PUSH    16010003
00401104  |.  68 01000152   PUSH    52010001
00401109  |.  E8 1D010000   CALL    0040122B                         ;  取出内容二的文本
0040110E  |.  83C4 10       ADD     ESP, 10
00401111  |.  8945 F4       MOV     DWORD PTR [EBP-C], EAX           ;  将内容二的文本保存在第三局部变量
00401114  |.  68 509B4600   PUSH    00469B50                         ;  ASCII "seaely"
00401119  |.  FF75 F4       PUSH    DWORD PTR [EBP-C]
0040111C  |.  E8 E3FEFFFF   CALL    00401004                         ;  估计是判断内容二是否正确,执行此句后,eax=FFFFFFFF
00401121  |.  83C4 08       ADD     ESP, 8
00401124  |.  83F8 00       CMP     EAX, 0
00401127  |.  B8 00000000   MOV     EAX, 0
0040112C  |.  0F94C0        SETE    AL
0040112F  |.  8945 F0       MOV     DWORD PTR [EBP-10], EAX
00401132  |.  8B5D F4       MOV     EBX, DWORD PTR [EBP-C]
00401135  |.  85DB          TEST    EBX, EBX
00401137  |.  74 09         JE      SHORT 00401142
00401139  |.  53            PUSH    EBX
0040113A  |.  E8 E6000000   CALL    00401225
0040113F  |.  83C4 04       ADD     ESP, 4
00401142  |>  837D F0 00    CMP     DWORD PTR [EBP-10], 0
00401146      75 0B         JNZ     SHORT 00401153                   ;  发现和刚才那个跳的目的地一样,有鬼,同样JZ改JNZ
00401148      90            NOP
00401149      90            NOP
0040114A      90            NOP
0040114B      90            NOP
0040114C  |.  B8 01000000   MOV     EAX, 1
00401151  |.  EB 02         JMP     SHORT 00401155                   ;  发现在此处非常猥琐的绕过了那个出错跳转的目标地址
00401153  |>  33C0          XOR     EAX, EAX
00401155  |>  85C0          TEST    EAX, EAX
00401157  |.  0F84 3B000000 JE      00401198                         ;  经过上面两次捣蛋后,此处跳转未实现
0040115D  |.  68 04000080   PUSH    80000004                         ;  接下来继续安分的往下面单步
00401162  |.  6A 00         PUSH    0
00401164  |.  68 579B4600   PUSH    00469B57
00401169  |.  68 01030080   PUSH    80000301
0040116E  |.  6A 00         PUSH    0
00401170  |.  68 00000000   PUSH    0
00401175  |.  68 04000080   PUSH    80000004
0040117A  |.  6A 00         PUSH    0
0040117C  |.  68 589B4600   PUSH    00469B58
00401181  |.  68 03000000   PUSH    3
00401186  |.  BB 70134000   MOV     EBX, 00401370
0040118B  |.  E8 8F000000   CALL    0040121F                         ;  此句运行后弹出"正确",嘿嘿,目的达到了,虽然不够光明磊落
00401190  |.  83C4 28       ADD     ESP, 28
00401193  |.  E9 36000000   JMP     004011CE
00401198  |>  68 04000080   PUSH    80000004
0040119D  |.  6A 00         PUSH    0
0040119F  |.  68 579B4600   PUSH    00469B57
004011A4  |.  68 01030080   PUSH    80000301
004011A9  |.  6A 00         PUSH    0
004011AB  |.  68 00000000   PUSH    0
004011B0  |.  68 04000080   PUSH    80000004
004011B5  |.  6A 00         PUSH    0
004011B7  |.  68 5D9B4600   PUSH    00469B5D
004011BC  |.  68 03000000   PUSH    3
004011C1  |.  BB 70134000   MOV     EBX, 00401370
004011C6  |.  E8 54000000   CALL    0040121F
004011CB  |.  83C4 28       ADD     ESP, 28                          ;  执行第28行的操作将会来到此处
004011CE  |>  8BE5          MOV     ESP, EBP
004011D0  |.  5D            POP     EBP
004011D1  \.  C3            RET

32.接着保存所有修改到文件就可以了,无论输入什么都是正确
33.整个过程总共修改了两条指令,当然也可以只修改一条
34.Ctrl+F2重新载入程序,将004010F5(第一个跳向错误处)的代码改为“JE 0040115D”即可

备注1:CrackMe,给别人尝试破解的小程序
备注2:领空,即当前代码所运行到的地方,也就是寄存器EIP所指的地方。OD窗口右上角为寄存器列表。观察OD窗口的标题栏即可知道当前是否处于系统领空。

终于写完了,百感交集呀
还有这里面说的也不知道正确与否,忘大家不吝赐教。

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞6
打赏
分享
最新回复 (2)
雪    币: 114
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
seaely 2011-1-16 21:04
2
0
附上"ZyCkm01.exe"
上传的附件:
雪    币: 31
活跃值: (43)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
邋遢鬼 2011-1-16 21:10
3
0
楼主好强,顶上
游客
登录 | 注册 方可回帖
返回