-
-
[旧帖] [求助]求解个算法 0.00雪花
-
发表于: 2008-12-20 16:17 2524
-
20001923 > $ 55 push ebp
20001924 . 8BEC mov ebp, esp
20001926 . 6A FF push -1
20001928 . 68 00C20020 push 2000C200
2000192D . 68 B84B0020 push 20004BB8 ; SE 处理程序安装
20001932 . 64:A1 0000000>mov eax, dword ptr fs:[0]
20001938 . 50 push eax
20001939 . 64:8925 00000>mov dword ptr fs:[0], esp
20001940 . 83C4 DC add esp, -24
20001943 . 53 push ebx
20001944 . 56 push esi
20001945 . 57 push edi
20001946 . 8965 E8 mov dword ptr [ebp-18], esp
20001949 . 8B45 08 mov eax, dword ptr [ebp+8] ; 堆栈 ss:[0012FF74]=20001000 (RegLib.20001000)
2000194C . 8945 D0 mov dword ptr [ebp-30], eax ; eax=20001000 (RegLib.20001000)
2000194F . 8B4D 0C mov ecx, dword ptr [ebp+C] ; 堆栈 ss:[0012FF78]=20001908 (RegLib.20001908)
20001952 . 2B4D D0 sub ecx, dword ptr [ebp-30] ; 0x908
20001955 . 894D CC mov dword ptr [ebp-34], ecx
20001958 . 8B55 D0 mov edx, dword ptr [ebp-30]
2000195B . 8955 E4 mov dword ptr [ebp-1C], edx
2000195E . C745 D4 00000>mov dword ptr [ebp-2C], 0
20001965 . 8D45 D4 lea eax, dword ptr [ebp-2C]
20001968 . 50 push eax ; /pOldProtect
20001969 . 6A 40 push 40 ; |NewProtect = PAGE_EXECUTE_READWRITE
2000196B . 8B4D 0C mov ecx, dword ptr [ebp+C] ; |
2000196E . 2B4D 08 sub ecx, dword ptr [ebp+8] ; |
20001971 . 51 push ecx ; |Size
20001972 . 8B55 E4 mov edx, dword ptr [ebp-1C] ; |
20001975 . 52 push edx ; |Address
20001976 . FF15 58C00020 call dword ptr [<&KERNEL32.Virt>; \VirtualProtect
往栈中保存一些数据,20001000,20001908,得到两个地址的差值也保存到栈中。
2000197C . C745 FC 00000>mov dword ptr [ebp-4], 0
20001983 . C745 DC 00000>mov dword ptr [ebp-24], 0
2000198A . EB 09 jmp short 20001995
2000198C > 8B45 DC mov eax, dword ptr [ebp-24] ;
2000198F . 83C0 01 add eax, 1
20001992 . 8945 DC mov dword ptr [ebp-24], eax
20001995 > 8B4D DC mov ecx, dword ptr [ebp-24] ; 累加数,到ecx
20001998 . 3B4D CC cmp ecx, dword ptr [ebp-34]
2000199B . 7D 65 jge short 20001A02
2000199D . 8B55 E4 mov edx, dword ptr [ebp-1C]
200019A0 . 0355 DC add edx, dword ptr [ebp-24] ; 累加后的数与20001000基址相加
200019A3 . 33C0 xor eax, eax
200019A5 . 8A02 mov al, byte ptr [edx] ; ////*\从相加后的地址中取数
200019A7 . C1F8 04 sar eax, 4 ; 右移4位
200019AA . 83E0 0F and eax, 0F ; 取低四位
200019AD . 33C9 xor ecx, ecx
200019AF . 8A88 70E40020 mov cl, byte ptr [eax+2000E470>; 再把运算的结果与2000e470相加得到地址取出地址中的数
200019B5 . 8B55 E4 mov edx, dword ptr [ebp-1C] ; 20001000基址
200019B8 . 0355 DC add edx, dword ptr [ebp-24]
200019BB . 33C0 xor eax, eax
200019BD . 8A02 mov al, byte ptr [edx] ; 再次取出刚才的数到al
200019BF . 83E0 0F and eax, 0F ; 取低四位
200019C2 . 33D2 xor edx, edx
200019C4 . 8A90 70E40020 mov dl, byte ptr [eax+2000E470>; ////*\再从表中取出一个数。
200019CA . C1E2 04 shl edx, 4 ; 左移四位
200019CD . 0BCA or ecx, edx ; 两值相或
200019CF . 8B45 E4 mov eax, dword ptr [ebp-1C]
200019D2 . 0345 DC add eax, dword ptr [ebp-24]
200019D5 . 8808 mov byte ptr [eax], cl ; cl?把cl放入这个前一张表
200019D7 . 8B4D E4 mov ecx, dword ptr [ebp-1C]
200019DA . 034D DC add ecx, dword ptr [ebp-24]
200019DD . 33D2 xor edx, edx
200019DF . 8A11 mov dl, byte ptr [ecx] ; 再取出这个值到dl
200019E1 . 8B45 DC mov eax, dword ptr [ebp-24] ; 累加数
200019E4 . 25 7F000080 and eax, 8000007F ; 与8000007F相与
200019E9 . 79 05 jns short 200019F0
200019EB . 48 dec eax
200019EC . 83C8 80 or eax, FFFFFF80
200019EF . 40 inc eax
200019F0 > 33D0 xor edx, eax ; 累加数与前边最后的结果异或
200019F2 . 8855 D8 mov byte ptr [ebp-28], dl ; 把这个数放入栈中
200019F5 . 8B4D E4 mov ecx, dword ptr [ebp-1C]
200019F8 . 034D DC add ecx, dword ptr [ebp-24]
200019FB . 8A55 D8 mov dl, byte ptr [ebp-28] ; 再取出这个数
200019FE . 8811 mov byte ptr [ecx], dl
20001A00 .^ EB 8A jmp short 2000198C ; 循环
通过20001000与累加数的和取出数,右移取低四位。
再把所得的结果与2000E470相加得到一个地址,取出其中的数。
通过20001000与累加数的和取出数,直接取低四位。
把所得的结果与2000E470相加得到一个地址,再取出其中的数,
把所得数左移4位,
与前一个取出的数或运算,
结果保存在ecx。
把结果保存到20001000与累加数的和所得的地址中。
累加数与8000007F与运算,
累加数与最后结果的数异或。
结果放入栈中,
再把数放回到原来的位置。
20001A02 > C745 FC FFFFF>mov dword ptr [ebp-4], -1
20001A09 . EB 10 jmp short 20001A1B
20001A0B . B8 01000000 mov eax, 1
20001A10 . C3 retn
20001A11 . 8B65 E8 mov esp, dword ptr [ebp-18]
20001A14 . C745 FC FFFFF>mov dword ptr [ebp-4], -1
20001A1B > 8D45 D4 lea eax, dword ptr [ebp-2C]
20001A1E . 50 push eax ; /pOldProtect = 0012FF48
20001A1F . 8B4D D4 mov ecx, dword ptr [ebp-2C] ; |
20001A22 . 51 push ecx ; |NewProtect
20001A23 . 8B55 0C mov edx, dword ptr [ebp+C] ; |
20001A26 . 2B55 08 sub edx, dword ptr [ebp+8] ; |
20001A29 . 52 push edx ; |Size
20001A2A . 8B45 E4 mov eax, dword ptr [ebp-1C] ; |
20001A2D . 50 push eax ; |Address
20001A2E . FF15 58C00020 call dword ptr [<&KERNEL32.Virt>; \VirtualProtect
20001A34 . 8B4D F0 mov ecx, dword ptr [ebp-10]
20001A37 . 64:890D 00000>mov dword ptr fs:[0], ecx
20001A3E . 5F pop edi
20001A3F . 5E pop esi
20001A40 . 5B pop ebx
20001A41 . 8BE5 mov esp, ebp
20001A43 . 5D pop ebp
20001A44 . C3 retn
从第一张表中取出顺序取数,简单的移位运算后,
从第二张表中是由上边的结果决定的,取出数再做运算,
最后把最终的结果放回原位,
不知道这是哪种算法的形式???
在得到一些结果后会调用VirtualProtect这个函数,不知道这个是什么用意。
哪位大侠给讲讲。
20001924 . 8BEC mov ebp, esp
20001926 . 6A FF push -1
20001928 . 68 00C20020 push 2000C200
2000192D . 68 B84B0020 push 20004BB8 ; SE 处理程序安装
20001932 . 64:A1 0000000>mov eax, dword ptr fs:[0]
20001938 . 50 push eax
20001939 . 64:8925 00000>mov dword ptr fs:[0], esp
20001940 . 83C4 DC add esp, -24
20001943 . 53 push ebx
20001944 . 56 push esi
20001945 . 57 push edi
20001946 . 8965 E8 mov dword ptr [ebp-18], esp
20001949 . 8B45 08 mov eax, dword ptr [ebp+8] ; 堆栈 ss:[0012FF74]=20001000 (RegLib.20001000)
2000194C . 8945 D0 mov dword ptr [ebp-30], eax ; eax=20001000 (RegLib.20001000)
2000194F . 8B4D 0C mov ecx, dword ptr [ebp+C] ; 堆栈 ss:[0012FF78]=20001908 (RegLib.20001908)
20001952 . 2B4D D0 sub ecx, dword ptr [ebp-30] ; 0x908
20001955 . 894D CC mov dword ptr [ebp-34], ecx
20001958 . 8B55 D0 mov edx, dword ptr [ebp-30]
2000195B . 8955 E4 mov dword ptr [ebp-1C], edx
2000195E . C745 D4 00000>mov dword ptr [ebp-2C], 0
20001965 . 8D45 D4 lea eax, dword ptr [ebp-2C]
20001968 . 50 push eax ; /pOldProtect
20001969 . 6A 40 push 40 ; |NewProtect = PAGE_EXECUTE_READWRITE
2000196B . 8B4D 0C mov ecx, dword ptr [ebp+C] ; |
2000196E . 2B4D 08 sub ecx, dword ptr [ebp+8] ; |
20001971 . 51 push ecx ; |Size
20001972 . 8B55 E4 mov edx, dword ptr [ebp-1C] ; |
20001975 . 52 push edx ; |Address
20001976 . FF15 58C00020 call dword ptr [<&KERNEL32.Virt>; \VirtualProtect
往栈中保存一些数据,20001000,20001908,得到两个地址的差值也保存到栈中。
2000197C . C745 FC 00000>mov dword ptr [ebp-4], 0
20001983 . C745 DC 00000>mov dword ptr [ebp-24], 0
2000198A . EB 09 jmp short 20001995
2000198C > 8B45 DC mov eax, dword ptr [ebp-24] ;
2000198F . 83C0 01 add eax, 1
20001992 . 8945 DC mov dword ptr [ebp-24], eax
20001995 > 8B4D DC mov ecx, dword ptr [ebp-24] ; 累加数,到ecx
20001998 . 3B4D CC cmp ecx, dword ptr [ebp-34]
2000199B . 7D 65 jge short 20001A02
2000199D . 8B55 E4 mov edx, dword ptr [ebp-1C]
200019A0 . 0355 DC add edx, dword ptr [ebp-24] ; 累加后的数与20001000基址相加
200019A3 . 33C0 xor eax, eax
200019A5 . 8A02 mov al, byte ptr [edx] ; ////*\从相加后的地址中取数
200019A7 . C1F8 04 sar eax, 4 ; 右移4位
200019AA . 83E0 0F and eax, 0F ; 取低四位
200019AD . 33C9 xor ecx, ecx
200019AF . 8A88 70E40020 mov cl, byte ptr [eax+2000E470>; 再把运算的结果与2000e470相加得到地址取出地址中的数
200019B5 . 8B55 E4 mov edx, dword ptr [ebp-1C] ; 20001000基址
200019B8 . 0355 DC add edx, dword ptr [ebp-24]
200019BB . 33C0 xor eax, eax
200019BD . 8A02 mov al, byte ptr [edx] ; 再次取出刚才的数到al
200019BF . 83E0 0F and eax, 0F ; 取低四位
200019C2 . 33D2 xor edx, edx
200019C4 . 8A90 70E40020 mov dl, byte ptr [eax+2000E470>; ////*\再从表中取出一个数。
200019CA . C1E2 04 shl edx, 4 ; 左移四位
200019CD . 0BCA or ecx, edx ; 两值相或
200019CF . 8B45 E4 mov eax, dword ptr [ebp-1C]
200019D2 . 0345 DC add eax, dword ptr [ebp-24]
200019D5 . 8808 mov byte ptr [eax], cl ; cl?把cl放入这个前一张表
200019D7 . 8B4D E4 mov ecx, dword ptr [ebp-1C]
200019DA . 034D DC add ecx, dword ptr [ebp-24]
200019DD . 33D2 xor edx, edx
200019DF . 8A11 mov dl, byte ptr [ecx] ; 再取出这个值到dl
200019E1 . 8B45 DC mov eax, dword ptr [ebp-24] ; 累加数
200019E4 . 25 7F000080 and eax, 8000007F ; 与8000007F相与
200019E9 . 79 05 jns short 200019F0
200019EB . 48 dec eax
200019EC . 83C8 80 or eax, FFFFFF80
200019EF . 40 inc eax
200019F0 > 33D0 xor edx, eax ; 累加数与前边最后的结果异或
200019F2 . 8855 D8 mov byte ptr [ebp-28], dl ; 把这个数放入栈中
200019F5 . 8B4D E4 mov ecx, dword ptr [ebp-1C]
200019F8 . 034D DC add ecx, dword ptr [ebp-24]
200019FB . 8A55 D8 mov dl, byte ptr [ebp-28] ; 再取出这个数
200019FE . 8811 mov byte ptr [ecx], dl
20001A00 .^ EB 8A jmp short 2000198C ; 循环
通过20001000与累加数的和取出数,右移取低四位。
再把所得的结果与2000E470相加得到一个地址,取出其中的数。
通过20001000与累加数的和取出数,直接取低四位。
把所得的结果与2000E470相加得到一个地址,再取出其中的数,
把所得数左移4位,
与前一个取出的数或运算,
结果保存在ecx。
把结果保存到20001000与累加数的和所得的地址中。
累加数与8000007F与运算,
累加数与最后结果的数异或。
结果放入栈中,
再把数放回到原来的位置。
20001A02 > C745 FC FFFFF>mov dword ptr [ebp-4], -1
20001A09 . EB 10 jmp short 20001A1B
20001A0B . B8 01000000 mov eax, 1
20001A10 . C3 retn
20001A11 . 8B65 E8 mov esp, dword ptr [ebp-18]
20001A14 . C745 FC FFFFF>mov dword ptr [ebp-4], -1
20001A1B > 8D45 D4 lea eax, dword ptr [ebp-2C]
20001A1E . 50 push eax ; /pOldProtect = 0012FF48
20001A1F . 8B4D D4 mov ecx, dword ptr [ebp-2C] ; |
20001A22 . 51 push ecx ; |NewProtect
20001A23 . 8B55 0C mov edx, dword ptr [ebp+C] ; |
20001A26 . 2B55 08 sub edx, dword ptr [ebp+8] ; |
20001A29 . 52 push edx ; |Size
20001A2A . 8B45 E4 mov eax, dword ptr [ebp-1C] ; |
20001A2D . 50 push eax ; |Address
20001A2E . FF15 58C00020 call dword ptr [<&KERNEL32.Virt>; \VirtualProtect
20001A34 . 8B4D F0 mov ecx, dword ptr [ebp-10]
20001A37 . 64:890D 00000>mov dword ptr fs:[0], ecx
20001A3E . 5F pop edi
20001A3F . 5E pop esi
20001A40 . 5B pop ebx
20001A41 . 8BE5 mov esp, ebp
20001A43 . 5D pop ebp
20001A44 . C3 retn
从第一张表中取出顺序取数,简单的移位运算后,
从第二张表中是由上边的结果决定的,取出数再做运算,
最后把最终的结果放回原位,
不知道这是哪种算法的形式???
在得到一些结果后会调用VirtualProtect这个函数,不知道这个是什么用意。
哪位大侠给讲讲。
赞赏
他的文章
- [求助]求指点!!!! 2426
- [求助]window7 的c语言编译器 9122
- [求助]求大神给修改下下 4076
看原图
赞赏
雪币:
留言: