-
您的位置:首页 → 精文荟萃 → 破解文章 → duelist crackme 4 破解
duelist crackme 4 破解
时间:2004/10/15 0:58:00来源:本站整理作者:蓝点我要评论(0)
-
E_mail ddxia@263.net (如果Crackme教学文章中有错,请来信:))
Web http://go18.163.com/~ddxia
目标 duelist crackme 4
目标URL http://go18.163.com/~ddxia/crackme/DueList/Due-cm4.zip
工具 SoftIce4.01 for NT winapi.hlp
据readme.txt说,用秘密表的形式来进行加密,解起来有些困难。同时要做一个KEYGEN
这次不用BPX MESSAGEBOXA 换一下口味!:)
因为这次Crackme是要输入USER/CODE,一定要经过变化才进行比较,所以在Crackme得到
假的USER/CODE时,把它断下来。
bpx getwindowtexta ------啊哦!!没有用!
bpx getdlgitem ------与DLG操作有都断下来。
结果按下check后,就给断下来了,F11 然后再按F12 返回Crackme的代码空间
用SICE截下如下代码,COME ON BABY!!分析代码哦!!非常的有趣的活哦!:)
:u 401127 L13d
001B:00401127 6A00 PUSH 00
001B:00401129 6A00 PUSH 00
001B:0040112B 6A0E PUSH 0E
001B:0040112D 6A03 PUSH 03
001B:0040112F FF7508 PUSH DWORD PTR [EBP+08]
001B:00401132 E841020000 CALL USER32!SendDlgItemMessageA
SendDlgItemMessage这个API调用了四次,来我们看一看它到底有什么用?
LONG SendDlgItemMessage(
HWND hDlg, // 对话框的句柄
int nIDDlgItem, // 控件的ID号
UINT Msg, // 传送的消息
WPARAM wParam, // 第一个消息参数
LPARAM lParam // 第二个消息参数
);
从程序中我们可以知道当UINT Msg=E 时 是取输入字符的个数
当UINT Msg=D 时 是取输入字符的内容
001B:00401137 A3AF214000 MOV [004021AF],EAX
^^^^^^^^^^^^^^^^^^^^^^^^---->取输入USER的个数
001B:0040113C 83F800 CMP EAX,00
001B:0040113F 0F84D5000000 JZ 0040121A
001B:00401145 83F808 CMP EAX,08
001B:00401148 0F8FCC000000 JG 0040121A
^^^^^^^^^^^^^^^^^^^^^^^----->检查输入个数是否
大于0小于8
001B:0040114E 8BF0 MOV ESI,EAX
^^^^^^^^^^^^^^^^^^^^^^^----->注意这个
001B:00401150 6A00 PUSH 00
001B:00401152 6A00 PUSH 00
001B:00401154 6A0E PUSH 0E
001B:00401156 6A04 PUSH 04
001B:00401158 FF7508 PUSH DWORD PTR [EBP+08]
001B:0040115B E818020000 CALL USER32!SendDlgItemMessageA
001B:00401160 83F800 CMP EAX,00
001B:00401163 0F84B1000000 JZ 0040121A
001B:00401169 3BF0 CMP ESI,EAX
001B:0040116B 0F85A9000000 JNZ 0040121A
^^^^^^^^^^^^^^^^^^^^^^^------>比较user/code
输入的个数是否相等
相等就继续
001B:00401171 6860214000 PUSH 00402160
001B:00401176 6A08 PUSH 08
001B:00401178 6A0D PUSH 0D
001B:0040117A 6A03 PUSH 03
001B:0040117C FF7508 PUSH DWORD PTR [EBP+08]
001B:0040117F E8F4010000 CALL USER32!SendDlgItemMessageA
^^^^^^^^^^^^^^^^^^^^^^^^----->取的USER 放入402160
001B:00401184 6879214000 PUSH 00402179
001B:00401189 6A10 PUSH 10
001B:0040118B 6A0D PUSH 0D
001B:0040118D 6A04 PUSH 04
001B:0040118F FF7508 PUSH DWORD PTR [EBP+08]
001B:00401192 E8E1010000 CALL USER32!SendDlgItemMessageA
^^^^^^^^^^^^^^^^^^^^^^^^----->取的CODE 放入402160
001B:00401197 B9FFFFFFFF MOV ECX,FFFFFFFF
001B:0040119C 41 INC ECX
001B:0040119D 0FBE8160214000 MOVSX EAX,BYTE PTR [ECX+00402160]
001B:004011A4 83F800 CMP EAX,00
001B:004011A7 7432 JZ 004011DB
001B:004011A9 BEFFFFFFFF MOV ESI,FFFFFFFF
001B:004011AE 83F841 CMP EAX,41
^^^^^^^^^^^^^^^^^^^^^^^^----->41=‘A’
001B:004011B1 7C67 JL 0040121A
001B:004011B3 83F87A CMP EAX,7A
^^^^^^^^^^^^^^^^^^^^^^^^----->7A=‘z’
001B:004011B6 7762 JA 0040121A
001B:004011B8 83F85A CMP EAX,5A
^^^^^^^^^^^^^^^^^^^^^^^^----->41=‘Z’
001B:004011BB 7C03 JL 004011C0
^^^^^^^^^^^^^^^^^^^^^^^^----->这几句代码是判断
USER是否输入了字符
001B:004011BD 83E820 SUB EAX,20
^^^^^^^^^^^^^^^^^^^^^^^^----->全部转化为大写
001B:004011C0 46 INC ESI
001B:004011C1 0FBE9617204000 MOVSX EDX,BYTE PTR [ESI+00402017]
^^^^^^^^^^^^^^^^^^^^^^^^----->在402017表相对应的
位置
001B:004011C8 3BC2 CMP EAX,EDX
001B:004011CA 75F4 JNZ 004011C0
^^^^^^^^^^^^^^^^^^^^^^^^----->表中找到后在去另一
40203C表去寻找对应
的值。
001B:004011CC 0FBE863C204000 MOVSX EAX,BYTE PTR [ESI+0040203C]
001B:004011D3 898194214000 MOV [ECX+00402194],EAX
001B:004011D9 EBC1 JMP 0040119C
:d 402017
0023:00402017 41 31 4C 53 4B 32 44 4A-46 34 48 47 50 33 51 57 A1LSK2DJF4HGP3QW
0023:00402027 4F 35 45 49 52 36 55 54-59 5A 38 4D 58 4E 37 43 O5EIR6UTYZ8MXN7C
0023:00402037 42 56 39 00 BV9.
:d 40203c
0023:0040203C 53 55 37 43 53 4A 4B 46-30 39 4E 43 53 44 4F 39 SU7CSJKF09NCSDO9
0023:0040204C 53 44 46 30 39 53 44 52-4C 56 4B 37 38 30 39 53 SDF09SDRLVK7809S
0023:0040205C 34 4E 46 00 4NF.
001B:004011DB FF35AF214000 PUSH DWORD PTR [004021AF]
001B:004011E1 6894214000 PUSH 00402194
001B:004011E6 6879214000 PUSH 00402179
001B:004011EB E854000000 CALL 00401244
^^^^^^^^^^^^^^^^^^^^^^----->比较子程序
转换后的值与CODE相比较
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
比较程序代码:(虽然简单,但是有漏洞哦!:) 呵呵~~~ )
当USER为一个字母的时候,CODE可以为任意字符 :)
可以试一下 user:a /code:= 是可以的!!
想一想,关键就在这个JCXZ 00401260的判断
不知道是作者故意的,还是BUG,自己去想吧 呵呵~~~~~~
:u 401244 L20
001B:00401244 C8000000 ENTER 0000,00
001B:00401248 B801000000 MOV EAX,00000001
001B:0040124D 8B7D08 MOV EDI,[EBP+08]
001B:00401250 8B750C MOV ESI,[EBP+0C]
001B:00401253 8B4D10 MOV ECX,[EBP+10]
001B:00401256 F3A6 REPZ CMPSB
001B:00401258 67E305 JCXZ 00401260
001B:0040125B B800000000 MOV EAX,00000000
001B:00401260 C9 LEAVE
001B:00401261 C20C00 RET 000C
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
001B:004011F0 83F801 CMP EAX,01
001B:004011F3 0F84DEFEFFFF JZ 004010D7
001B:004011F9 EB1F JMP 0040121A
001B:004011FB 837D1001 CMP DWORD PTR [EBP+10],01
001B:004011FF 0F8422FFFFFF JZ 00401127
001B:00401205 837D1002 CMP DWORD PTR [EBP+10],02
001B:00401209 752F JNZ 0040123A
001B:0040120B E8B4000000 CALL KERNEL32!ExitProcess
001B:00401210 B801000000 MOV EAX,00000001
001B:00401215 E9FFFEFFFF JMP 00401119
001B:0040121A 6800200000 PUSH 00002000
001B:0040121F 6801204000 PUSH 00402001
001B:00401224 68AE204000 PUSH 004020AE
001B:00401229 6A00 PUSH 00
001B:0040122B E836010000 CALL USER32!MessageBoxA
001B:00401230 B800000000 MOV EAX,00000000
001B:00401235 E9DFFEFFFF JMP 00401119
001B:0040123A B800000000 MOV EAX,00000000
001B:0040123F E9D5FEFFFF JMP 00401119
下一步,如果按Crackme的要求是让我们写一个KEYGEN,俺天性就是懒懒懒.......于是
想出个馊主意,把增加代码把这个Crackme本身变成一个KEYGEN,孙悟空七十二变 呵呵~~~~~~~~
步骤如下:
1、先用TOPO软件定位我们加入代码的位置
2、用HIEW来修改程序。
用TOPO V1.2来玩一玩!首先在SCAN选项中选取 EXEC ONLY,是扫描代码段中有没有空
余的地方,增加我们要加入的代码。OPEN文件 due-cm4.exe 发现有285个字节可以利用。找个吉
利的数88,好!利用88个字节进行修改程序,程序定位在内存中位置为4014e3 物理位置为AE3。
我们想达到的目的是当程序判断我们的CODE是错误的时候,让程序本身跳出一个对话框
来告诉大家正确的CODE :)
首先,我们确定那里是合适加入代码的地方??很关键哦!我们找啊找,找到一个好
朋友 呵呵~~~~~
比较程序代码:
:u 401244 L20
001B:00401244 C8000000 ENTER 0000,00
001B:00401248 B801000000 MOV EAX,00000001
001B:0040124D 8B7D08 MOV EDI,[EBP+08]
001B:00401250 8B750C MOV ESI,[EBP+0C]
001B:00401253 8B4D10 MOV ECX,[EBP+10]
001B:00401256 F3A6 REPZ CMPSB
001B:00401258 67E305 JCXZ 00401260
001B:0040125B B800000000 MOV EAX,00000000
^^^^^^^^^^^^^^^^^^^^^^^^---->修改这句代码,
jmp 4014e3
而且非常的巧,代码长度一样
001B:00401260 C9 LEAVE
001B:00401261 C20C00 RET 000C
ok let's go goo! 运行HIEW(真是一个酷B的软件),打开due-cm4.exe.
按F4可以改变显示模式,选择DECODE。找到上面的代码
按F3可以修改代码,按F2为切换到ASM模式。输入 JMP 0AE3(注意了这里的跳转地址为
物理地址)
按F9存盘哦!
按F5 可以GOTO 输入AE3!!
在AE3处输入
内存地址 物理地址 代码
4014E3 AE3 mov esi,[ebp][0000C]
4014E6 AE6 push 0
4014E8 AE8 push 4014FF
4014ED AED push esi
4014EE AEE push 0
4014F0 AF0 call 966
4014F5 AF5 mov eax,0
4014FA AFA jmp 860
存盘
按F4切换到HEX模式下,输入
4014FF AFF Correct Code: (Edit by ddxia) 00
^^^-->注意在HEX方式下输入
赶紧去试一试:)
哎哟!差点忘了,再把以下这段消息
Your registration info is invalid... Note that most.....
改为:请输入小于等于8个字符的USER名(不能包括数字)CODE的长度要和USER的一样 00
终于修改完了,好累啊!懒人经常走弯路。
啊!小子,没有完呢?想丢笔去HAPPY 呵呵~~~~~
我们来弄明白这为什么要这样改???
内存地址 物理地址 代码
4014E3 AE3 mov esi,[ebp][0000C] ;把正确的CODE放入ESI
4014E6 AE6 push 0
4014E8 AE8 push 4014FF
4014ED AED push esi
4014EE AEE push 0
4014F0 AF0 call 966 ; CALL MESSAGEBOX
4014F5 AF5 mov eax,0 ; 恢复被我们修改的代码
4014FA AFA jmp 860 ; 跳回LEAVE的位置
看看WINAPI.HLP中的MESSAGEBOXa,需要什么参数
int MessageBox(
HWND hWnd, // 窗口句柄 0------>缺省
LPCTSTR lpText, // 内容的地址 ESI---->CODE
LPCTSTR lpCaption, // 标题的地址 4014FF->我们加进的一串字符
UINT uType // 对话框的类型 0------>普通类型,只有一个OK按钮
);
然后我们研究一下为什么是CALL 966 ??这个嘛!呵呵~~~~ Let's see
40122b call 401366 ---->当按F3 它就会变成call 966知道为什么了吧 :)
401366 jmp messageboxa
再来看一看 jmp 860 860又什么东东?:) 这个卖个关子了 呵呵!!
(提示:按F5 输入860,回车,你就明白了 哈哈~~)
终于写完了,怎么还没有人CALL我的,看来今天晚没有时间去HAPPY了,要整理整理我的
站点了 (遭到投诉了 呵呵~~~~~)
|
相关阅读
Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么
-
热门文章
去除winrar注册框方法
最新文章
比特币病毒怎么破解 比去除winrar注册框方法
华为无线路由器HG522-C破解教程(附超级密码JEB格式文件京东电子书下载和阅读限制破解教UltraISO注册码全集(最新)通过Access破解MSSQL获得数据
人气排行
华为无线路由器HG522-C破解教程(附超级密码JEB格式文件京东电子书下载和阅读限制破解教UltraISO注册码全集(最新)qq相册密码破解方法去除winrar注册框方法(适应任何版本)怎么用手机破解收费游戏华为无线猫HG522破解如何给软件脱壳基础教程
查看所有0条评论>>