zxc 发表于 2010-4-8 14:04:47

pbd文件软件破解求助

有一个管理软件,是用PB写的,注册码已破解了,进入软件输入注册码提示正确的,显示已注册的,但退出软件再次进入,又变回未注册用户
请各位高手们抽点时间帮我看看啊,本人在次深表感激之情,哈哈

以下这段代码是打开软件时就开始判断软件是否注册--------------------------------------------------------------------
i = r_driver()

if i = -1 then
        ifzc = false
else
        ifzc = true
end if

ll_rc = dllregisterserver()

if ifzc = false and ifsy = false then
        messagebox("提示","你的软件试用期已到(数据已被锁定),请先注册!")
        halt
end if
-----------------------------------------------------------------------------------------------------------------
以下是r_driver函数的代码-------------------------------------------------------------------------------------------
global function integer r_driver ();long retval
string sdrv
string str
string str2
long a
long ll_flag
long b
ulong ll_retval
string s_retval1
string s_retval2

sdrv = "c:\"
str = space(256)
str2 = space(256)
ll_retval = getvolumeinformationa(sdrv,str,256,retval,a,b,str2,256)
s_retval1 = string(retval,"################")
select driver , flag from driverusing sqlca;
/* SQL Parameters List
0-> :s_retval2
1-> :ll_flag
*/
ll_flag = ll_flag + 1

if isnull(s_retval2) then
        s_retval2 = "9"
else
        s_retval2 = trim(s_retval2)
end if

if ll_flag < 120 then
        ifsy = true
else
        ifsy = false
end if

if ((check_dog() = 1) or (check_dog_hid() = 1)) then
        return 1
else

        if ll_flag > 80 then
                messagebox("提示","软件试用期即将结束,请注册!")
        end if

        update driver set flag =0using sqlca;
/* SQL Parameters List
0-> :ll_flag
*/
        commit using sqlca;
        return -1
end if
end function
-----------------------------------------------------------------------------------------------------------------------
以下是check_dog函数的代码------------------------------------------------------------------------------------------------

global function integer check_dog ();long handle = -1
uint id = 65535
ulong pswd
ulong nvalue
string keyp = "                                                                              "
boolean rc = false

id = 29507
handle = openschip(id,keyp)

if handle < 0 then
        closeschip(handle)
        return -1
end if

pswd = 67 * 16 ^ 6 + 115 * 16 ^ 4 + 25 * 16 ^ 2 + 1
rc = readschipmem(handle,pswd,1,nvalue)

if rc then

        if nvalue < 16 then
        else

                if nvalue < 256 then
                else

                        if nvalue < 4096 then
                        end if

                end if

        end if

else
        messagebox("R/W Error","请检查软件狗是否正确安装?",none!)
        closeschip(handle)
        return -1
end if

if trim(inttohexstr(nvalue,4)) <> "8976" then
        messagebox("提示","软件狗密码错误!")
        closeschip(handle)
        return -1
end if

closeschip(handle)
return 1
end function
---------------------------------------------------------------------------------------------------------------------
以下是check_dog_hid函数的代码------------------------------------------------------------------------------------------
global function integer check_dog_hid ();string ls_mm
boolean ri = false
sk_init_data initdata
string szpath
long hkey
uint userid
boolean rl = false
integer index
integer length
long readpsd
string buffer = "          "
integer i
string output

initdata.cbsize = 32
initdata.keymode = 1
initdata.sdkversion = 1
ri = sk_init(initdata)
userid = 60206
szpath = space(255)
hkey = sk_open(userid,szpath)

if hkey = -1 then
        sk_close(hkey)
        hkey = -1
        return -1
end if

index = 0
length = 10
readpsd = 197343
rl = sk_readprotectmemory(hkey,readpsd,index,buffer,length)

if rl = false then
        messagebox("R/W Error","请检查软件狗是否正确安装?",none!)
        sk_close(hkey)
        hkey = -1
        return -1
end if

sk_close(hkey)
hkey = -1

for i = 1 to length
        output = output + " " + string(asc(mid(buffer,i,1)))
next

if trim(output) <> "68 69 77 79 95 90 89 72 0 0" then
        messagebox("提示","软件狗密码错误!")
        sk_close(hkey)
        hkey = -1
        return -1
end if

return 1
end function
--------------------------------------------------------------------------------------------------
求各位帮我看看啊,我用UE想把
i = r_driver()

if i = -1 then
        ifzc = false
else
        ifzc = true
end if
这里的i=-1改成i<>-1,在UE里就是没办法找到这几个的机器码,只能找到这段代码之前的和之后的。所以没则了,搞不定啊,我又是新手
恳求各位帮忙,谢谢!!

whypro 发表于 2010-4-8 18:14:32

能否附上bin。
查看是否有保存注册信息的地方。

推荐使用c32asm查找字符串和文件偏移吧。

[ 本帖最后由 whypro 于 2010-4-8 18:20 编辑 ]

zxc 发表于 2010-4-8 19:34:49

注册码是保存在数据库里的,使用的是sql anywhere的数据库,我打开看了
我觉得问题应该是出在check_dog和check_dog_hid这两段代码里
c32asm使用了,但还是无法找到相关的字符串
请问一下,是打开EXE文件查找呢?还是打开PBD文件查找
这个软件的EXE,一运行就加载那些PBD的文件

whypro 发表于 2010-4-8 22:11:44

SHUDEPB PB反编译专家 FOR PB6/PB7/PB8/PB9/PB10

这是一个长时间的计划,起于03年,05年初用PB完成大致的功能,后来用VC改写了一年(因为不是经常有时间)。

比先前出现过的反编译器有几个进步。
1.可以反编译出几乎所有的SQL.
2.并非孤立地看一个对象,从整个LIBRARYLIST进行搜索,对象的引用、继承上可以更精确地命中。事实上,我相信,很多人都不明白这一点有什么用,即便在决定购买的时候),有些继承过来的属性,如果不分析它的祖先,无法命中(简单的,譬如引用了祖先一个实例变量 i_transaction_object.sqlcode)。
3.对象可以导出为PB接受的*.sr*.
4.可以反向生成structure
5.datawindow的反向生成,使用了PB自带的方法(在打开PBD时DATAWINDOW项可以导出为一个APPLICATION,编译后就可以完成了)
6.可以直接生成pbl,但有BUG,函数和事件的次序错乱,需在PBL中IMPORT第3点中导出的*.SR*.
7.支持 PB6.5/PB7.0/PB8.0/PB9.0/PB9.01/PB9.03/PB10.0/PB10.1/PB10.2/PB10.5/PB11.0CTP (DEMO版中不支持PB10.2/PB10.5/PB11.0CTP)

更新列表
1.3 1.加入对PB9.1/PB9.3/PB10.2的支持
2.修改了语法分析的3个BUG。
1.4 Ver1.4
1.修改了对全局变量(Global Variables)和实例变量(Instance Variables)多层复杂属性的分析。
2.修改了2个对PROCEDURE的变量分析。
3.修改了当时程序由PB翻译到VC时对**数组分析的疏漏。
4.修改了3个语义分析的BUG。
5.加入了对7种不太常见的PB逻辑语法的分析。
6.修改了另存为PBL时不支持太多对象的BUG。
7.加入了另外几个小功能。

另存为PBL时还是需要IMPORT由EXPORT功能导出的*.SR*,因为这个功能/工作量比太小.
还有另一个BUG是可以预见的,但没改(因为可能性较小,工作量较大).

http://www.pb11.net/

http://www.pb11.net/data/shudepb.rar

zxc 发表于 2010-4-9 11:07:08

/:L 楼上的哥哥啊,这个我已经用上了,谢谢你啊!!
但是解决不了问题啊!!

zxc 发表于 2010-4-9 11:07:56

/:012 这里能帮助新手的前辈好少啊,是咋回事呢?是我的问题太简单的?还是没有好心的前辈出现呢?

whypro 发表于 2010-4-9 18:41:52

pbkiller2.5.18
http://down1.hur.cn/down1/pb/free/pbkiller2.5.18
http://www.pediy.com/tools/Decompilers/pb/PBKiller/PBKiller2.5.18.rar
可反编译出PB6,7,8,9,10编译后的程序中的所有对象

[ 本帖最后由 whypro 于 2010-4-9 19:15 编辑 ]

zxc 发表于 2010-4-10 11:23:40

楼上的兄弟,这些软件,我已有,只能看源码

zxc 发表于 2010-4-11 20:28:50

i = r_driver()
if i = -1 then
      ifzc = false
else
      ifzc = true
end if
通过UE已成功修改将i的返回值改为1,经过很多方面的对比,才得出return -1在UE中的位置
页: [1]
查看完整版本: pbd文件软件破解求助