一个汇编问题(100分)

  • 主题发起人 主题发起人 fd151711
  • 开始时间 开始时间
F

fd151711

Unregistered / Unconfirmed
GUEST, unregistred user!
0049FF40 >/> /55 push ebp
0049FF41 |. 8BEC mov ebp, esp
0049FF43 |. B8 44100000 mov eax, 1044
0049FF48 |. E8 63290C00 call _chkstk
0049FF4D |. 53 push ebx
0049FF4E |. 56 push esi
0049FF4F |. 57 push edi
0049FF50 |. 8B45 08 mov eax, [ebp+8]
0049FF53 |. 8945 FC mov [ebp-4], eax
0049FF56 |. 8B4D FC mov ecx, [ebp-4]
0049FF59 |. 8A55 0C mov dl, [ebp+C]
0049FF5C |. 8851 03 mov [ecx+3], dl
0049FF5F |. C685 FCEFFFFF>mov byte ptr [ebp-1004], 0
0049FF66 |. B9 FF030000 mov ecx, 3FF
0049FF6B |. 33C0 xor eax, eax
0049FF6D |. 8DBD FDEFFFFF lea edi, [ebp-1003]
0049FF73 |. F3:AB rep stos dword ptr es:[edi]
0049FF75 |. 66:AB stos word ptr es:[edi]
0049FF77 |. AA stos byte ptr es:[edi]
0049FF78 |. 68 00010000 push 100 ; /n = 100 (256.)
0049FF7D |. 6A 00 push 0 ; |c = 00
0049FF7F |. 8B45 FC mov eax, [ebp-4] ; |
0049FF82 |. 83C0 0D add eax, 0D ; |
0049FF85 |. 50 push eax ; |s
0049FF86 |. E8 E5220C00 call memset ; /memset
0049FF8B |. 83C4 0C add esp, 0C
0049FF8E |. 68 00100000 push 1000
0049FF93 |. 8D8D FCEFFFFF lea ecx, [ebp-1004]
0049FF99 |. 51 push ecx
0049FF9A |. 8B55 10 mov edx, [ebp+10]
0049FF9D |. 52 push edx ; /s
0049FF9E |. E8 BD2A0C00 call strlen ; /strlen
0049FFA3 |. 83C4 04 add esp, 4
0049FFA6 |. 50 push eax ; |StringSize
0049FFA7 |. 8B45 10 mov eax, [ebp+10] ; |
0049FFAA |. 50 push eax ; |StringToMap
0049FFAB |. 6A 00 push 0 ; |Options = 0
0049FFAD 68 EA040000 push 4EA
0049FFB2 |. FF15 0C7FD906 call [<&KERNEL32.MultiByteToWideChar>>; /MultiByteToWideChar
0049FFB8 |. 68 00010000 push 100 ; /n = 100 (256.)
0049FFBD |. 8D8D FCEFFFFF lea ecx, [ebp-1004] ; |
0049FFC3 |. 51 push ecx ; |src
0049FFC4 |. 8B55 FC mov edx, [ebp-4] ; |
0049FFC7 |. 83C2 0D add edx, 0D ; |
0049FFCA |. 52 push edx ; |dest
0049FFCB |. E8 601F0C00 call memcpy ; /memcpy
0049FFD0 |. 83C4 0C add esp, 0C
0049FFD3 |. 8B45 FC mov eax, [ebp-4]
0049FFD6 |. C680 0B010000>mov byte ptr [eax+10B], 0
0049FFDD |. 8B4D FC mov ecx, [ebp-4]
0049FFE0 |. C681 0C010000>mov byte ptr [ecx+10C], 0
0049FFE7 |. 8B55 FC mov edx, [ebp-4]
0049FFEA |. 83C2 0D add edx, 0D
0049FFED |. 52 push edx ; /s
0049FFEE |. E8 E82A0C00 call wcslen ; /wcslen
0049FFF3 |. 83C4 04 add esp, 4
0049FFF6 |. 8D4400 12 lea eax, [eax+eax+12]
0049FFFA |. 50 push eax
0049FFFB |. 6A 0D push 0D
0049FFFD |. 8B4D FC mov ecx, [ebp-4]
004A0000 |. 51 push ecx
004A0001 |. E8 7A26F6FF call 00402680
004A0006 |. 83C4 0C add esp, 0C
004A0009 |. 5F pop edi
004A000A |. 5E pop esi
004A000B |. 5B pop ebx
004A000C |. 8BE5 mov esp, ebp
004A000E |. 5D pop ebp
004A000F /. C3 retn

请问我想去掉其中的转换MultiByteToWideChar,应该怎么处理呢?
 
你用的是OLLDGB?
0049FFA6 |. 50 push eax ; |StringSize
0049FFA7 |. 8B45 10 mov eax, [ebp+10] ; |
0049FFAA |. 50 push eax ; |StringToMap
0049FFAB |. 6A 00 push 0 ; |Options = 0
0049FFAD 68 EA040000 push 4EA
0049FFB2 |. FF15 0C7FD906 call [<&KERNEL32.MultiByteToWideChar>>; /MultiByteToWideChar

双击这些行, 之后弹出一个对话框,之后输用nop,把“使用NOP填充”打构,之后点“汇编”按钮,之后保存退出即可。
 
Writer说的没错
只要把要去掉的语句改成Nop就OK了
但是注意把传入该调用的参数也禁用掉
 
是od .但是去掉之后0049FFFD |. 8B4D FC mov ecx, [ebp-4]
ecx取到的不是正确的值
 
现在认真看了下,的确是有点问题,主要是没这个程序,光看靓态汇编有点累。

我现在在分析, 等下回贴。
 

0049FF8E |. 68 00100000 push 1000
0049FF93 |. 8D8D FCEFFFFF lea ecx, [ebp-1004]
0049FF99 |. 51 push ecx
0049FF9A |. 8B55 10 mov edx, [ebp+10]
0049FF9D |. 52 push edx ; /s
0049FF9E |. E8 BD2A0C00 call strlen ; /strlen
0049FFA3 |. 83C4 04 add esp, 4
0049FFA6 |. 50 push eax ; |StringSize
0049FFA7 |. 8B45 10 mov eax, [ebp+10] ; |
0049FFAA |. 50 push eax ; |StringToMap
0049FFAB |. 6A 00 push 0 ; |Options = 0
0049FFAD 68 EA040000 push 4EA

都NOP掉

之后将
0049FFBD |. 8D8D FCEFFFFF lea ecx, [ebp-1004] ; |
改成
mov ecx, [ebp+10]
 
接收答案了。刚明白过来。 呵呵。[:D]
 
多人接受答案了。
 
可以说说你的分析么?
 
004A0050 >/> /55 push ebp
004A0051 |. 8BEC mov ebp, esp
004A0053 |. B8 48100000 mov eax, 1048
004A0058 |. E8 53280C00 call _chkstk
004A005D |. 53 push ebx
004A005E |. 56 push esi
004A005F |. 57 push edi
004A0060 |. 8B45 08 mov eax, [ebp+8]
004A0063 |. 8945 FC mov [ebp-4], eax
004A0066 |. 8B4D FC mov ecx, [ebp-4]
004A0069 |. 8A55 0C mov dl, [ebp+C]
004A006C |. 8851 03 mov [ecx+3], dl
004A006F |. C685 FCEFFFFF>mov byte ptr [ebp-1004], 0
004A0076 |. B9 FF030000 mov ecx, 3FF
004A007B |. 33C0 xor eax, eax
004A007D |. 8DBD FDEFFFFF lea edi, [ebp-1003]
004A0083 |. F3:AB rep stos dword ptr es:[edi]
004A0085 |. 66:AB stos word ptr es:[edi]
004A0087 |. AA stos byte ptr es:[edi]
004A0088 |. 68 00010000 push 100 ; /n = 100 (256.)
004A008D |. 6A 00 push 0 ; |c = 00
004A008F |. 8B45 FC mov eax, [ebp-4] ; |
004A0092 |. 83C0 0D add eax, 0D ; |
004A0095 |. 50 push eax ; |s
004A0096 |. E8 D5210C00 call memset ; /memset
004A009B |. 83C4 0C add esp, 0C
004A009E |. 8D4D 14 lea ecx, [ebp+14]
004A00A1 |. 898D F8EFFFFF mov [ebp-1008], ecx
004A00A7 |. 8B95 F8EFFFFF mov edx, [ebp-1008]
004A00AD |. 52 push edx ; /arglist
004A00AE |. 8B45 10 mov eax, [ebp+10] ; |
004A00B1 |. 50 push eax ; |format
004A00B2 |. 8D8D FCEFFFFF lea ecx, [ebp-1004] ; |
004A00B8 |. 51 push ecx ; |buffer
004A00B9 |. E8 3A2A0C00 call vsprintf ; /vsprintf
004A00BE |. 83C4 0C add esp, 0C
004A00C1 |. C785 F8EFFFFF>mov dword ptr [ebp-1008], 0
004A00CB |. 68 00010000 push 100
004A00D0 |. 8B55 FC mov edx, [ebp-4]
004A00D3 |. 83C2 0D add edx, 0D
004A00D6 |. 52 push edx
004A00D7 |. 8D85 FCEFFFFF lea eax, [ebp-1004]
004A00DD |. 50 push eax ; /s
004A00DE |. E8 7D290C00 call strlen ; /strlen
004A00E3 |. 83C4 04 add esp, 4
004A00E6 |. 50 push eax ; |StringSize
004A00E7 |. 8D8D FCEFFFFF lea ecx, [ebp-1004] ; |
004A00ED |. 51 push ecx ; |StringToMap
004A00EE |. 6A 00 push 0 ; |Options = 0
004A00F0 |. 68 EA040000 push 4EA ; |CodePage = 4EA
004A00F5 |. FF15 0C7FD906 call [<&KERNEL32.MultiByteToWideChar>>; /MultiByteToWideChar
004A00FB |. 8B55 FC mov edx, [ebp-4]
004A00FE |. C682 0B010000>mov byte ptr [edx+10B], 0
004A0105 |. 8B45 FC mov eax, [ebp-4]
004A0108 |. C680 0C010000>mov byte ptr [eax+10C], 0
004A010F |. 8B4D FC mov ecx, [ebp-4]
004A0112 |. 83C1 0D add ecx, 0D
004A0115 |. 51 push ecx ; /s
004A0116 |. E8 C0290C00 call wcslen ; /wcslen
004A011B |. 83C4 04 add esp, 4
004A011E |. 8D5400 12 lea edx, [eax+eax+12]
004A0122 |. 52 push edx
004A0123 |. 6A 0D push 0D
004A0125 |. 8B45 FC mov eax, [ebp-4]
004A0128 |. 50 push eax
004A0129 |. E8 5225F6FF call 00402680
004A012E |. 83C4 0C add esp, 0C
004A0131 |. 5F pop edi
004A0132 |. 5E pop esi ; gameserv.00403C15
004A0133 |. 5B pop ebx
004A0134 |. 8BE5 mov esp, ebp
004A0136 |. 5D pop ebp
004A0137 /. C3 retn
 
004A00F5 |. FF15 0C7FD906 call [<&KERNEL32.MultiByteToWideChar>>; /MultiByteToWideChar
一样是去掉这个。请分析下好么?
 
Writer 你来了么?
 
004A00CB |. 68 00010000 push 100
004A00D0 |. 8B55 FC mov edx, [ebp-4]
004A00D3 |. 83C2 0D add edx, 0D
004A00D6 |. 52 push edx
004A00D7 |. 8D85 FCEFFFFF lea eax, [ebp-1004]
004A00DD |. 50 push eax ; /s
004A00DE |. E8 7D290C00 call strlen ; /strlen
004A00E3 |. 83C4 04 add esp, 4
004A00E6 |. 50 push eax ; |StringSize
004A00E7 |. 8D8D FCEFFFFF lea ecx, [ebp-1004] ; |
004A00ED |. 51 push ecx ; |StringToMap
004A00EE |. 6A 00 push 0 ; |Options = 0
004A00F0 |. 68 EA040000 push 4EA ; |CodePage = 4EA
004A00F5 |. FF15 0C7FD906 call [<&KERNEL32.MultiByteToWideChar>>; /MultiByteToWideChar


把上面这些都NOP掉。
之后改成下面的
pusha
lea eax, [ebp-1004] ;
push eax ; /s
call strlen ; /strlen strlen(buf1)
cmp eax, 100
jle short ???? ; ???改写成下面的push eax 地址
mov eax, 100
push eax ; 跳到这里
lea eax, [ebp-1004] ;
push eax ; buf1
mov edx, [ebp-4] ; onestruct*
add edx, 0D ; onesturct->onefield
push edx
call memcpy ; memcpy(onestruct->onefield, buf1, strlen(buf1));
popa

之后再把
004A0116 |. E8 C0290C00 call wcslen ; /wcslen
改成
call strlen

不保证OK,静态汇编改东西就是有点麻烦……
 
我看看。
 
可以说说为什么这样改么?
 
没什么特别, NOP掉一个函数。之后根据函数对代码的影响,作相应的修改。

比如
004A00CB |. 68 00010000 push 100
004A00D0 |. 8B55 FC mov edx, [ebp-4]
004A00D3 |. 83C2 0D add edx, 0D
004A00D6 |. 52 push edx
004A00D7 |. 8D85 FCEFFFFF lea eax, [ebp-1004]
004A00DD |. 50 push eax ; /s
004A00DE |. E8 7D290C00 call strlen ; /strlen
004A00E3 |. 83C4 04 add esp, 4
004A00E6 |. 50 push eax ; |StringSize
004A00E7 |. 8D8D FCEFFFFF lea ecx, [ebp-1004] ; |
004A00ED |. 51 push ecx ; |StringToMap
004A00EE |. 6A 00 push 0 ; |Options = 0
004A00F0 |. 68 EA040000 push 4EA ; |CodePage = 4EA
004A00F5 |. FF15 0C7FD906 call [<&KERNEL32.MultiByteToWideChar>>; /MultiByteToWideChar

查看API资料得知,输了2个选项, 一个原字符串缓冲,原字符串长度, 一个目标字符串缓冲。
调用的结果是把转换的结果放进目标字符串缓冲里面。
而你想用掉MultiByteToWideChar函数, 就得自己手动增加这些功能了。
写改的代码就是实现在些功能的。
最好发现wcslen是依赖于MultiByteToWideChar的处理的,所以也把这里处理换成strlen
 

Similar threads

A
回复
0
查看
1K
Andreas Hausladen
A
I
回复
0
查看
715
import
I
I
回复
0
查看
825
import
I
I
回复
0
查看
865
import
I
I
回复
0
查看
761
import
I
后退
顶部