用Dede再次大战一个工资管理软件

目标锁定: 某款工资软件

分析:可以从两个地方入手: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  <---这个00501513直接就是End了
如果要不执行该句,往上只有
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步骤才能运行,所以还是采用静态分析的方法了.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,可以给您提供一份基础的用户登录页面的代码,您可以自行根据实际需求进行调整和修改: ``` <!DOCTYPE html> <html> <head> <title>用户登录</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- 引入jQuery库 --> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <style type="text/css"> body { font-family: Arial, sans-serif; background-color: #f2f2f2; } .container { width: 400px; margin: 0 auto; padding: 20px; background-color: #fff; border-radius: 5px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); } h1 { text-align: center; margin-top: 0; } label { display: block; margin-bottom: 10px; font-weight: bold; } input[type="text"], input[type="password"] { display: block; width: 100%; padding: 5px; margin-bottom: 20px; border: none; border-radius: 5px; box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.1); } input[type="submit"] { display: block; margin: 0 auto; padding: 10px 20px; background-color: #4CAF50; border: none; border-radius: 5px; color: #fff; cursor: pointer; transition: background-color 0.3s ease-in-out; } input[type="submit"]:hover { background-color: #3E8E41; } .error { padding: 10px; background-color: #f2dede; color: #a94442; border-radius: 5px; margin-bottom: 10px; } .success { padding: 10px; background-color: #dff0d8; color: #3c763d; border-radius: 5px; margin-bottom: 10px; } </style> </head> <body> <div class="container"> <h1>用户登录</h1> <form id="login-form" action="login.php" method="post"> <label for="username">用户名</label> <input type="text" id="username" name="username" required> <label for="password">密码</label> <input type="password" id="password" name="password" required> <input type="submit" value="登录"> </form> </div> <script type="text/javascript"> $(function(){ $('#login-form').submit(function(e){ e.preventDefault(); var username = $('#username').val(); var password = $('#password').val(); // TODO: 发送登录请求的代码 }); }); </script> </body> </html> ``` 这是一个简单的用户登录页面,包括用户名、密码两个输入框和一个登录按钮。在用户点击登录按钮时,会触发一个JavaScript函数,你可以在这个函数中编写发送登录请求的代码。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值