<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog336280.html" frameborder="0" width="336" scrolling="no" height="280"></iframe>
目标锁定: 某款工资软件
分析:可以从两个地方入手:1 登陆菜单中判断时间过期处 2 填写注册信息的表单
下面先从2入手
1 文件脱壳,分析完毕
2 进入“窗体”,看每一个窗体的标题,找到“公司信息及注册”TFrm_ComPany
3 找到其中的一个按钮
object BtnReg: TBitBtn
Left = 144
Top = 8
Width = 89
Height = 25
Caption = '马上注册'
Default = True
Font.Charset = GB2312_CHARSET
Font.Color = clRed
Font.Height = -12
Font.Name = '宋体'
Font.Style = []
ParentFont = False
TabOrder = 0
OnClick = BtnRegClick 4 在“过程”里面查找类名为TFrm_ComPany的类对应的单元名,为CompanyUnit
或者 在“工程”里面创建文件,在生成dump目录的events.txt 里面查找TFrm_ComPany,知道该文件的名字是CompanyUnit.pas
5 点击CompanyUnit,在右边“事件”中看到BtnRegClick等这几个方法调用,一个一个察看
6 先双击BtnRegClick,察看该过程的代码
* Reference to: forms.TApplication.MessageBox(TApplication;PChar;PChar;Longint):Integer;
这里应该是弹出"填写公司名称"的窗口,继续往下走
接下来执行了一个SQL,根据后面的分析,应该是验证完注册马之后,才保存用户单位信息,所以验证应该在此处前面
* Possible String Reference to: 'Update Sys_Company Set 企业名称=:Company,企业地址=:Address,联系电话=:tel,网址=:Web,'
* Possible String Reference to: ' 电子邮件=:Email,硬盘号=:HardWareId,注册号=:SerialNo'
* Possible String Reference to: ' where 编码=:DiskNo'
从Try开始,操作数据库,所以Try往上
从此处往上找jmp,
005010B9 E955040000 jmp 00501513 如果要不执行该句,往上只有
00501097 7425 jz 005010BE
因此,思路有了
从头开始看
* Reference to control TFrm_ComPany.EdtComPany : TdxEdit
* Reference to: controls.TControl.GetText(TControl):TCaption;
* Reference to: forms.TApplication.MessageBox(TApplication;PChar;PChar;Longint):Integer;
检查公司名不为空
* Reference to control TFrm_ComPany.EdtSerialNo : TdxEdit
* Reference to: controls.TControl.GetText(TControl):TCaption;
取得序列号,不知道做了什么
* Reference to control TFrm_ComPany.EdtSerialNo : TdxEdit
* Reference to: controls.TControl.GetText(TControl):TCaption;
又取了一遍
然后又作了什么,就到了
00501097 7425 jz 005010BE ,从005010BE继续顺利前进
否则,不跳的话,Label1付值,应该就是显示“注册号不正确”
* Reference to control TFrm_ComPany.Label1 : TLabel
* Reference to: controls.TControl.SetText(TControl;TCaption);
所以关键就是这里的jz要改成jmps
在工具--> 地址偏移转换器中,RVA输入00501097,得到物理地址00101097
用UltraEdit找到00101090,在第7 8 列有7524
修改之后,重新登陆,发现仍然说试用期以过,看来还是只能从检查试用期着手
看看MainFrm中,登陆窗体是如何载入的
1 查找TMainFrm,单元名Main
2 在生成的工程文件Main.pas中找到TFrm_ComPany,
发现
procedure TMainFrm.N8Click(Sender : TObject);
begin
(*
* Reference to : TFrm_ComPany.Proc_00500C4C()
|
00729850 E8F773DDFF call 00500C4C
00729855 C3 ret
*)
end;
由此可知TFrm_ComPany.Proc_00500C4C是初始化函数
上面没什么思路,从1开始入手
1 找到TUserLoginFrm
object BtOk: TFlatButton
OnClick = FlatButton1Click
2 找到从events.txt里面找到其对应的为LoginWinUnit(单元名)或直接在过程里面找TUserLoginFrm,注意过程中的类名不按照顺序排列的
3 找到事件FlatButton1Click
TUserLoginFrm.Proc_005085C8() 是Main里面调用登陆的启动函数
4 启动的时候,先检查密码错误,然后弹出“试用期结束”,然后弹出注册框
所以,直接找到
Possible String Reference to: '密码输入错误!!!' 这行
00508D3D 685C8F5000 push $00508F5C
之后的函数每一个都很重要了,一个个的看
* Reference to: Unit_00409424.Proc_0040BC18
一进入就看到一个* Reference to: kernel32.GetLocalTime()
根据上面,显示一个对话框有固定的语句
* Reference to: controls.TControl.GetText(TControl):TCaption;
|
00508BD5 E8CE0BF3FF call 004397A8
00508BDA 8B45E4 mov eax, [ebp-$1C]
00508BDD 50 push eax
* Possible String Reference to: '不存在该工号的用户!!!'
|
00508BDE 68D48E5000 push $00508ED4
* Reference to: Unit_00409424.Proc_0040BC18
|
00508BE3 E83030F0FF call 0040BC18
00508BE8 83C4F8 add esp, -$08
00508BEB DD1C24 fstp qword ptr [esp]
00508BEE 9B wait
00508BEF 8D55E0 lea edx, [ebp-$20]
* Reference to control TUserLoginFrm.LoginName_Edit : TdxPickEdit
|
00508BF2 8B86FC020000 mov eax, [esi+$02FC]
* Reference to : TdxInplaceMaskEdit._PROC_004C742C()
|
00508BF8 E82FE8FBFF call 004C742C
00508BFD 8B45E0 mov eax, [ebp-$20]
* Reference to pointer to GlobalVar_00734AC8
|
00508C00 8B15E82E7300 mov edx, [$00732EE8]
* Reference to field GlobalVar_00734AC8.OFFS_0038
|
00508C06 8B5238 mov edx, [edx+$38]
所以我们排除很多无用的代码
* Reference to: Unit_00501C00.Proc_00504DF8 这是纪录这次登陆的日志,这里也是唯一可能的地方了,双击进入
什么都不用想,找jmp
00504E4B E92A010000 jmp 00504F7A
但仔细察看后,发现没有什么jz,jnz,光是jmp是没有作用的
于是只能往上找,在检查了用户名,密码的SQL后面,发现了
00508CCC E81790FFFF call 00501CE8
它里面有和运行日期相关的SQL,应该是第一次运行建立帐号的,如果账号已经存在了,就把序列号,上次使用时间全部取出来,
可能用于判断
(实在搞不定了,我狠狠心把00508CCC得E81790FFFF改成9090909090,最后成功)
总结: 作者设计的加密还是还是比较小心,浪费我好多时间,最后只有咬牙赌运气,没想到成功了,本来准备用Softice调试的,无奈本机是XP系统,要执行那个所谓的21步骤才能运行,所以还是采用静态分析的方法了.
相关推荐
dede 5.7软件免登陆接口模块
dede列表没三个一组展示,一般都是一个循环,这个三个一组循环
dede的后台管理,是企业版的 很棒 可以轻松使用
用DeDe可以查看Delphi程序窗体的属性,可以查看按钮对应的事件,并将事件代码反汇编出来,其能识别出Delphi库函数,具有良好的可读性。另外,还可以把事件输出到map文件中供其他工具使用
dede的订单管理插件,比较简单,适合一些垃圾站用
dede找回管理员密码工具,很方便的工具,如果你忘记了密码可以很轻松的找回
DEDE淘宝插件DEDE淘宝插件DEDE淘宝插件DEDDEDE淘宝插件E淘宝插件
dede标签大全_dede标签生成工具,DEDE仿站利器
DEDE凤舞模板非常好的DEDE模板很难找的,请下载
DEDE凤舞模板DEDE凤舞模板DEDE凤舞模板DEDE凤舞模板
dede 采集3个 网站采集规则
delphi反编译工具 dede3.99,可提取源代码 支持win7 win8 win10 32-64位系统
delphi dede.5 delphi dede.5 delphi dede.5
本软件,本人所有,仅供学习使用,请勿用于非法用途,违法使用本软件造成任何后果,软件开发者不承担任何责任,未经受权随意传播,造成一切后果,由传播人及使用人负责! 本软件运行后可直接点击开始扫描,扫描成功...
将Delphi编译的Exe反汇编成Delphi源程序,效果还不错,dfm可以弄出来,不过 Pas里还是ASM,对于研究破解还是很有用的
想二次开发dede,拓展功能。自己在网上找了好多的帮助文档,感觉都不是很好。所以决定自己写个得的插件帮助教程。希望对大家有所帮助。
本工具是用于新人忘记管理员密码重设所制作,只需要将radminpass.php文件拷贝到根目录,运行“http://yousite/radminpass.php(yousite为网站域名)”,按照操作执行就可以。恢复完成后请及时删除这个文件!
手动整合dede,discuz,给需要的同志做一个参考
dede标签的使用,DEDE seo小技巧 加个百度搜索本篇文章
dede后台登录界面 dede, dede后台,登录界面