首页
社区
课程
招聘
分析一个算法想内联汇编,可是老出错,希望大家能帮忙看看.谢谢[求助]
发表于: 2006-6-11 17:41 6248

分析一个算法想内联汇编,可是老出错,希望大家能帮忙看看.谢谢[求助]

2006-6-11 17:41
6248
004011C2    51                       push ecx                                            ; 解密前数据长度
004011C3    52                       push edx                                            ; 解密后数据长度
004011C4    53                       push ebx                                            ; 需要解密的数据指针
004011C5    57                       push edi                                            ; 解密后数据存放指针
004011C6    E8 35FEFFFF              call pakup.00401000                                 ; 解密call

//========================算法=========================================
00401000    83EC 24                  sub esp,24
00401003    53                       push ebx
00401004    55                       push ebp
00401005    56                       push esi
00401006    57                       push edi
00401007    8B7C24 40                mov edi,dword ptr ss:[esp+40]
0040100B    33F6                     xor esi,esi
0040100D    33D2                     xor edx,edx
0040100F    C74424 14 21FF0000       mov dword ptr ss:[esp+14],0FF21
00401017    85FF                     test edi,edi
00401019    C74424 18 4F830000       mov dword ptr ss:[esp+18],834F
00401021    C74424 1C 5F670000       mov dword ptr ss:[esp+1C],675F
00401029    C74424 20 34000000       mov dword ptr ss:[esp+20],34
00401031    C74424 24 37F20000       mov dword ptr ss:[esp+24],0F237
00401039    C74424 28 5F810000       mov dword ptr ss:[esp+28],815F
00401041    C74424 2C 65470000       mov dword ptr ss:[esp+2C],4765
00401049    C74424 30 33020000       mov dword ptr ss:[esp+30],233
00401051    0F86 94000000            jbe pakup.004010EB
00401057    8B6C24 3C                mov ebp,dword ptr ss:[esp+3C]
0040105B    8B5C24 38                mov ebx,dword ptr ss:[esp+38]
0040105F    8A042A                   mov al,byte ptr ds:[edx+ebp]
00401062    42                       inc edx
00401063    8AC8                     mov cl,al
00401065    C74424 38 00000000       mov dword ptr ss:[esp+38],0
0040106D    C1E9 03                  shr ecx,3
00401070    83E1 07                  and ecx,7
00401073    34 C8                    xor al,0C8
00401075    884424 3C                mov byte ptr ss:[esp+3C],al
00401079    8B4C8C 14                mov ecx,dword ptr ss:[esp+ecx*4+14]
0040107D    894C24 10                mov dword ptr ss:[esp+10],ecx
00401081    A8 01                    test al,1
00401083    74 3A                    je short pakup.004010BF
00401085    66:8B042A                mov ax,word ptr ds:[edx+ebp]
00401089    8B4C24 10                mov ecx,dword ptr ss:[esp+10]
0040108D    33C1                     xor eax,ecx
0040108F    83C2 02                  add edx,2
00401092    25 FFFF0000              and eax,0FFFF
00401097    8BC8                     mov ecx,eax
00401099    25 FF0F0000              and eax,0FFF
0040109E    C1E9 0C                  shr ecx,0C
004010A1    83C1 02                  add ecx,2
004010A4    85C9                     test ecx,ecx
004010A6    74 1F                    je short pakup.004010C7
004010A8    8BF9                     mov edi,ecx
004010AA    8BCE                     mov ecx,esi
004010AC    2BC8                     sub ecx,eax
004010AE    46                       inc esi
004010AF    4F                       dec edi
004010B0    8A0C19                   mov cl,byte ptr ds:[ecx+ebx]
004010B3    884C1E FF                mov byte ptr ds:[esi+ebx-1],cl
004010B7  ^ 75 F1                    jnz short pakup.004010AA
004010B9    8B7C24 40                mov edi,dword ptr ss:[esp+40]
004010BD    EB 08                    jmp short pakup.004010C7
004010BF    8A042A                   mov al,byte ptr ds:[edx+ebp]
004010C2    88041E                   mov byte ptr ds:[esi+ebx],al
004010C5    46                       inc esi
004010C6    42                       inc edx
004010C7    8A4424 3C                mov al,byte ptr ss:[esp+3C]
004010CB    D0E8                     shr al,1
004010CD    3BF7                     cmp esi,edi
004010CF    884424 3C                mov byte ptr ss:[esp+3C],al
004010D3    73 16                    jnb short pakup.004010EB
004010D5    8B4C24 38                mov ecx,dword ptr ss:[esp+38]
004010D9    41                       inc ecx
004010DA    83F9 08                  cmp ecx,8
004010DD    894C24 38                mov dword ptr ss:[esp+38],ecx
004010E1  ^ 7C 9E                    jl short pakup.00401081
004010E3    3BF7                     cmp esi,edi
004010E5  ^ 0F82 74FFFFFF            jb pakup.0040105F
004010EB    5F                       pop edi                                             ; kernel32.ReadFile
004010EC    5E                       pop esi                                             ; kernel32.ReadFile
004010ED    5D                       pop ebp                                             ; kernel32.ReadFile
004010EE    33C0                     xor eax,eax
004010F0    5B                       pop ebx                                             ; kernel32.ReadFile
004010F1    83C4 24                  add esp,24
004010F4    C3                       retn

===================================================================

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
void GUnPack::DecBuffToFile(int i)
{
                DWORD dwGetSize=0;
                LPLONG EncrytData = new long [myFile[i].PakSize+0xff];
                LPLONG DecrytData = new long [myFile[i].UnSize+0xff];
                ::SetFilePointer(hFile,0,NULL, FILE_CURRENT);
                ::SetFilePointer(hFile,myFile[i].Start,NULL,FILE_BEGIN);
                ::ReadFile(hFile,EncrytData,myFile[i].PakSize,&dwGetSize,NULL);
                DecryptFileBuff(DecrytData,EncrytData,myFile[i].UnSize,myFile[i].PakSize);
                delete[]EncrytData;
                delete[]DecrytData;
}
void GUnPack::DecryptFileBuff(LPLONG DecryptData,LPLONG EncryptData,DWORD UnSize,DWORD PakSize)
{
        DWORD var[8]={0xff21,0x834f,0x675f,0x34,0x0f237,0x815f,0x4765,0x233};
DWORD ii;

__asm
{
                mov edi,dword ptr ss:[UnSize]   //解密后长度UnSize
               
                xor esi,esi
                xor edx,edx
                test edi,edi
        jbe JMP1
                mov ebp,EncryptData
                mov ebx,DecryptData
JMP8:
                mov al,byte ptr ds:[edx+ebp]
                inc edx
                mov cl,al
                mov dword ptr ss:[DecryptData],0
                shr ecx,3
                and ecx,7
                xor al,0x0C8
                mov byte ptr ss:[EncryptData],al
                mov ecx,dword ptr ss:[var+ecx*4+0x14]//取KEY
                mov dword ptr ss:[ii],ecx
JMP7:
                test al,1
        je JMP2
                mov ax,word ptr ds:[edx+ebp]
                mov ecx,dword ptr ss:[ii]
                xor eax,ecx
                add edx,2
                and eax,0x0FFFF
                mov ecx,eax
                and eax,0x0FFF
                shr ecx,0x0C
                add ecx,2
                test ecx,ecx
        je JMP3
                mov edi,ecx
JMP4:
                mov ecx,esi
                sub ecx,eax
                inc esi
                dec edi
                mov cl,byte ptr ds:[ecx+ebx]
                mov byte ptr ds:[esi+ebx-1],cl
        jnz JMP4
                mov edi,dword ptr ss:[UnSize]
        jmp JMP3
JMP2:
                mov al,byte ptr ds:[edx+ebp]
                mov byte ptr ds:[esi+ebx],al//写入解密后数据
                inc esi
                inc edx
JMP3:
                mov al,byte ptr ss:[EncryptData]
                shr al,1
                cmp esi,edi
                mov byte ptr ss:[EncryptData],al
        jnb short JMP1
                mov ecx,dword ptr ss:[DecryptData]
                inc ecx
                cmp ecx,8
                mov dword ptr ss:[DecryptData],ecx
        jl short JMP7
                cmp esi,edi
        jb JMP8
JMP1:
                xor eax,eax

}

}
2006-6-11 17:58
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
能不能在VC++里先调用一段汇编,再CALL另外一段汇编呢?
2006-6-11 18:01
0
雪    币: 184
活跃值: (108)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
4
小弟还在弄呀?电话不是说的很明白了么?

DWORD x1,x2,x3,x4

x1=strlen(z1)....
x2=strlen(z2)....
x3=decode.y1;
x4=decode.y2;

_ASM
{
mov ecx,x1;
mov edx,x2;
mov ebx,x3;
mov edi,x4;

sub esp,24;
.........

add esp,24;

mov x4,edi;
}

x4就是你要的东西.可以直接在C中用.

呵呵,很简单的,上午ADSL有点问题,刚刚弄好,你再编译一下看看.
2006-6-11 18:04
0
雪    币: 184
活跃值: (108)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
5
最初由 咖啡 发布
能不能在VC++里先调用一段汇编,再CALL另外一段汇编呢?


可以,如这个例子:
__asm
{
       mov eax,2;
       push; 参数b等于2
       mov eax,3;
       push; 参数a等于3
       call CAdd;调用CAdd函数
       mov Result,eax;所有函数的返回值都被存放在eax。于是,Result等于5
}

注意一下压栈方向就行
2006-6-11 18:36
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
师傅我郁闷好久,东西解一半就出错。。。我给你电话
2006-6-11 18:50
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
真的有那么简单吗!

就我个人认为,除非是DLL的输出函数(自然也包括静态编连的函数),可以直接拿来使用外(当然可能需要少许加工),其他的代码快(当然是汇编形式的),要想拿来使用,完全要靠运气。例如是没有复杂的交叉调用,没有类似于初始化的前期铺垫,更不是某个C++类的成员函数(这玩意涉及到的东西可能又是上面的所有),简单来说,就是一段非常“纯洁”的代码。

这片代码粗看,貌似是某个C++类的成员函数,交叉调用也不少。要想改造为可以直接使用的代码,还不如拿算法的特征代码(那一溜常量)去问问算法达人是那个算法,然后自己写一个。

纯属浇花
2006-6-12 17:04
0
雪    币: 255
活跃值: (175)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
8
最初由 咖啡 发布
师傅我郁闷好久,东西解一半就出错。。。我给你电话


现在都流行拜师啊!

怎么没人收我     
2006-6-12 18:44
0
游客
登录 | 注册 方可回帖
返回
//