首页
社区
课程
招聘
[求助]汇编转VC++
发表于: 2015-11-26 02:14 5685

[求助]汇编转VC++

2015-11-26 02:14
5685
一段算法很简单,也知道他是如何运算的,但是试着用VC写解密,碰到的问题是是高地位的运算问题,请各位高手帮忙,汇编代码如下:
si初始值=0x20
mov     dl, [edx+ebx-1] //加密字符串依次传入(首个字符第一次传入)
movzx   ecx, si
shr     ecx, 8
xor     dl, cl
mov     [eax+ebx-1], dl //把解密结果存入[eax+ebx-1]
movzx   eax, byte ptr [eax+ebx-1] //依旧是加密字符串(首个字符第二次传入)
add     si, ax
imul    ax, si, 0A761h
add     ax, 87B3h
mov     esi, eax //跳至上面循环解密
请各位高手帮忙,如何用VC写出同样的解密?谢谢了!

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 8233
活跃值: (2736)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不是可以内联汇编吗
2015-11-26 08:10
0
雪    币: 393
活跃值: (224)
能力值: ( LV8,RANK:140 )
在线值:
发帖
回帖
粉丝
3
看了下代码,很通俗易懂。除非楼主不懂汇编或者开发 不然应该很轻松可以写出来
2015-11-26 10:15
0
雪    币: 1136
活跃值: (683)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
请BinGzL大哥帮忙写个,自己写的始终达不到效果,到了OD调试时候想要ax的变成了eax,0x0A761,0x87B3固定值居然也变了
2015-11-26 20:51
0
雪    币: 443
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我反汇编阅读能力不强,我试写了一个解密函数,来一段密文我看看,我的能不能解出来.
2015-11-26 22:19
0
雪    币: 1136
活跃值: (683)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
68726EE1BA98217296681F0BDF97698D87563823EC66AD8D78826CA67DA538C84BEC690D90408CD53FD4490116A3F273D12556704B5F9CDEA27A99AA4B236EC14649C82FA3F82ADEF1829FD8823EFA
十六进制数2个一组转为内存值后进行解密,次数就是整个字符串/2
si初始值=0x27
2015-11-26 22:44
0
雪    币: 393
活跃值: (224)
能力值: ( LV8,RANK:140 )
在线值:
发帖
回帖
粉丝
7
你需要的仅仅是一次(word)的强转,至于立即数为什么会变,没看你代码 我不清楚
2015-11-26 22:56
0
雪    币: 443
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
unsigned char arrSrc[] =
{
        0x68, 0x72, 0x6E, 0xE1, 0xBA, 0x98, 0x21, 0x72, 0x96, 0x68, 0x1F,
        0x0B, 0xDF, 0x97, 0x69, 0x8D, 0x87, 0x56, 0x38, 0x23, 0xEC, 0x66,
        0xAD, 0x8D, 0x78, 0x82, 0x6C, 0xA6, 0x7D, 0xA5, 0x38, 0xC8, 0x4B,
        0xEC, 0x69, 0x0D, 0x90, 0x40, 0x8C, 0xD5, 0x3F, 0xD4, 0x49, 0x01,
        0x16, 0xA3, 0xF2, 0x73, 0xD1, 0x25, 0x56, 0x70, 0x4B, 0x5F, 0x9C,
        0xDE, 0xA2, 0x7A, 0x99, 0xAA, 0x4B, 0x23, 0x6E, 0xC1, 0x46, 0x49,
        0xC8, 0x2F, 0xA3, 0xF8, 0x2A, 0xDE, 0xF1, 0x82, 0x9F, 0xD8, 0x82,
        0x3E, 0xFA
};
unsigned char arrDst[sizeof(arrSrc)];
/*
函数名: Decrypt
[参数]
chClearData        : 输出缓冲区,接收解密成明文的数据;
chCipherDta        : 输入缓冲区,接受待解密的密文数据;
count                : 密文长度;
[返回值]
返回明文数据的缓冲区地址;
*/
unsigned char* Decrypt(unsigned char* chClearData, unsigned char* chCipherData, size_t count, unsigned short uKey)
{
        for (size_t i = 0; i < count; ++i)
        {
                chClearData[i] = chCipherData[i] ^ uKey >> 8;
                uKey = (chClearData[i] + uKey) * 0xA761 + 0x87B3;
        }
        return chClearData;
}

//解不出来,上面是我的代码,楼主知道哪里出问题了一定要记得告诉我啊。
2015-11-26 23:45
0
雪    币: 1136
活跃值: (683)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
[QUOTE=gs笨笨;1403691]unsigned char arrSrc[] =
{
        0x68, 0x72, 0x6E, 0xE1, 0xBA, 0x98, 0x21, 0x72, 0x96, 0x68, 0x1F,
        0x0B, 0xDF, 0x97, 0x69, 0x8D, 0x87, 0x56, 0x38, 0x23, 0...[/QUOTE]

不好意思,刚调试了下,你说的不能解密是最后部分不能解密,少了一个判断,完整的解密是这样的
unsigned short uKey=0x27;
	for (size_t i = 0; i < m_unencrypte.GetLength()/2; i++)
	{
		nHex[i] = nHexOut[i] ^uKey >> 8 ;
		if(nHex[i]==0x0)
		{
			nHex[i]='/';
			uKey = uKey * 0xA761 + 0x87B3;
		}
		else
		{
			uKey = (nHexOut[i] + uKey) * 0xA761 + 0x87B3;
		}
	}

非常感谢,但是又碰到问题了,该如何加密呢?乘法好像没有逆运算的
2015-11-27 01:59
0
雪    币: 443
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
[QUOTE=heihu;1403696]不好意思,刚调试了下,你说的不能解密是最后部分不能解密,少了一个判断,完整的解密是这样的
unsigned short uKey=0x27;
        for (size_t i = 0; i < m_unencrypte.GetLength()/2; i++)
        {
                nHex[i] = ...[/QUOTE]

异或加解密都是需要同一个key,并不需要什么乘法逆运算,只需要把明文当作key来重新异或就行了
2015-11-27 05:06
0
游客
登录 | 注册 方可回帖
返回
//