讓HEXEDIT2.54顯示漢字(5千字)

看雪資料發表於2000-07-23

讓HEXEDIT2.54顯示漢字    湖北 wuhuashang

主頁:http://personal.dfminfo.com.cn/~kuangren/index.htm

  某些西文軟體存在不能輸入漢字或顯示漢字的問題,可能原因是編寫軟體的作者沒有考慮周全,我在此介紹一種除錯修改的方法,以供大家參考.
    準備工作:工具:SOFTICE,HACKVIEW,HEXEDIT2.54.用寫字板寫幾個字如"THISISDEMO我在演示",儲存後登出或啟動計算機.
1.載入SOFTICE,用HEXEDIT開啟剛才寫的檔案,您發現在視窗右欄僅顯示THISISDEMO,漢字全部為'.',現在的任務是要顯示正確的漢字.CTRL+D切入SOFTICE ,下斷點BPX TEXTOUT,退出後更改字母T為M,立即被SOFTICE攔截,
2.BC * ,按若干次F12回到HEXEDIT的領空,
  S DS:0 L FFFFFFFF "MHISISDEM",大搜捕後共有好幾個地址,真正的地址是DS:00XXXXXX,而非DS:CXXXXXXX,  也就是小的地址為HEXEDIT實際存取的地址.
3.BPM DS:00XXXXXX W  (不是R/RW,否則一直被SOFTICE攔截無法返回).
  退出SOFTICE,再將M改為T,好!SOFTICE成功攔截,可以猜想,程式下一步便要讀該地址的內容,然後判別其中的  字串是否在20H-7FH之間,決定是否正常顯示.
  BPE 0 修改斷點為BPM DS:00XXXXXX R,退出SOFTICE,立即又被SOFTICE攔截,原來是用MOVSB把DS:00XXXXXX中  的字串複製到DS:00YYYYYY, 
4.BD *
  BPM DS:00YYYYYY R 退出SOFTICE,立即被攔截返回SOFTICE中,好漂亮!停止在CS:4
12616
 
  004125F2: C745FC00000000              mov      d,[ebp][-0004],000000000 ;" 
.004125F9: E903000000                  jmp      .000412601     
.004125FE: FF45FC                      inc      d,[ebp][-0004]             
.00412601: 8B4510                      mov      eax,[ebp][00010]           
.00412604: 3945FC                      cmp      [ebp][-0004],eax           
.00412607: 0F8D20000000                jge      .00041262D     
.0041260D: 8B45FC                      mov      eax,[ebp][-0004]           
.00412610: 8B4D08                      mov      ecx,[ebp][00008]           
.00412613: 8A0408                      mov      al,[eax][ecx]     
說明:D DS:EAX+ECX  ---文章中的字串!         
.00412616: 50                          push      eax                         
.00412617: E894FFFFFF                  call    .0004125B0  -------- (1)   
.0041261C: 83C404                      add      esp,004 ;" "               
.0041261F: 8B4DFC                      mov      ecx,[ebp][-0004]           
.00412622: 8B550C                      mov      edx,[ebp][0000C]           
.00412625: 880411                      mov      [ecx][edx],al     
說明:AL=?,若AL為可以顯示的字元,則經過(1)CALL處理後還是原來的AL
      若AL為不可顯示(如漢字)字元,則經過(1)CALL處理後AL=2E('.'),原來漢字變成一個'.',此CALL有問
題!       
.00412628: E9D1FFFFFF                  jmp      .0004125FE 
.0041262D: E900000000                  jmp      .000412632 
.00412632: 5F                          pop      edi                         
.00412633: 5E                          pop      esi                         
.00412634: 5B                          pop      ebx                         
.00412635: C9                          leave                                 
.00412636: C3                          retn         
看CALL中的程式碼:
.004125B0: 55                          push      ebp                         
.004125B1: 8BEC                        mov      ebp,esp                     
.004125B3: 53                          push      ebx                         
.004125B4: 56                          push      esi                         
.004125B5: 57                          push      edi                         
.004125B6: 0FBE4508                    movsx    eax,b,[ebp][00008]         
.004125BA: 83F820                      cmp      eax,020 ;" "               
.004125BD: 0F8C1A000000                jl      .0004125DD  -------- (1)
比20H小,AL=2E ,也就是一個'.'   
.004125C3: 0FBE4508                    movsx    eax,b,[ebp][00008]         
.004125C7: 83F87E                      cmp      eax,07E ;"~"               
.004125CA: 0F8F0D000000                jg      .0004125DD  -------- (2)   
比7EH大,AL=2E ,也就是一個'.'
.004125D0: 8A4508                      mov      al,[ebp][00008]             
.004125D3: E90C000000                  jmp      .0004125E4     
.004125D8: E907000000                  jmp      .0004125E4     
.004125DD: B02E                        mov      al,02E ;"."
你在此處想改頭換面?               
.004125DF: E900000000                  jmp      .0004125E4 
.004125E4: 5F                          pop      edi                         
.004125E5: 5E                          pop      esi                         
.004125E6: 5B                          pop      ebx                         
.004125E7: C9                          leave                                 
.004125E8: C3                          retn                                 
.004125E9: 55                          push      ebp                         
.004125EA: 8BEC                        mov      ebp,esp                     

在HACKVIEW中改CS:4125BA之間的程式碼為
  CMP
EAX,00
  JL  4125DF
或用HEXEDIT修改0F8C1A000000為0F8C1C000000
儲存退出.正是:漢字西文
均顯示,古怪字元變成'.'

    版權所有,請不要修改原內容

相關文章