主题:有报酬求人帮我将这小段汇编代码转为C
马甲一号
[专家分:0] 发布于 2007-02-12 12:32:00
需要分析他人的一种文件格式,我取得了跟这段格式有相的汇编代码,无奈自己的汇编功底不足看不懂。
在这里求有能力的朋友帮我将它转换成C,伪代码也行,只要能让我看懂它是怎样处理的就可以了。
有兴趣的朋友可以看看下面图中的代码,如果你有能力阅读的,请将你结果的前面一部份发到我的邮箱上,也可以发到我的QQ上
邮箱 liangjianxiang"@"msn.com QQ 104820443 邮箱请去掉""
报酬面谈。
[img]http://boolosoft.com/temp/51d980.gif[/img][em10]
回复列表 (共2个回复)
沙发
ccpp [专家分:9360] 发布于 2007-02-12 20:24:00
除了使用32位的寄存器,没发现什么复杂的语法
复习一下dos汇编就行
想看看代码的说明,不知道它在描述什么样的算法
板凳
ShowJim [专家分:20] 发布于 2007-02-14 01:13:00
最关键的两个过程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个缓存单元
}
}
}
我来回复