首页
社区
课程
招聘
[原创]windows下dos窗口程序的破解(涉及浮点汇编指令问题)
2004-12-29 12:10 11768

[原创]windows下dos窗口程序的破解(涉及浮点汇编指令问题)

2004-12-29 12:10
11768
【软件名称】crackme2.exe
【下载地址】见附件
【应用平台】Win9x
【软件大小】未知
【软件限制】未知
【破解声明】破解只是感兴趣,无其它目的。失误之处敬请诸位大侠赐教!
【破解工具】peid ,trw2000,w32dasm
【软件简介】老外写的一个crackme程序,记不清从那里下载的
========================================================================================
【分析过程】
windows下dos窗口程序的破解(涉及浮点汇编指令问题)

用peid检测,无壳,用dev-c++编写的程序,该程序在windows下dos窗口运行,怎么中断呢?

现运行一下程序,dos窗口显示your name: 我们就从这里下手。

先用w32dasm反汇编,查找串参考your name,如下所示:

我们就在trw2000中下中断:bpx 00401663,然后再用TRW2000 load 该程序,就能中断在所设置的断点上。

.....

0167:00401600 C744240430144000        mov [esp+04], 00401430

0167:00401608 C70424B0754300          mov dword ptr [esp], 004375B0

0167:0040160F E8CC090300              call 00431FE0

* Possible StringData Ref from Code Obj ->"Your Name: "                  //输入姓名                |

0167:00401614 C74424044F144000        mov [esp+04], 0040144F

0167:0040161C C70424B0754300          mov dword ptr [esp], 004375B0

0167:00401623 E8B8090300              call 00431FE0

0167:00401628 8D85F8FEFFFF            lea eax, dword ptr [ebp+FFFFFEF8]

0167:0040162E 89442404                mov dword ptr [esp+04], eax

0167:00401632 C7042410754300          mov dword ptr [esp], 00437510

0167:00401639 E842120300              call 00432880

* Possible StringData Ref from Code Obj ->"Your Serial: "                //输入序列号

                                  |

0167:0040163E C74424045B144000        mov [esp+04], 0040145B

0167:00401646 C70424B0754300          mov dword ptr [esp], 004375B0

0167:0040164D E88E090300              call 00431FE0      

0167:00401652 8D85F8FDFFFF            lea eax, dword ptr [ebp+FFFFFDF8]

0167:00401658 89442404                mov dword ptr [esp+04], eax

0167:0040165C C7042410754300          mov dword ptr [esp], 00437510

0167:00401663 E818120300              call 00432880  //取序列号的call 在此下断

0167:00401668 8D85F8FEFFFF     LEA      EAX,[EBP+FFFFFEF8]

0167:0040166E 890424           MOV      [ESP],EAX

0167:00401671 E85AF60000       CALL     `MSVCRT!strlen`                //取姓名的长度       

0167:00401676 89C2             MOV      EDX,EAX                        //eax=7

0167:00401678 69D2CD750800     IMUL     EDX,EDX,000875CD        //edx=eax*0x875cd=3b389b=3881115

0167:0040167E B81F85EB51       MOV      EAX,51EB851F                //eax=0x51eb851f

0167:00401683 F7E2             MUL      EDX                        //eax=eax*edx=0x51eb851f*0x3b389b=0xccdd61c5  edx=eax/0xffffffff=0x12f364                       

0167:00401685 89D0             MOV      EAX,EDX                        //eax=edx          

0167:00401687 C1E805           SHR      EAX,05                        //eax按位右移五位,eax=eax/0x20=0x979b

0167:0040168A 69C090FCFFFF     IMUL     EAX,EAX,FFFFFC90        //eax=eax*0xfffffc90=0x979b*0xfffffc90=0xfdf6db30

0167:00401690 BA00000000       MOV      EDX,00

0167:00401695 52               PUSH     EDX

0167:00401696 50               PUSH     EAX                       

0167:00401697 DF2C24           FILD     QWORD [ESP]                //浮点汇编指令开始,将eax值以整数形式装入[ESP]

0167:0040169A 8D642408         LEA      ESP,[ESP+08]               

0167:0040169E DD9DF0FBFFFF     FSTP     QWORD [EBP+FFFFFBF0]        //将eax的值0xfdf6db30转换为双精度(64位)浮点数据

0167:004016A4 DD85F0FBFFFF     FLD      QWORD [EBP+FFFFFBF0]        //转换为后的双精度(64位)浮点数据储存

0167:004016AA DD5C2408         FSTP     QWORD [ESP+08]                //取出转换后为双精度(64位)浮点数据的低端32位数据放入地址[ESP+08],并转换为整数0x66000000(十进制1711276032)

0167:004016AE C744240469144000 MOV      DWORD [ESP+04],00401469 //将00401469地址的数据取出放入地址[ESP+04],和上述数据连接一起  下d00401469,显示:-x019871

0167:004016B6 8D85F8FCFFFF     LEA      EAX,[EBP+FFFFFCF8]        //将组合好的数据从地址[EBP+FFFFFCF8]中取出,放入eax中

0167:004016BC 890424           MOV      [ESP],EAX

0167:004016BF E8FCF50000       CALL     `MSVCRT!sprintf`

0167:004016C4 8D85F8FCFFFF     LEA      EAX,[EBP+FFFFFCF8]            //下deax,显示正确的注册码:1711276032-x019871

0167:004016CA 89442404         MOV      [ESP+04],EAX

0167:004016CE 8D85F8FDFFFF     LEA      EAX,[EBP+FFFFFDF8]        //下deax,显示输入的注册码:78787878

0167:004016D4 890424           MOV      [ESP],EAX

0167:004016D7 E8D4F50000       CALL     `MSVCRT!strcmp`                //比较两组数据,不一致则跳,game over!

0167:004016DC 8985ECFBFFFF     MOV      [EBP+FFFFFBEC],EAX

0167:004016E2 83BDECFBFFFF00   CMP      DWORD [EBP+FFFFFBEC],BYTE +00

0167:004016E9 742E             JZ       00401719

0167:004016EB C744240490144000 MOV      DWORD [ESP+04],00401490

0167:004016F3 C70424B0754300   MOV      DWORD [ESP],004375B0

0167:004016FA E8E1080300       CALL     00431FE0

0167:004016FF C70424AF144000   MOV      DWORD [ESP],004014AF

0167:00401706 E8D5F50000       CALL     `MSVCRT!system`

0167:0040170B C704248F134000   MOV      DWORD [ESP],0040138F

0167:00401712 E8C9F50000       CALL     `MSVCRT!system`

0167:00401717 EB40             JMP      SHORT 00401759

0167:00401719 C7442404B5144000 MOV      DWORD [ESP+04],004014B5

0167:00401721 C70424B0754300   MOV      DWORD [ESP],004375B0

0167:00401728 E8B3080300       CALL     00431FE0

0167:0040172D C7442404CB144000 MOV      DWORD [ESP+04],004014CB

0167:00401735 C70424B0754300   MOV      DWORD [ESP],004375B0

0167:0040173C E89F080300       CALL     00431FE0

0167:00401741 C70424AF144000   MOV      DWORD [ESP],004014AF

0167:00401748 E893F50000       CALL     `MSVCRT!system`

0167:0040174D C704248F134000   MOV      DWORD [ESP],0040138F

0167:00401754 E887F50000       CALL     `MSVCRT!system`

0167:00401759 B800000000       MOV      EAX,00

0167:0040175E 8B7DFC           MOV      EDI,[EBP-04]

0167:00401761 C9               LEAVE   

0167:00401762 C3               RET     

========================================================================================

【分析总结】

1. 姓名长度乘以 0x875CD

2. 结果再乘以 0x51EB851F

3. 结果再右移 5位

4. 结果再乘以0xFFFFFC90

5. 结果放入 FPU stack

6. 储存数据为浮点双精度 (real8, 64 bit)

7. 将低端32位再转换位整数

8. 加上后缀 "-x019871".

序列号只和姓名长度有关,注册机如下:

#include <iostream.h>

#include <string.h>

#include <stdlib.h>

#include <math.h>

main()

{

    cout<<"the keymaker of crackme2"<<endl;

    cout<<"========================"<<endl;

    cout<<"made by subTWay+0"<<endl;

    cout<<"========================"<<endl;

    cout<<endl;

    char name[20];

    cout<<"please input your name:";

    cin>>name;

    int len=strlen(name);

    unsigned long num1;

    double num2,num;

    num1=len*0x875CD;

    num2=0x51eb851f*num1;

    num2=num2/0xffffffff;

    num1=num2/32;

    num=num1*0xFFFFFC90;

    double M;

    static int s2[64],s3[32];

    int E,S,i;

    E=(int)(log(num)/log(2.));

    M=num/pow(2,E);

    M=M-1;

    E=E+0x3ff;

    if(num<0)

    S=1;

    else

    S=0;

    s2[0]=S;

   for(i=1;i<=11;i++)

   {

    if(E%2==0)

    s2[i]=1;

    else

    s2[i]=0;

    E=E/2;

    }

    for(i=12;i<64;i++)

    {

      M=M*2;   

      if(M<1)

      s2[i]=0;

      else

        {

           s2[i]=1;

           M--;

        }   

     }

    for(i=0;i<64;i++)

    int key=0;

    for(i=32;i<64;i++)

    key=key+s2[i]*pow(2,63-i);

    cout<<"you password is: "<<key<<"-x019871"<<endl;  

    system ("PAUSE");

    return 0;         

}

========================================================================================

【版权信息】
copyright subtway+0 all rights reserved

                                                   2004-12-29附件:C2.rar

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

收藏
点赞7
打赏
分享
最新回复 (33)
雪    币: 209
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qwert 2004-12-29 19:21
2
0
太好了!好好看看,谢谢!
雪    币: 223
活跃值: (105)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
SubtWay+0 2 2004-12-29 20:00
3
0
最初由 qwert 发布
太好了!好好看看,谢谢!


可以把附件中的crackme 下载研究一下,该程序算法清晰,可以作为
初学者练习!
雪    币: 392
活跃值: (909)
能力值: ( LV9,RANK:690 )
在线值:
发帖
回帖
粉丝
cyclotron 17 2004-12-29 20:06
4
0
不错,支持一下
雪    币: 223
活跃值: (105)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
SubtWay+0 2 2004-12-29 20:14
5
0
最初由 cyclotron 发布
不错,支持一下


谢谢兄弟支持,同志更需努力!
我还不知那段浮点汇编指令理解的是否正确,请高手指正!
雪    币: 85496
活跃值: (198820)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
linhanshi 2004-12-29 20:19
6
0
好文就支持!!!
雪    币: 223
活跃值: (105)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
SubtWay+0 2 2004-12-29 20:28
7
0
最初由 linhanshi 发布
好文就支持!!!


谢谢版主支持!
雪    币: 61
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
pendan2001 4 2004-12-29 21:53
8
0
鼓励一下!
雪    币: 223
活跃值: (105)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
SubtWay+0 2 2004-12-29 21:54
9
0
最初由 pendan2001 发布
鼓励一下!

谢谢鼓励
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
夏雨 2004-12-30 01:17
10
0
好的,严重支持
写进教材
这样的材料太少了
若是有壳查不出怎么办
我用LANGUAGE2000查壳一个DOS程序
它什么也没有
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
夏雨 2004-12-30 01:58
11
0
请教:
我下载了附件C2.EXE后,用W32DASM8.93汉化版反编译后显示
:00401614 C74424044F144000 MOV [ESP+04,0010144F]
显示不出前面的 0167 是怎么回事,那我怎么断呀?
另我曾反编译过一个文件是中文“输入密码” 在反编译后出现乱码,由于比较菜,就找不到位置了,应该怎么处理?
雪    币: 223
活跃值: (105)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
SubtWay+0 2 2004-12-30 08:42
12
0
最初由 夏雨 发布
请教:
我下载了附件C2.EXE后,用W32DASM8.93汉化版反编译后显示
:00401614 C74424044F144000 MOV [ESP+04,0010144F]
显示不出前面的 0167 是怎么回事,那我怎么断呀?
另我曾反编译过一个文件是中文“输入密码” 在反编译后出现乱码,由于比较菜,就找不到位置了,应该怎么处理?


那段代码是从trw2000中抓出来的,每行代码前面有0167,刚才修正文中一个错误,在trw2000 下中断 bpx 00401663才能在输入姓名和序列号后中断。如果输入中文的话,那就要好好分析反编译的程序代码,努力找到关键中断。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
夏雨 2004-12-30 17:54
13
0
这是我在电脑上的操作:
启动TRW2000
装入C2.exe
按LOGD
输入名字
输入密码
CTRL+N调出TRW2000
在命令行输入 BPX 00401614 回车
按F5
返回DOS程序
回车
DOS程序提示出错信息

是不是还是没有断到??
雪    币: 223
活跃值: (105)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
SubtWay+0 2 2004-12-30 18:47
14
0
最初由 夏雨 发布
这是我在电脑上的操作:
启动TRW2000
装入C2.exe
按LOGD
输入名字
........


顺序应该这样:
1、启动TRW2000
2、装入C2.exe
3、CTRL+N调出TRW2000
4、在命令行输入 BPX 00401663
5、按F5返回
6、按LOGD
7、trw2000启动
8、按F10几次
9、返回DOS窗口
10、输入名字
11、TRW中断
12、按F10几次
13、返回DOS窗口
14、输入密码
15、TRW中断,分析正式开始
雪    币: 258
活跃值: (230)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
qiweixue 19 2004-12-30 19:03
15
0
不错,学习~~
最近浮躁~
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
夏雨 2004-12-30 23:04
16
0
最初由 SubtWay+0 发布


顺序应该这样:
1、启动TRW2000
2、装入C2.exe
........

载入在TRW中按LOGD,不用按F10就已经到了输名字的地方了是怎么回事?
另在DOS窗口下输入名字及密码后是否按回车?
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
nbw 24 2004-12-31 11:04
17
0
学习!
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
夏雨 2004-12-31 13:48
18
0
最初由 nbw 发布
学习!

别学习,指导一下呀
是不是我安装的TRW有问题???
什么版本在WINME下最好用?
安装TRW2000应注意什么?
看雪老大的文章我都快背过了,
还是不能动态跟踪,
郁闷中.......
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
夏雨 2004-12-31 13:57
19
0
我用W32DSM3.0无极版找到了关键的跳转,
实行爆破,成功
可是你面关键内容是与输入和密码有关
输入密码不同,输也的结果也不同
看来要用动态的了
可是我怎么也搞不掂SOFTICE和TRW2000
SOFTICE 装在XP下怎么调试都没用
TRW200在WINXP下不能运行,就是在WINME下我也是菜怎么设断都断不

WINXP发行已经这么久了
做为最大的破解论坛,是不是也搞个在WINXP下的SOFTICE、TRW2000的无忧安装版,让我们这些菜的不能再菜的鸟过上一把隐
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
夏雨 2004-12-31 17:42
20
0
最初由 SubtWay+0 发布


顺序应该这样:
1、启动TRW2000
2、装入C2.exe
........

看看我的执行过程:
1.启动TRW2000
2.按BROWSE
3.找到C2.EXE
4.按OK
5.按CTRL+N调出TRW2000(这时会出现LOADING PLUG C:\TRW122\LOGPRO.sys
                  CAN NOT FIND C:\TRW122\LOGPRO.SYS,LOAD FAILED!)
6.输入BPX 00401663(此时按回车键反应)
7.按F5返回DOS窗口
8.按LOGD(此时在TRW2000中显示“开始载入文件'c:\c2.exe'
                               打开文件'c:\c2.exe'
                               载入中。。。
                               成功结束)
     程序已经执行到'输入名字'了
9。在程序中输入名字,回车 ,会出现输入密码的提示,输入密码,出现出错信息
10。CTRL+N 回到TRW2000
11。下D DAX或DBP 什么也看不见
   请看看哪里弄错了??
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
夏雨 2004-12-31 18:54
21
0
更正上文
看看我的执行过程:
1.启动TRW2000
2.按BROWSE
3.找到C2.EXE
4.按OK
5.按CTRL+N调出TRW2000(这时会出现LOADING PLUG C:\TRW122\LOGPRO.sys
                  CAN NOT FIND C:\TRW122\LOGPRO.SYS,LOAD FAILED!)
6.输入BPX 00401663(此时按回车键 没 反应)
7.按F5返回DOS窗口
8.按LOGD(此时在TRW2000中显示“开始载入文件'c:\c2.exe'
                               打开文件'c:\c2.exe'
                               载入中。。。
                               成功结束)
     程序已经执行到'输入名字'了
9。在程序中输入名字,回车 ,会出现输入密码的提示,输入密码,出现出错信息
10。CTRL+N 回到TRW2000
11。下D DAX或DBP 什么也看不见
   请看看哪里弄错了??
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
夏雨 2005-1-2 05:08
22
0
没有人回答,呵
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
夏雨 2005-1-2 22:48
23
0
指导一下呀
雪    币: 223
活跃值: (105)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
SubtWay+0 2 2005-1-5 18:11
24
0
顺序应该这样:你再试一下
1、启动TRW2000
2、装入C2.exe
3、CTRL+N调出TRW2000
4、在命令行输入 BPX 00401663
5、按F5返回
6、按LOGD
7、trw2000启动
8、按F10几次
9、返回DOS窗口
10、输入名字
11、TRW中断
12、按F10几次
13、返回DOS窗口
14、输入密码
15、TRW中断,分析正式开始
雪    币: 209
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qwert 2005-1-6 15:24
25
0
我是菜鸟,刚学汇编。有楼主此文,学习后得益很多。

谢谢!

可能是前面的一个误处吧:
6、按LOGD

应该是按LOAD吧,当初我还弄不明白。

我试的结果:

用户名:fengfeng
正确注册码:905969664-x019871

请楼主说说,为什么deax要下在此两处?
0167:004016CA
0167:004016D4
游客
登录 | 注册 方可回帖
返回