回 帖 发 新 帖 刷新版面

主题:有报酬求人帮我将这小段汇编代码转为C


需要分析他人的一种文件格式,我取得了跟这段格式有相的汇编代码,无奈自己的汇编功底不足看不懂。
在这里求有能力的朋友帮我将它转换成C,伪代码也行,只要能让我看懂它是怎样处理的就可以了。

有兴趣的朋友可以看看下面图中的代码,如果你有能力阅读的,请将你结果的前面一部份发到我的邮箱上,也可以发到我的QQ上
邮箱 liangjianxiang"@"msn.com QQ 104820443 邮箱请去掉""

报酬面谈。



[img]http://boolosoft.com/temp/51d980.gif[/img][em10]

回复列表 (共2个回复)

沙发

除了使用32位的寄存器,没发现什么复杂的语法
复习一下dos汇编就行

想看看代码的说明,不知道它在描述什么样的算法

板凳

最关键的两个过程sub_529d60和sub_6b0520被忽略掉了,这里只看到了一个壳。
下面是个大概的C++程序,其中关键的不确定部分用//注释掉了:
class Memory
{
public:
    unsigned AddSize,Length,VirtualLength,*Data;
Memory(unsigned L=10,unsigned As=10)    {    AddSize=(As==0?10:As);    VirtualLength=0;    Data=new unsigned[Length=(L==0?AddSize:L)];    }
~Memory()    {    delete[] Data;    }
inline void Error(unsigned A,char *Ep)
    {
    if((A&1)!=0)    std::cout<<"Empty no data pop:"<<Ep<<endl;
    return;
    }
inline void Copy(unsigned *pw,unsigned *pr,unsigned l)    {    while(l--)    *pw++=*pr++;    }
Memory &Push(unsigned A)
    {
    if(Length==VirtualLength)
        {
        unsigned *NewData=new unsigned[Length+=AddSize];
        Copy(NewData+AddSize,Data,VirtualLength);
        delete[] Data;    Data=NewData;
        }
    Data[Length-(++VirtualLength)]=A;
    return *this;
    }
Memory &Pop(unsigned *p)
    {
    if(VirtualLength)    {    *p=Data[Length-VirtualLength];    VirtualLength--;    }
    else    Error(1,"in Pop(unsigned *p)");
    return *this;
    }
Memory &PushM(unsigned A)
    {
    unsigned l=VirtualLength+A;
    if(Length<l)
        {
        unsigned al=((l-Length-1)/AddSize+1)*AddSize;
        unsigned *NewData=new unsigned[Length+=al];
        Copy(NewData+al,Data,VirtualLength);
        delete[] Data;    Data=NewData;
        }
    VirtualLength=l;
    return *this;
    }
Memory &PopM(unsigned A)
    {
    if(VirtualLength<A)    Error(1,"in PopM(unsigned A)");
    else    {    VirtualLength-=A;    }
    return *this;
    }
unsigned *GetAddress()    {    return Data+Length-VirtualLength;    }
};
void _memcpy()    {}
void sub_529d60()    {}
void sub_6b0520()    {}
void main()
{
unsigned cl,ebx,ebp,esi,edi,eax,*eax_,*eax_1,*ecx_,*edx_,*edi_;
unsigned aHd1_0,aHd3_0,aHd3_1,arg_8;
Memory esp(10);
eax^=eax;    //eax=0;
esp.PushM(4);    //arg_C,arg_8,arg_4,arg_0
esp.Push(eax).Push(eax).Push(eax).Push(eax).Push(eax);    //var_14,var_10,var_C,var_8,var_4初化始环境
esp.PushM(5);
cl=aHd1_0&0xff;
edx_=(esp.GetAddress())+9;    //var_14
*edx_=((*edx_)&0xffffff00)+cl;
if(cl)
    {
//    loc_51d9a4:
    }
else
    {
    unsigned temp;
    esp.Push(ebx).Push(ebp).Push(esi).Push(edi);    //保存数据
    edi_=(esp.GetAddress())+16;    //arg_8
    temp=eax=(*edi_)&0xf;    //eax=arg_8&0xf;
    if(eax==1)    esp.Push((unsigned)(&aHd3_0));
    else if(eax==2)    esp.Push((unsigned)(&aHd3_1));
    if(eax==1||eax==2)
        {
        ecx_=(esp.GetAddress())+14;    //var_14
        sub_529d60();    //这个过程应该用到了var_14并且生成了var_10,var_C,var_8,var_4,edi的值,还Pop掉了一个单元(也就是前面的aHd3_0或者aHd3_1的地址)
//        eax=(esp.GetAddress())+12;    //var_10+2,这个地址是猜测来的
//eax=(var_10>>16)+(var_14<<16);
//ebx=arg_4;
//ebp=arg_C;
//cx=arg_0&0xffff;
edx=(eax^ebx)&0xffffff;
eax^=edx;
esp.Push(ebp);
esi=edi+4;
//(var_10>>16)+(var_14<<16)=eax;
//eax=var_14;
esp.Push(esi).Push(eax);
//var_8=(var_8&0xffff0000)+cx;
sub_6b0520();    //这个过程Push了一个单元,并且更改了eax的值
esp.PopM(3);    //忽略于sub_6b0520过程Push的单元和之前Push的esi,eax
        }
    if((temp!=1&&temp!=2)||eax==0)
        {
        esp.Pop(&edi).Pop(&esi).Pop(&ebp).Pop(&ebx).PopM(5);    //恢复数据
        eax^=eax;    //eax=0;
        }
    else
        {
        esp.Pop(&ebp).Pop(&esi).Pop(&edi);    //esi,edi被互换,ebp指向了由if(eax==1||eax==2)计算生成的arg_C
        _memcpy();    //应该是个与esi,edi相关的内存复制过程
        esp.PopM(3);    //忽略了ebx,ebp的原值,还有一个是用于if(eax==1||eax==2)计算的缓存
        esp.Pop(&edi).Pop(&esi).Pop(&ebp);    //这三个也是if(eax==1||eax==2)计算的缓存
        eax=ebx;    //if(eax==1||eax==2)计算中产生的一个值
        esp.Pop(&ebx);    //也是if(eax==1||eax==2)计算的缓存
        esp.PopM(5);    //一开始被初始化为0的5个缓存单元
        }
    }
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册