用Dede再次大戰一個工資管理軟體

gudesheng發表於2008-01-03

目標鎖定: 某款工資軟體

分析:可以從兩個地方入手: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步驟才能執行,所以還是採用靜態分析的方法了.



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=636116


相關文章