首页
社区
课程
招聘
[旧帖] win32asm为什么出现乱码? 0.00雪花
发表于: 2015-2-21 10:52 5778

[旧帖] win32asm为什么出现乱码? 0.00雪花

2015-2-21 10:52
5778
.data
                        
zhString DWORD "桩号",0
qdString DWORD "起点",0

.data?
lpString2 LPTSTR 512 dup(?)

.code

        mov eax,qdString
        mov lpString2[0],eax
        mov eax,zhString
        mov lpString2[4],eax

        invoke TextOut,hdc,0,24,ADDR lpString2,SIZEOF lpString2
输出lpString2竟是乱码,请问是什么原因?

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 0
活跃值: (122)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你把 .data 和 .data?中的数据类型都换成 db 一个就可以了. 你这三个变量都是字符串吧。在masm32中字符串都是数据类型都是db的,不管中英文。  
我有个问题哦,你的编译器是什么啊? 为什么字符串定义DWORD都会过啊??我用masm32都会报错诶。
怎么会有LPTSTR这种数据类型呢? 我的编译器里面都没有这个数据类型。
2015-3-1 16:31
0
雪    币: 166
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
masm32v11.0版。
还是乱码。
2015-3-4 08:21
0
雪    币: 0
活跃值: (122)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
.data 
                        
zhString DWORD "桩号",0	
qdString DWORD "起点",0

.data? 
lpString2 LPTSTR 512 dup(?)

.code

        mov eax,qdString			
        mov lpString2[0],eax
        mov eax,zhString
        mov lpString2[4],eax

        invoke TextOut,hdc,0,24,ADDR lpString2,SIZEOF lpString2
;下面是TextOut在MSDN中的定义.		
BOOL TextOut(
  _In_  HDC hdc,
  _In_  int nXStart,
  _In_  int nYStart,
[B][U][COLOR="Red"]  _In_  LPCTSTR lpString[/COLOR][/U][/B],	;注意这里,  这个参数类型是字符串指针.想一想你给它传递了真确的指针了吗??
  _In_  int cchString
);


ADDR lpString2 得到的是字符串的指针吗??
lpString2这个位置里面存的是什么数据?
我们来看看前面的操作,
 
        mov eax,qdString		;把qdString的偏移赋给eax	
        mov lpString2[0],eax        ;lpString2[0]开始的两个字[B][COLOR="Red"]存放qdString的偏移[/COLOR][/B],而[B][COLOR="Purple"]不是字符串的内容[/COLOR][/B]
        mov eax,zhString              ;下面一样,相信你已经明白了
        mov lpString2[4],eax

所以,应该是TextOut这个函数的参数传错了. 第四个参数不应该是ADDR lpString2 而应该是 lpString2, 当然后面的参数也应该修改,自然也就不是SIZEOF lpString2了。

最后一个建议,用RadAsm吧, 集成开发环境方便一点,论坛就有。
2015-3-4 11:58
0
雪    币: 166
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
mov eax,offset zhString
        mov lpString11[160],eax
        mov eax,offset zhString[4]
        mov lpString11[164],eax
        mov eax,offset zhString[8]
        mov lpString11[168],eax
        mov eax,offset zhString[12]
        mov lpString11[172],eax
        mov lpString11[173],0000H
        mov lpString11[174],000AH
        mov lpString11[175],000DH
还是不行,乱码。
2015-3-6 07:36
0
雪    币: 166
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
mov eax,"桩号"
mov lpString11[160],eax
也是乱码,是怎么回事?
2015-3-6 10:26
0
雪    币: 0
活跃值: (122)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
贴一下完整代码吧
2015-3-6 13:18
0
雪    币: 166
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
.386
.model flat,stdcall
option casemap:none
; 过程函数定义?

WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD
PmsjProc proto :DWORD,:DWORD,:DWORD,:DWORD

; 包含文件?

include \masm32\include\debug.inc
includelib \masm32\lib\debug.lib

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
include \masm32\include\masm32.inc
include \masm32\include\Fpu.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\Fpu.lib

; 数据初始化?

.data
ClassName db "SimpleWinClass",0
AppName  db "路桥工程",0
MenuName db "IDR_MENU",0               ; The name of our menu in the resource file.
                          
zhString db "桩号:",0
zbxString db "X坐标:",0
zbyString db "Y坐标:",0
qdString db "起点",0
jdString db "交点",0
zdString db "终点",0
hq1String db "第一缓和曲线",0
hq2String db "第二缓和曲线",0

zhnum1 dt 0
qdxnum1 dt 0
qdynum1 dt 0
jdxnum1 dt 0
jdynum1 dt 0
zdxnum1 dt 0
zdynum1 dt 0
hq1num1 dt 0
yqnum1 dt 0
hq2num1 dt 0

num1 dt 0
num2 dt 0
num3 dt 0
num4 dt 0
num5 dt 0
num6 dt 0
num7 dt 0
num8 dt 0
num9 dt 0
num10 dt 0
              
str1 dd 0
str2 dd 0
str3 dd 0
str4 dd 0
str5 dd 0
str6 dd 0
str7 dd 0
str8 dd 0
str9 dd 0
str10 dd 0
str11 dd 0
str12 dd 0

  

; 未初始化数据?

.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
buffer db 512 dup(?)
lpString11 LPCTSTR 512 dup(?)
lpString1 LPCTSTR 4 dup(?)
lpString2 LPCTSTR 4 dup(?)
lpString3 LPCTSTR 4 dup(?)
lpString4 LPCTSTR 4 dup(?)
lpString5 LPCTSTR 4 dup(?)
lpString6 LPCTSTR 4 dup(?)
lpString7 LPCTSTR 4 dup(?)
lpString8 LPCTSTR 4 dup(?)
lpString9 LPCTSTR 4 dup(?)
lpString10 LPCTSTR 4 dup(?)
nMaxCount db  ?
hdc HDC ?

; 常量定义?

.const

  __UNICODE__ equ 1

  IDR_MENU equ  10000
  IDM_XJ equ  10008
  IDM_DK equ  10002
  IDM_BC equ  10003
  IDM_LC equ  10004
  IDM_DYYL equ  10005
  IDM_DY equ  10006
  IDM_DYSZ equ  10007
  IDM_CX equ  10010
  IDM_CZ equ  10014
  IDM_JQ equ  10011
  IDM_FZ equ  10012
  IDM_NL equ  10013
  IDM_PMSJ equ  10016
  IDM_ZDMSJ equ  10017
  IDM_ZDSJ equ  10018
  IDM_JDSJ equ  10019
  IDM_BQ equ  10022
  IDM_LQ equ  10023

  IDD_DLG1 equ  1000

  IDC_STC1 equ  1001
  IDC_STC2 equ  1002
  IDC_STC3 equ  1003
  IDC_STC4 equ  10031
  IDC_STC5 equ  10032
  IDC_STC6 equ  10033
  IDC_STC7 equ  10034
  IDC_STC8 equ  10035
  IDC_STC9 equ  10036
  IDC_STC10 equ  10037
  IDC_EDT1 equ  1004
  IDC_EDT2 equ  1005
  IDC_EDT3 equ  1006
  IDC_EDT4 equ  10061
  IDC_EDT5 equ  10062
  IDC_EDT6 equ  10063
  IDC_EDT7 equ  10064
  IDC_EDT8 equ  10065
  IDC_EDT9 equ  10066
  IDC_EDT10 equ  10067
  IDC_BTN1 equ  1007
  IDC_BTN2 equ  1008
  IDC_BTN3 equ  1009

; 代码段?

.code
start:
    invoke GetModuleHandle, NULL
    mov    hInstance,eax
    invoke GetCommandLine
    mov CommandLine,eax
    invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
    invoke ExitProcess,eax
; 主函数?

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    LOCAL wc:WNDCLASSEX
    LOCAL msg:MSG
    LOCAL hwnd:HWND
    mov   wc.cbSize,SIZEOF WNDCLASSEX
    mov   wc.style, CS_HREDRAW or CS_VREDRAW
    mov   wc.lpfnWndProc, OFFSET WndProc
    mov   wc.cbClsExtra,NULL
    mov   wc.cbWndExtra,NULL
    push  hInst
    pop   wc.hInstance
    mov   wc.hbrBackground,COLOR_WINDOW+1
    mov   wc.lpszMenuName,OFFSET IDR_MENU        ; Put our menu name here
    mov   wc.lpszClassName,OFFSET ClassName
    invoke LoadIcon,NULL,IDI_APPLICATION
    mov   wc.hIcon,eax
    mov   wc.hIconSm,eax
    invoke LoadCursor,NULL,IDC_ARROW
    mov   wc.hCursor,eax
    invoke RegisterClassEx, addr wc
    invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
           WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
           CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
           hInst,NULL
    mov   hwnd,eax
    invoke ShowWindow, hwnd,SW_SHOWNORMAL
    invoke UpdateWindow, hwnd
    .WHILE TRUE
                invoke GetMessage, ADDR msg,NULL,0,0
                .BREAK .IF (!eax)
                invoke DispatchMessage, ADDR msg
    .ENDW
    mov     eax,msg.wParam
    ret
WinMain endp
; 过程?

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
      LOCAL ps:PAINTSTRUCT
      LOCAL hfont:HFONT
      LOCAL rect:RECT
         
    .IF uMsg==WM_DESTROY
        invoke PostQuitMessage,NULL
      
     .elseif uMsg == WM_PAINT

        invoke BeginPaint,hWnd, ADDR ps
        mov    hdc,eax
        ;invoke CreateFont,24,0,0,0,0,0,0,0,0,0,0,0,0,0
        ;invoke SelectObject, hdc, eax
        ;mov    hfont,eax
        ;invoke TextOut,hdc,0,0,ADDR lpString1,SIZEOF lpString1
        ;invoke TextOut,hdc,0,24,ADDR lpString2,SIZEOF lpString2
        ;invoke TextOut,hdc,0,48,ADDR lpString3,SIZEOF lpString3
        ;invoke TextOut,hdc,0,72,ADDR lpString4,SIZEOF lpString4
        ;invoke TextOut,hdc,0,96,ADDR lpString5,SIZEOF lpString5
        ;invoke TextOut,hdc,0,120,ADDR lpString6,SIZEOF lpString6
        ;invoke TextOut,hdc,0,144,ADDR lpString7,SIZEOF lpString7
        ;invoke TextOut,hdc,0,168,ADDR lpString8,SIZEOF lpString8
        ;invoke TextOut,hdc,0,192,ADDR lpString9,SIZEOF lpString9
        ;invoke TextOut,hdc,0,216,ADDR lpString10,SIZEOF lpString10
        ;invoke TextOut,hdc,0,240,ADDR lpString11,SIZEOF lpString11
        ;invoke TextOut,hdc,0,264,ADDR lpString11[16],SIZEOF lpString11[16]

        invoke GetClientRect,hWnd, ADDR rect
        invoke DrawText, hdc,ADDR lpString11,512, ADDR rect,0        --------------输出字符串                          
      
        ;invoke SelectObject,hdc, hfont  
        invoke EndPaint,hWnd, ADDR ps

                       
        ;invoke GetDC,hWnd
        ;mov hdc,eax
        ;invoke TextOut,hdc,0,0,ADDR lpString2,SIZEOF lpString2
        ;invoke ReleaseDC,hdc,0

        ;invoke SetScrollRange,hWnd,SB_CTL,10,10,0       
         
    .ELSEIF uMsg==WM_COMMAND
        mov eax,wParam
        .IF eax==IDM_PMSJ
            invoke DialogBoxParam, hInstance,IDD_DLG1,NULL,DlgProc, NULL
            invoke InvalidateRect,hWnd,0,0
            
        .ELSEIF eax==IDM_ZDMSJ
            invoke MessageBox, NULL,ADDR AppName, OFFSET AppName,MB_OK
        .ELSEIF eax==IDM_ZDSJ
            invoke MessageBox,NULL,ADDR AppName, OFFSET AppName, MB_OK
        
        
        .ELSE
        
            invoke DestroyWindow,hWnd
        .ENDIF
        
    .ELSE
               
        invoke DefWindowProc,hWnd,uMsg,wParam,lParam
        ret
    .ENDIF
    xor    eax,eax
    ret
WndProc endp
; 函数?

DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
      
    .IF uMsg==WM_INITDIALOG
        invoke GetDlgItem, hWnd,IDC_EDT1
        invoke SetFocus,eax
    .ELSEIF uMsg==WM_CLOSE
        invoke EndDialog, hWnd,NULL
    .ELSEIF uMsg==WM_COMMAND
        mov eax,wParam
        .IF eax==IDC_BTN1
                invoke PmsjProc,hWnd,uMsg,wParam,lParam
                                               
        .ELSEIF eax==IDC_BTN2
                invoke MessageBox,NULL,ADDR buffer,ADDR AppName,MB_OK
        .ELSEIF eax==IDC_BTN3
                invoke EndDialog, hWnd,NULL
            .ENDIF
        .ELSE
            mov eax,FALSE
            ret
        .ENDIF
     mov eax,TRUE
    ret
DlgProc endp
; 函数?

PmsjProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM

               
        invoke GetDlgItemText,hWnd,IDC_EDT1,ADDR lpString1,SIZEOF lpString1
        mov eax,lpString1
        mov lpString11,eax
        mov eax,lpString1[4]
        mov lpString11[4],eax
        mov eax,lpString1[8]
        mov lpString11[8],eax
        mov eax,lpString1[12]
        mov lpString11[12],eax
        mov lpString11[13],0000H
        mov lpString11[14],000AH
        mov lpString11[15],000DH
         
        
        invoke FpuAtoFL, ADDR lpString1, ADDR zhnum1, DEST_MEM

        
               
        
               
        invoke GetDlgItemText,hWnd,IDC_EDT2,ADDR lpString2,SIZEOF lpString2
        mov eax,lpString2
        mov lpString11[16],eax
        mov eax,lpString2[4]
        mov lpString11[20],eax
        mov eax,lpString2[8]
        mov lpString11[24],eax
        mov eax,lpString2[12]
        mov lpString11[28],eax
        mov lpString11[29],0000H
        mov lpString11[30],000AH
        mov lpString11[31],000DH
        
        invoke FpuAtoFL, ADDR lpString2, ADDR qdxnum1, DEST_MEM
        

                    
        invoke GetDlgItemText,hWnd,IDC_EDT3,ADDR lpString3,SIZEOF lpString3
        mov eax,lpString3
        mov lpString11[32],eax
        mov eax,lpString3[4]
        mov lpString11[36],eax
        mov eax,lpString3[8]
        mov lpString11[40],eax
        mov eax,lpString3[12]
        mov lpString11[44],eax
        mov lpString11[45],0000H
        mov lpString11[46],000AH
        mov lpString11[47],000DH
      
        invoke FpuAtoFL, ADDR lpString3, ADDR qdynum1, DEST_MEM

        
        
        invoke GetDlgItemText,hWnd,IDC_EDT4,ADDR lpString4,SIZEOF lpString4
        mov eax,lpString4
        mov lpString11[48],eax
        mov eax,lpString4[4]
        mov lpString11[52],eax
        mov eax,lpString4[8]
        mov lpString11[56],eax
        mov eax,lpString4[12]
        mov lpString11[60],eax
        mov lpString11[61],0000H
        mov lpString11[62],000AH
        mov lpString11[63],000DH
        
        invoke FpuAtoFL, ADDR lpString4, ADDR hq1num1, DEST_MEM

        
        
        invoke GetDlgItemText,hWnd,IDC_EDT5,ADDR lpString5,SIZEOF lpString5
        mov eax,lpString5
        mov lpString11[64],eax
        mov eax,lpString5[4]
        mov lpString11[68],eax
        mov eax,lpString5[8]
        mov lpString11[72],eax
        mov eax,lpString5[12]
        mov lpString11[76],eax
        mov lpString11[77],000H
        mov lpString11[78],000AH
        mov lpString11[79],000DH
        
        invoke FpuAtoFL, ADDR lpString5, ADDR jdxnum1, DEST_MEM

        
        
        invoke GetDlgItemText,hWnd,IDC_EDT6,ADDR lpString6,SIZEOF lpString6
        mov eax,lpString6
        mov lpString11[80],eax
        mov eax,lpString6[4]
        mov lpString11[84],eax
        mov eax,lpString6[8]
        mov lpString11[88],eax
        mov eax,lpString6[12]
        mov lpString11[92],eax
        mov lpString11[93],0000H
        mov lpString11[94],000AH
        mov lpString11[95],000DH
        
        invoke FpuAtoFL, ADDR lpString6, ADDR jdynum1, DEST_MEM

        
        
        invoke GetDlgItemText,hWnd,IDC_EDT7,ADDR lpString7,SIZEOF lpString7
        mov eax,lpString7
        mov lpString11[96],eax
        mov eax,lpString7[4]
        mov lpString11[100],eax
        mov eax,lpString7[8]
        mov lpString11[104],eax
        mov eax,lpString7[12]
        mov lpString11[108],eax
        mov lpString11[109],0000H
        mov lpString11[110],000AH
        mov lpString11[111],000DH
        
        invoke FpuAtoFL, ADDR lpString7, ADDR yqnum1, DEST_MEM

        
        
        invoke GetDlgItemText,hWnd,IDC_EDT8,ADDR lpString8,SIZEOF lpString8
        mov eax,lpString8
        mov lpString11[112],eax
        mov eax,lpString8[4]
        mov lpString11[116],eax
        mov eax,lpString8[8]
        mov lpString11[120],eax
        mov eax,lpString8[12]
        mov lpString11[124],eax
        mov lpString11[125],0000H
        mov lpString11[126],000AH
        mov lpString11[127],000DH
        
        invoke FpuAtoFL, ADDR lpString8, ADDR zdxnum1, DEST_MEM

        
        
        invoke GetDlgItemText,hWnd,IDC_EDT9,ADDR lpString9,SIZEOF lpString9
        mov eax,lpString9
        mov lpString11[128],eax
        mov eax,lpString9[4]
        mov lpString11[132],eax
        mov eax,lpString9[8]
        mov lpString11[136],eax
        mov eax,lpString9[12]
        mov lpString11[140],eax
        mov lpString11[141],0000H
        mov lpString11[142],000AH
        mov lpString11[143],000DH
        
        invoke FpuAtoFL, ADDR lpString9, ADDR zdynum1, DEST_MEM

        
        
        invoke GetDlgItemText,hWnd,IDC_EDT10,ADDR lpString10,SIZEOF lpString10
        mov eax,lpString10
        mov lpString11[144],eax
        mov eax,lpString10[4]
        mov lpString11[148],eax
        mov eax,lpString10[8]
        mov lpString11[152],eax
        mov eax,lpString10[12]
        mov lpString11[156],eax
        mov lpString11[157],0000H
        mov lpString11[158],000AH
        mov lpString11[159],000DH
        
        invoke FpuAtoFL, ADDR lpString10, ADDR hq2num1, DEST_MEM

        mov  eax,offset zhString--------------------------------把字符串“桩号”写入eax
        mov lpString11[160],eax--------------------------------把eax写入lpString11
        mov eax,offset zhString[4]
        mov lpString11[164],eax
        mov eax,offset zhString[8]
        mov lpString11[168],eax
        mov eax,offset zhString[12]
        mov lpString11[172],eax
        mov lpString11[173],0000H
        mov lpString11[174],000AH
        mov lpString11[175],000DH

        
         
               

                              
        invoke EndDialog, hWnd,NULL
        

        PrintDec eax
        PrintDec ebx
        PrintDec ecx
        PrintDec edx
        PrintDec esi
        PrintDec edi
        PrintDec esp
        PrintDec ebp
        PrintDec es
        PrintDec cs
        PrintDec ss
        PrintDec ds
        PrintDec fs
        PrintDec gs
        PrintDec zhnum1
        PrintDec yqnum1

               
        
    mov eax, TRUE

    ret

PmsjProc endp

end start
2015-3-6 13:42
0
雪    币: 0
活跃值: (122)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
会不会是要用 TextOutW ,因为UNICODE
2015-3-6 22:18
0
雪    币: 44
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
dd和db定义的'桩号'在内存中顺序相反的,楼主1楼的做法是可以的,把两个dd字符串内容成功合并了,Textout的也是合并后的内容,但Textout是按db顺序的,此时看到的乱码就是反着的‘桩号’+‘起点’,后来改为 mov  eax,offset zhString  ,mov lpString11[160],eax...后lpString11[160]就是地址了,这时看到的乱码就是输出的地址了,对于乱码这种问题,楼主可以调试跟踪一下,很容易解决的。最后个人表示很奇怪楼主为什么用eax四个字节四个字节的处理字符串,至于其他代码。。有点醉了
2015-3-10 23:59
0
雪    币: 166
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
应该如何写入?
2015-3-11 09:04
0
雪    币: 44
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
zhString db '桩号',0     ;通篇4字节处理后面的,0都能省掉了
...
mov eax,dword ptr zhString
...
invoke TextOut,hdc,0,24,ADDR lpString2,SIZEOF lpString2
说你有特殊需求要4字节对齐,在8楼zhString db ‘桩号:’,0又不是,说没有特殊需求又通篇4字节处理...照8楼,乱码还是必须的。反正我照你的代码TextOut后中间的那些0也是花花,弱弱问下:如果单纯的字符串连接输出,lstrcat不成?  mov lpString11[173],0000H...这...你想做什么还是自己调试跟踪下吧,从向lpString11[0]写入开始下断看看都合成了什么不就解决了
2015-3-11 22:43
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
是不是没脱壳啊
2015-3-11 23:00
0
雪    币: 166
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
mov lpString11[173],0000H已去掉。
2015-3-12 07:45
0
雪    币: 8
活跃值: (120)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
会不会其实是加密的数据
2015-3-12 08:24
0
游客
登录 | 注册 方可回帖
返回
//