首页
社区
课程
招聘
[原创]让程序自己变成注册机(VFP)
发表于: 2009-5-7 13:41 8159

[原创]让程序自己变成注册机(VFP)

2009-5-7 13:41
8159
最近遇到一个古董级的VFP写的程序,因为我不会VF,大体能看懂的,本来想写算法注册机的
无奈有几行代码不太懂

就把源程序改造成注册机了
程序加壳是
ASProtect 2.3 SKE build 06.26 Beta [Extract]
用脚本脱壳就损坏了程序

于是拿unfoxall直接反编译

这一试不要紧哪,差点成残疾,这屋里的气氛可就有点不对劲啦

带壳就把程序源码导出来了,虽然没有测试是不是能编译整个项目

找到了我最关心的register.SCT如下

PUBLIC registerOK,zcm
registerOK = .f.
zcm = ""
newnamenumber1 = ""
newnamenumber = ""
LOCAL oWbemLocator, oWMIService, oItems, oItem
oWbemLocator = CREATEOBJECT("WbemScripting.SWbemLocator")
oWMIService = oWbemLocator.ConnectServer(".", "root/cimv2")
*oItems = oWMIService.ExecQuery("SELECT Caption FROM " + "Win32_DiskDrive")
oItems = oWMIService.ExecQuery("SELECT Caption FROM " + "Win32_DiskDrive")

FOR EACH oItem IN oItems
    Diskinfo1 = LEFT(RIGHT(oItem.Caption,12),10)
    IF LEN(ALLTRIM(diskinfo1))=10
            EXIT
    ENDIF  
ENDFOR
*用ASC()函数将用户名中所有字符的ASCII码都取出来并连接成一个字符串
for m=1 to len(alltrim(diskinfo1))       
        thisstr=substr(alltrim(diskinfo1),m,1)     &&取出一个字符
        newnamenumber1=newnamenumber1+alltrim(str(asc(thisstr)))
endfor
NewNameNumber1=padl(newnamenumber1,10,"0")
CPKJ=val(NewNameNumber1)

IF !USED("register")
        USE register
ENDIF
SELECT register
IF ISNULL(rname) OR LEN(ALLTRIM(rname))=0
        thisname="江南"     &&取得用户名
ELSE
        thisname = ALLTRIM(rname)
ENDIF
*用ASC()函数将用户名中所有字符的ASCII码都取出来并连接成一个字符串
for m=1 to len(alltrim(thisname))       
        thisstr=substr(alltrim(thisname),m,1)     &&取出一个字符
        newnamenumber=newnamenumber+alltrim(str(asc(thisstr)))
endfor
NewNameNumber=padl(newnamenumber,10,"0")
NAM=val(NewNameNumber)

ZCM1=alltrim(str(bitor(CPKJ,NAM)))
ZCM2=alltrim(str(bitand(CPKJ,NAM)))
ZCM3=alltrim(str(bitor(CPKJ,NAM)))
*ZCM3=alltrim(str(bitxor(CPKJ,NAM)))
one=left(zcm1,3)+"-"     &&取出前三位加“-”
two=substr(zcm2,4,4)+"-"     &&取出中间三位加“-”
three=right(zcm3,3)       
ZCM=one+two+three

SELECT register
regname = rname
regsn = rsn
hardsn = hsn

thisform.text1.Value = regname
thisform.text3.Value = hardsn

IF LEN(ALLTRIM(regsn))>1
        thisform.text2.Value = regsn
ENDIF

IF LEN(ALLTRIM(thisform.text1.Value))>2
        thisform.text2.SetFocus
ELSE
        thisform.text1.SetFocus
ENDIF

IF ALLTRIM(zcm) == ALLTRIM(thisform.text2.Value) AND LEN(zcm) = LEN(ALLTRIM(thisform.text2.Value))
                registerOK = .t.       
                *thisform.command1.Enabled = .f.
ELSE
                registerOK = .f.
                *thisform.command1.Enabled = .t.
ENDIF

这应该是软件启动注册验证的函数吧?虽然大约能看懂,但是翻译不成Delphi的程序

于是找到下面的按钮事件
ROCEDURE Click
zcm = ""
newnamenumber1 = ""
newnamenumber = ""

LOCAL oWbemLocator, oWMIService, oItems, oItem
oWbemLocator = CREATEOBJECT("WbemScripting.SWbemLocator")
oWMIService = oWbemLocator.ConnectServer(".", "root/cimv2")
*oItems = oWMIService.ExecQuery("SELECT Caption FROM " + "Win32_DiskDrive")
oItems = oWMIService.ExecQuery("SELECT Caption FROM " + "Win32_DiskDrive")

FOR EACH oItem IN oItems
    Diskinfo1 = LEFT(RIGHT(oItem.Caption,12),10)
    IF LEN(ALLTRIM(diskinfo1))=10
            EXIT
    ENDIF  
ENDFOR
*用ASC()函数将用户名中所有字符的ASCII码都取出来并连接成一个字符串
for m=1 to len(alltrim(diskinfo1))       
        thisstr=substr(alltrim(diskinfo1),m,1)     &&取出一个字符
        newnamenumber1=newnamenumber1+alltrim(str(asc(thisstr)))
endfor
NewNameNumber1=padl(newnamenumber1,10,"0")
CPKJ=val(NewNameNumber1)

thisname = ALLTRIM(thisform.text1.Value)
*用ASC()函数将用户名中所有字符的ASCII码都取出来并连接成一个字符串
for m=1 to len(alltrim(thisname))       
        thisstr=substr(alltrim(thisname),m,1)     &&取出一个字符
        newnamenumber=newnamenumber+alltrim(str(asc(thisstr)))
endfor
NewNameNumber=thisform.text3.Value///编辑框用来输入别的机器的机器码
//在这里直接给NewNameNumber赋值成别的机器的机器码

NewNameNumber=padl(newnamenumber,10,"0")
NAM=val(NewNameNumber)

ZCM1=alltrim(str(bitor(CPKJ,NAM)))
ZCM2=alltrim(str(bitand(CPKJ,NAM)))
ZCM3=alltrim(str(bitor(CPKJ,NAM)))
*ZCM3=alltrim(str(bitxor(CPKJ,NAM)))
one=left(zcm1,3)+"-"     &&取出前三位加“-”
two=substr(zcm2,4,4)+"-"     &&取出中间三位加“-”
three=right(zcm3,3)       
ZCM=one+two+three
这里真正的注册码就出来了
thisform.text2.Value =ALLTRIM(zcm)
*thisform.text1.Value = regname
IF ALLTRIM(zcm) == ALLTRIM(thisform.text2.Value) AND LEN(zcm) = LEN(ALLTRIM(thisform.text2.Value))
                registerOK = .t.       
                *thisform.command1.Enabled = .f.
ELSE
                registerOK = .f.
                *thisform.command1.Enabled = .t.
ENDIF
IF !USED("register")
        USE register
ENDIF

OK整个程序分析完了,吧修改后的表导入到新建的VFP项目里面编译出exe

执行注册别的机器码生成的注册码在别的机器注册OK

下载地址
http://www.namipan.com/d/test.rar/f4afc664810d6989c65f14affd0459d7e2a29e73aaab6501

只是不明白为什么不用脱壳就能反编译出来源代码呢
往大牛赐教

[课程]Android-CTF解题方法汇总!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 7906
活跃值: (3086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
伪装壳?还有这个是如何反回去重新生成EXE的呢?楼主能演示下么?或者联系我wrsky521#qq.com指点下好么
2009-5-7 15:03
0
雪    币: 451
活跃值: (117)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
不是伪装壳,伪装壳的话不可能用Aspr的脚本脱掉吧

如何反回去重新生成EXE的呢

你装个VF新建项目把反编译的表文件导入就OK了
2009-5-7 16:25
0
雪    币: 261
活跃值: (83)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
这是一个什么样的VFP程序呢?
我倒是常用VFP程序,不过看你这篇有点不是很明白,
能不能发一个附件,或者是做一个链接,看个究竟
Q123037149
2009-5-7 16:26
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我也想不明白,不脱壳能看原程序?楼主用的什么办法
2009-5-8 13:41
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
只好来看看楼主的高见!
2009-5-8 13:42
0
雪    币: 261
活跃值: (83)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
LZ应该把这个软件发上来看一下.顺便说说是怎么不脱壳就看到源程序的?

我看了一下这个程序,这里是调用了WMI,然后把一个叫register的表打开,这个表里存着一个rname字段,里面有一个关键字:江南.
然后用这个词和一些利用WMI得到的系统信息弄出注册码,大概是这样.
没太细看.
我觉得你这个软件好像是一个仓库管理软件吧?
2009-5-8 14:36
0
雪    币: 451
活跃值: (117)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
楼上看的基本正确,只是字面意思

流程不是这样的,我已经把流程截断了,把程序计算机器码的地方截断修改成任意机器码

打算用Delphi写注册机的,可惜有几句代码死活看不懂了,只好作罢
2009-5-8 23:29
0
雪    币: 3149
活跃值: (66)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
楼主一公布,作者好象调整算法了,呵呵!
2009-5-15 23:17
0
雪    币: 224
活跃值: (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
这么简单的问题拿出来讨论。作者是个初学者。vf简单加密都不会搞
2009-5-18 13:22
0
游客
登录 | 注册 方可回帖
返回
//