[原创]od2.01查找中文字符串修改分享
<4b6539>
jmp 72d000;设置搜索标志
<40ce4b>
jmp @label1 ;修正目录./为当前目录
<41d9ee>
;等字符绘制完后才取消标志
jmp @label2;取消搜索标志
<487d0c>
nop
nop
nop
nop
jmp @label3;处理istextunicode
<417dc6>
jmp @label4;处理[5fa8d4]的有效性
<487d6d>
jmp @label5;过滤一些非字符串
<00442D42>
jmp @label6;这里处理命令语句的汇编
<00442D10>
jmp @label7;能到达这里的是非语句汇编
<00487cfe>
nop
nop
jmp @label8
<0048748a>
jmp @label9;这里对[5fa8cf]清零
<0040ea2b>
jmp @label10;这里修改界面字体
nop
nop
nop
nop
nop
<487d61>
jmp @label11;如果这里检查出非字符就让eax=0
<487b5e>
jmp @label12;这里不处理utf
nop
<00410AF2>
jmp @label13
nop
<004a1961>
jmp @label14
nop
<00487630>
jmp @label15
nop
<4875ba>
jmp @label16
nop
<0041B1CC>
jmp @label17
<0041d514>
jmp @label18
<00487720>
nop
jmp @label19
<004A2432>
jmp @label20
<72d000>
mov edi,edi
push 0055698E
mov byte [005FA8D1],1;这里设置字符搜索标志
jmp 4b653e
nop
nop
@label1:;修正目录./为当前目录
cmp ecx, 0x120000
jle short @L013
push eax
mov al, byte ptr [ecx]
cmp al, 0x2E
pop eax
jnz short @L013
push eax
mov al, byte ptr [ecx+0x2]
cmp al, 0x5C
pop eax
je 0040CE76
@L013:
test esi, esi
jnz 0040CE66
mov ecx, dword ptr [ebx+0xC]
jmp 0040CE52
nop
nop
@label2:;等字符绘制完后才取消标志
pop edi
pop esi
pop ebx
mov esp, ebp
mov word [005FA8D0],0;这里取消字符搜索标志
jmp 41d9f3
nop
nop
@label3:;处理istextunicode
cmp byte [005FA8D1],1;有搜索标志才修改
jmp short @l1
test eax,eax
je 00487D6A
@l1:
cmp byte [5fa8cb],0
jne short @k1304
xor eax,eax
jmp 00487D6A
@k1304:
push 00545202
jmp 487d15
nop
nop
@label4:;处理[5fa8d4]的有效性
cmp ebx,5fa8d4
jne short @l4
;到这里ebx=5fa8d4
mov ecx,[ebx-4];就是读取[5fa8d0]的数值
cmp cx,0
je short @l4
cmp cx,101;搜索标志 [5fa8d0]=1 [5fa8d1]=1
jne short @l3
;mov byte [ebx-4],0;byte [5fa8d0]=0
;mov byte [ebx-5],0;byte [5fa8cf]=0
;mov byte [ebx-6],0;byte [5fa8ce]=0
mov dword [ebx-7],0
mov byte [ebx-2],0
@l4:
inc dword ptr [ebx]
@l3:
;mov byte [5fa8d0],0;byte [5fa8d0]=0
;mov byte [5fa8cf],0;byte [5fa8cf]=0
;mov dword [ebx-9],0
add esp, 0xC
jmp 417dcb
nop
nop
@label5:;过滤一些非字符串
pop esi
pop ebx
mov esp, ebp
pop ebp
test eax,eax
je @l7
push eax
mov eax,esp
add eax,0x10
push edx
mov edx,005FA8D0
; eax可能是字符串
cmp byte [edx+1],1 ; 字符查找标志
jne @l9
mov eax,[eax]
push ecx
mov ecx,eax
add ecx ,12
mov eax,[eax]
;mov edx,5fa8d0
cmp al,0x41;这里包保留以A开头的字符串
jne @l2
;这里还是会有一些asni的汉字出现
;其实可以处理一下,不过好像不影响使用,就算了。
mov eax, [ecx-4];这里测试ax是否为asni字符,是就转换成unicode
xor ecx,ecx
mov cl,ah
cmp ecx,fe
jg short @jj1001
cmp ecx,40
jl short @jj1001
;检查低位
mov cl,al
cmp ecx,fe
jg short @jj1001
cmp ecx,81
jl short @jj1001
;到这里就说明是asni
mov ecx,1;这里加入连续两个是符号的情况判断
@jj1001:
;这里去掉连续两个为符号的情况
mov cx,ax
cmp ecx,39
jg short @jj1002
cmp ecx,30
jl short @jj1002
;跳走
jmp short @lj1158
@jj1002:
cmp ecx,5a
jg short @jj1003
cmp ecx,41
jl short @jj1003
;跳走
jmp short @lj1158
@jj1003:
cmp ecx,7a
jg short @jj1004
cmp ecx,61
jl short @jj1004
;跳走
jmp short @lj1158
@jj1004:
shr eax,8
mov cx,ax
mov cx,ax
cmp ecx,39
jg short @jj1005
cmp ecx,30
jl short @jj1005
;跳走
jmp short @lj1158
@jj1005:
cmp ecx,5a
jg short @jj1006
cmp ecx,41
jl short @jj1006
;跳走
jmp short @lj1158
@jj1006:
cmp ecx,7a
jg short @jj1007
cmp ecx,61
jl short @jj1007
;跳走
jmp short @lj1158
@jj1007:
;能到这里就是两个符号的ascii
jmp short @l5
@lj1158:
mov byte [edx],1
jmp short @l5;跳出循环
@l2:
cmp al,0x55
jne short @l5;这里保留以U开头的字符串
cmp byte [5fa8cb],0
jne short @k1741
;这里分utf和正常的unicode
;cmp byte [edx+2],1
;je @l5
;mov byte [edx-1],0
;mov byte [edx-2],0
shr eax,10
cmp al,4e
jne short @k1741
mov eax, [ecx]
cmp al,7e
jg short @l5;小于20的去掉
cmp al,20
jl short @l5
cmp ah,0
jne short @l5
;上面检查第一位是否为ascii
;下面检查第二位是否为ascii
mov eax,[ecx+2]
cmp al,7e
jg short @l5;小于20的去掉
cmp al,20
jl short @l5
cmp ah,0
jne short @l5
@k1741:
mov byte [edx],1;这里的edx=5fa8d0
@l5:
pop ecx
cmp byte [5fa8cb],0
jne short @ls1126
cmp byte [edx+2],1;edx=5fa8d0
jne short @ls1126
mov byte [edx],0
@ls1126:
mov byte [edx+2],0
cmp byte [5fa8cb],0
je short @l9
;cmp byte [edx-1],1 ; 字符查找标志[005FA8cf]
;jne short @l10
;mov byte [edx],0
;@l10:
cmp byte [edx-2],1; 字符乱码标志[005fabce]
jne short @l102
mov byte [edx],0
@l102:
;cmp byte [edx+4],1; 去掉DD类字符
;jne short @l1028
;mov byte [edx],0
;@l1028:
@l9:
;mov word [edx-2],0;两个标志清0
pop edx
pop eax
@l7:
jmp 487d72
nop
nop
@label6:;这里处理命令语句的汇编
xor ecx, ecx
;[5fa8d0]=0
mov cl,byte [5fa8d1]
test ecx,ecx
je short @b1
mov cl, byte ptr [eax+edx+3];这里检测反汇编代码的第一个字节
test ecx,ecx;代码的第四个字节为0就认为非语句
mov byte [5fa8d2], 0
jne short @l8;这个判断并不正确所以去掉
;mov byte [5fa8d2], 1
@l8:
@b1:
mov cl, byte ptr [eax+edx]
jmp 442d47
nop
nop
@label7:;能到达这里的是非语句汇编
push ecx
xor ecx,ecx
mov cl,byte [5fa8d1]
test ecx,ecx
je short @b2
mov byte [5fa8d2], 1;能到达这里的是非语句汇编
@b2:
pop ecx
jmp 0044781D
nop
nop
@label8:;处理ascii字符串
cmp byte [005FA8D1],1
;jne @l1336
pushad
sub ebp,0x120
lea esi,[ebp];检测是否为Ascii汉字
;如果本身为unicode直接跳过
;怎么判断第一个字符为ascii16的汉字
;如果是ascii16的汉字就转成unicode
;mov word [ebp],0x7ee7
;mov word [ebp+2],0
xor ebx,ebx
;xor ecx,ecx
xor edx,edx
;xor edi,edi
mov edi,esi
mov ebp,5fa8cb ;ebp=5fa8cb,是否为ascii或unicode
xor eax,eax
mov dword [ebp],0
mov dword [ebp-4],0;保存字符数量 5fa8c7保存字符数量
;mov dword [5fa8c7],0;保存字符数量
@l1104:
;去掉00XXXX00的情况
;lods word ptr [esi]
;mov ch,ah
;lods word ptr [esi]
;mov cl,al
;sub esi,4
;cmp cx,0
;je short @l1103
lods word ptr [esi]
inc ebx ;字符数计数
;下面是检查unicode
;如果能连续检查出3个,我们就认为这是一个unicode汉字
cmp eax,0x4e00
jl short @asc1200
cmp eax ,0x9fbb
jg short @asc1200
inc edx; 记录unicode汉字数值
inc byte [ebp-4]
jmp @asco1159;跳出检查
@asc1200:
cmp eax,0xf900
jl short @asc1201
cmp eax ,0xfa6a
jg short @asc1201
inc edx; 记录unicode汉字数值
inc byte [ebp-4]
jmp @asco1159;跳出检查
@asc1201:
cmp eax,0xff00
jl short @asc1202
cmp eax ,0xff65
jg short @asc1202
inc edx; 记录unicode汉字数值
inc byte [ebp-4]
jmp @asco1159;跳出检查
@asc1202:
;上面三个比较得出汉字的unicode
cmp eax,0x20
jl short @asc1203
cmp eax ,0x7f
jg short @asc1203
inc edx; 记录unicode汉字数值
add byte [ebp-4],2
jmp @asco1159;跳出检查
@asc1203:
;比较一些符号
cmp eax,0x3001
jl short @asc12011
cmp eax ,0x301f
jg short @asc12011
inc edx; 记录unicode汉字数值
add byte [ebp-4],1
jmp short @asco1159;跳出检查
@asc12011:
cmp eax,0x2460
jl short @asc12012
cmp eax ,0x24fe
jg short @asc12012
inc edx; 记录unicode汉字数值
add byte [ebp-4],1
jmp short @asco1159;跳出检查
@asc12012:
cmp eax,0x2200
jl short @asc12013
cmp eax ,0x22f0
jg short @asc12013
inc edx; 记录unicode汉字数值
add byte [ebp-4],1
jmp short @asco1159;跳出检查
@asc12013:
cmp eax,0x2100
jl short @asc12014
cmp eax ,0x2130
jg short @asc12014
inc edx; 记录unicode汉字数值
add byte [ebp-4],1
jmp short @asco1159;跳出检查
@asc12014:
cmp eax,0x2160
jl short @asc12015
cmp eax ,0x2199
jg short @asc12015
inc edx; 记录unicode汉字数值
add byte [ebp-4],1
jmp short @asco1159;跳出检查
@asc12015:
;判断一些单字符
cmp eax,0xD
jne short @asc12016
inc edx; 记录unicode汉字数值
add byte [ebp-4],2
jmp short @asco1159;跳出检查
@asc12016:
cmp eax,0xA
jne short @asc12017
inc edx; 记录unicode汉字数值
add byte [ebp-4],2
jmp short @asco1159;跳出检查
@asc12017:
@asco1159:
;这里得出字母的unicode
test edx,edx
jne short @l1204 ;如果第一个都不是unicode,我们就不继续测试
jmp short @l1103
@l1204:
;ecx=0,则该字符不是unicode
;如果此时ebx=1,我们就不继续测试unicode
;ecx>0,我们暂且认为是unicode
;如果连续n个中出现dh>dl的情况我就认为这是unicode
cmp byte [5fa8d1],0
;je short @kk941
cmp edx,2
jne short @k15150
cmp byte [ebp-4],3
jne short @kk913
;这里去掉汉字+unicode字母的情况
mov byte [ebp+3],1;[ebp+3]为乱码标志
jmp @l1252;跳出循环
@kk913:
;cmp byte [ebp-4],4;这里检测出两个连续的unicode字母
;jne short @k15160
;jmp @l1252
;@k15160:
@k15150:
or ax, ax;当遇到两个字节为0时跳走
jne short @l1233
cmp edx,1
jle short @l1103
;xor ecx, ecx
;mov cl, byte ptr [ebp-0x4]
;sub ecx, edx
;shl ecx, 1
;cmp ecx, edx
;jne short @kk941
;mov byte [ebp+3],1
;jmp @l1252
;@kk941:
;能到这里说明是unicode
mov byte [ebp],1;[ebp]为unicode标志
mov dword [ebp-4],edx;保存字符数量
jmp short @l1103
@l1233:
cmp ebx,edx
je short @l1059
;如果ebx>dh,说明出现非汉字
mov byte [ebp+1],1;[ebp+1]为非unicode字符标志
jmp short @l1103;跳出循环
@l1059:
jmp @l1104
@l1103:
;根据[ebp]=1的条件判断是否为unicode
mov esi,edi;重新读入字符地址
cmp byte [ebp],1
je @l1252
mov byte [ebp+1],0;[ebp+1]为非unicode字符标志
;这里判断ascii
xor ebx,ebx
xor edx,edx
xor ecx,ecx
mov byte [ebp-4],0;[5fa8c7]=0 字符数
@l1259:
lods word ptr [esi]
inc ebx ;字符数计数
nop
;先判断低位字符是否为acsii
mov cl,al
cmp ebx,1
jne @l1202
;如果第一个字节为0就跳走
cmp al,0
je @l1252
@l1202:
cmp ecx,7f
jg short @asc1305
cmp ecx,20
jl short @asc1305
inc edx
cmp edx,2
jg short @k1514
inc byte [ebp-4]
@k1514:
dec esi ;esi向前移动1位
jmp @l1303
@asc1305:
;我们再判断是否为ascii16
mov cl,ah
cmp ecx,fe
jg short @asc1045
cmp ecx,40
jl short @asc1045
;检查低位
mov cl,al
cmp ecx,fe
jg short @asc1045
cmp ecx,81
jl short @asc1045
inc edx
cmp edx ,2
jg short @k1512
add byte [ebp-4],3
@k1512:
@asc1045:
@l1303:
;去掉一些汉字+ascii字母的情况
cmp dword [5fa8d1],0
je short @k1515
cmp edx,2
jne short @k1515
cmp byte [ebp-4],4
jne short @k1516
jmp short @l1252
@k1516:
@k1515:
or al, al;当遇到两个字节为0时跳走
jne short @l1301
cmp edx,1
jle short @l1252
;能到这里说明是ascii16
mov byte [ebp],2;[ebp]为ascii16标志
;cmp dword [5fa8d1],0
cmp edx,64
jg short @l1252
;jne short @l1252
;add edx,edx
;inc edx
mov dword [ebp-4],edx;保存字符数量
push edx;字符长度
mov ebx,edi
add ebx,440
push ebx;unicode字符的地址
push -1;可伸展字符
push edi;ascii字符的地址
push 0
;push 3a8
mov eax,[5be6a0];这里读取mbccodepage
push eax
call 4f56d6
;然后将unicode里的字符串复制到ascii地址里面
mov esi,ebx
xor ecx,ecx
mov edx,dword [ebp-4]
@L1335:
;复制转化好的unicode
lods word ptr [esi]
inc ecx
cmp ecx,edx
je short @l1338
stos word ptr es:[edi]
jmp @L1335
@l1338:
stos word ptr es:[edi]
xor eax,eax
stos word ptr es:[edi]
jmp short @l1252
@l1301:
cmp ebx,edx
je short @l1309
;如果ebx>dh,说明出现非汉字
mov byte [ebp+1],2;[ebp+1]为非unicode字符标志
jmp short @l1252;跳出循环
@l1309:
jmp @l1259
@l1252:
cmp edx,64;这里去掉一些很长的字符串,这里限制100字以内
jle short @kk1322
mov byte [ebp+3],1 ;ebp=5fa8cb
@kk1322:
cmp byte [ebp],0
je short @l1211
cmp byte [ebp+1],0
je short @l1343
@l1211:
mov byte [ebp+3],1;5fa8ce 乱码标志
@l1343:
cmp byte [5fa8d2],1;20141205加入的判断
jne short @mm1909
mov byte [ebp+3],1;5fa8ce 乱码标志
@mm1909:
popad
@l1336:
cmp dword [ebp-4],0;保存字符数量 [5fa8c7]
je short @l1531
mov esi,dword [ebp-4]
add esi,esi
@l1531:
push esi
lea ecx, dword ptr [ebp-0x120]
jmp 487d05
nop
nop
@label9:;初始化一些数值
push esi ;label9
push edi
mov ebx, dword ptr [ebp+0x8]
cmp byte [005FA8D1],1
jne @kd0932
mov byte [5fa8cf],0
mov word [5fa8cb],0
@kd0932:
;mov dword [5fa8cb],0
;mov byte [5fa8d0],0
jmp 48748f
nop
nop
@label10:;修改界面字体
mov dword ptr ds:[582678],0d
mov dword ptr ds:[58267C],0
jmp 40ea3f
nop
nop
@label11:;结合istextunicode
add esp,0C
add ebx,eax
cmp byte [5fa8cb],0
jne short @k0955
xor ebx,ebx
@k0955:
jmp 487d66
nop
nop
@label12:;处理utf
;由于od2.01并不能很好的处理utf,所以我们就不处理了
;cmp byte [005FA8D1],1
;je @li1309
;test byte ptr [ebp+0xC], 0x2
;je 00487B6A
;@li1309:
jmp 487b64
nop
nop
@label13:
mov esi, dword ptr [ebp+0x8] ; 字符串,这里还是没转unicode
mov edi, dword ptr [ebp+0x10] ; 要查找的字符,程序已经转成unicode
mov ecx, dword ptr [ebp+0xC] ; 这里是字符串大小,好像算法不是很正确
jmp 410afb
nop
nop
@label14:;处理后面的查找字符串
pushad
mov eax,[esp+20];unicode
mov ebx,[esp+24];长度
mov edx,[esp+28];ascii空间
push 0x0
push 0x0
push eax ;转换后字符长度
push edx ;转换后的字符
push ebx ;字符长度
push eax ;待转换的unicode
push 0x0
;push 0x0
mov eax,[5be6a0];这里读取mbccodepage
push eax
call 004F57C0
mov byte [ecx],0
mov dword ptr [ebp-0x4], eax ;保存字符长度
popad
add esp, 0x10 ; 在这里将字符转成ascii
jmp 4a1967
nop
nop
@label15:
cmp byte [5fa8d1],1
jne short @ls2045
jmp 004876a2
@ls2045:
cmp dword ptr ss:[ebp-8],0B
jnz 004876A2 ; 发现这里的判断也有问题,直接跳过
jmp 487636
nop
nop
@label16:
cmp byte [5fa8d1],1
jne short @ls20450
jmp 004876a2 ;需要强制跳转,不然后面显示会有问题
@ls20450:
cmp dword ptr ss:[ebp-8],9
jnz 00487630
jmp 4875c0
nop
nop
@label17:;修正CPU INFO栏的显示问题
;测试是否含有非数字或字母
;有就跳,有就不跳
;jmp @sks1350
mov eax,[esp+8]
cmp eax,00401000
jl @sks1350
;add eax,8
;mov eax,[eax]
;cmp ax,49
;je short @ff1325
; test byte ptr [ebp-0x2F], 0x2
; je 0041B1FB
; jmp short @ff1327
;@ff1325:
push esi
lea esi,[ebp-0x494]
xor eax,eax
@xsd1222:
lods word ptr [esi]
cmp eax ,20
jl short @ss1355
cmp eax ,7f
jg short @s1229
test eax,eax
je short @s1229
jmp short @xsd1222
@ss1355:
xor eax,eax
@s1229:
;到这里就是含有非ascii
test eax,eax
@s1245:
pop esi
jmp short @kdk1012
@sks1350:
test byte ptr [ebp-0x2F], 0x2
@kdk1012:
je 0041B1FB
@ff1327:
lea ecx, dword ptr [ebp-0x54]
jmp 41b1d1
nop
nop
@label18:;修正代码栏注释显示不全
;当满足两个条件时;修改输出长度
;1.字符长度不为0
;2.字符开始地址+字符长度*2的两字节内容为0
mov ecx,[esp+4]
test ecx,ecx
je short @lkl1438
add ecx,ecx;字符数*2
add ecx,edx;看看是否结束
mov edx,[ecx]
test dx,dx
jne short @lkl1438
mov ecx,eax
mov edx,[ecx]
add ecx,8
push ebx
mov ebx,[ecx]
push eax
mov eax,ebx
sub eax,edx
add ebx,eax
mov [ecx],ebx
pop eax
pop ebx
@lkl1438:
mov edx,1000
jmp 0041d519
nop
nop
@label19:;预先检查是否为unicode,如果前三个是,我们就认为是
xor edx,edx
xor ecx,ecx
xor eax,eax
lea esi,[ebp-0x120];将字符的地址传过来
@label1009:
lods word ptr [esi]
inc edx;检测字符数
;下面检查字符是否为unicode
cmp eax ,0x5b57;字
jne short @aac1200
inc ecx; 记录unicode数量
jmp @aaco1159
@aac1200:
cmp eax ,0x4e2d;中
jne short @aac12001
inc ecx; 记录unicode数量
jmp @aaco1159
@aac12001:
cmp eax ,0x7248;版
jne short @aac12002
inc ecx; 记录unicode数量
jmp @aaco1159
@aac12002:
cmp eax ,0x672c;本
jne short @aac12003
inc ecx; 记录unicode数量
jmp @aaco1159
@aac12003:
cmp eax ,0x529f;功
jne short @aac12004
inc ecx; 记录unicode数量
jmp @aaco1159
@aac12004:
cmp eax ,0x80fd;能
jne short @aac12005
inc ecx; 记录unicode数量
jmp @aaco1159
@aac12005:
@aaco1159:
cmp eax,0x100
jl short @jj1105
jmp @label1009
@jj1105:
cmp ecx,2;这里说明前面三个都是unicode
jl short @label1051
jmp 004878ac
;jmp 00487bef
@label1051:
mov al, byte ptr [ebp-0x120]
jmp 00487726
nop
@label20:;设置和删除所有call断点
cmp byte [5fa8c0],1;根据这个数值决定是否为设置或删除所有call
je 4a2437
cmp edx,dword ptr ds:[ebx+C]
jnz 004A247F
jmp 4a2437
nop
