某PB程序(登录时有一NAG窗口):
通过反编译软件,发现应用程序对象global external functions中有以下说明:
public function integer mayflowercheckregcode (string username,string product,string ver,string nowdate,string userlicense,string serialnumber,ref string xyz) library "REGSN.DLL" alias for "MayFlowerCheckRegCode"
public function integer mayflowerregisterregcode (string username,string product,string ver,string nowdate,string userlicense,string serialnumber) library "REGSN.DLL" alias for "MayFlowerRegisterRegCode"
查软件安装目前中有REGSN.DLL文件,经查发现为visual c++编译,删除该文件运行出错。
通过反编译软件,发现注册窗口注册按钮clicked事件中有以下代码:
il_ret = mayflowercheckregcode(ls_username,ls_product,ls_version,ls_enddate,ls_userlicense,ls_serialnumber,z)
if il_ret = 0 then
i = mayflowerregisterregcode(ls_username,ls_product,ls_version,ls_enddate,ls_userlicense,ls_serialnumber)
if i = 0 then
messagebox("提示","恭喜!~r~n注册成功!")
close(parent)
else
choose case i
case -1
messagebox("提示","写入注册信息时错误,请检查注册表有无错误!")
case -2
messagebox("提示","产品与注册码不一致,请与软件供应商联系!")
case -3
messagebox("提示","版本与注册号不一致,请与软件供应商联系!")
case -4
messagebox("提示","产品已超过使用期限,请与软件供应商联系!")
case -5
messagebox("提示","机器号与注册码不一致,请与软件供应商联系!")
end choose
parent.sle_username.setfocus()
parent.sle_username.selecttext(1,len(parent.sle_username.text))
end if
else
messagebox("提示","注册失败!~r~n请核对用户名和注册码!~r~n若仍有问题,请与供应商联系!")
parent.sle_username.setfocus()
parent.sle_username.selecttext(1,len(parent.sle_username.text))
end if
用反编译软件查看程序启动过程,居然没有找到调用mayflowercheckregcode函数的地方。但偶肯定程序在启动过程中一定会调用该函数来检查软件注册情况,通过OD跟踪,情况果然如此。
以上情况证实程序是采用本贴所指的保护方式。
pb程序,主程序没什么可跟的,系统领空中跟不出什么名堂,pbvm中更是白白浪费时间。这类软件,尽管有NAG窗口,有注册窗口,这些窗口要拦也拦得住,但偶说即使难住了也没用。因为拦住的时候你要么在系统领空中要么在pbvm里。所以这类软件你不要白费心思去拦这些东西,重要的是跟DLL和其中的注册检证与注册函数,对于本例就是跟到regsn.dll及其中的mayflowercheckregcode函数。
怎么跟到dll和其中的函数,这个并不难。OD载入,F7进去、一路F8,或快或慢你总会进入DLL中的,好了,到了这,在CPU窗口中点鼠标右键,点复制->全选,然后再点鼠标右键,点复制->到文件,这样你就得到了整个DLL的汇编代码。接着,仍然在CPU窗口中点鼠标右键,点搜索->当前模块中的名称,这下,你应该能够看到dll模块的入口地址和其中各函数的入口地址了吧,怎么样,够容易的吧!
再下面的工作,汇编代码的分析。
偶就和你们一样,犯难罗!只因我们是新手!