我有以下汇编代码,我想将其转换为 C 语言。在转型过程中,我遇到了一些我找不到任何答案的问题。
所以,这里是:
...
+---->6C250EAD MOV DL, BYTE PTR DS:[ESI]
| .....EAF TEST DL, DL
| .....EB1 JE SHORT func.6C250EDF -----------------+
| .....EB3 MOVZX EDX, DL |
| .....EB6 TEST BYTE PTR DS:[EDX+0x6C25EF39],0x4 |
| .....EBD JE SHORT func.6C250ECE -----+ |
| .....EBF ADD DWORD PRT DS:[ECX],0x2 | |
| .....EC2 TEST EAX,EAX | |
| .....EC4 JE SHORT func.6C250ED9 ----------+ |
| .....EC6 MOV DL, BYTE PTR DS:[ESI] | | |
| .....EC8 INC ESI | | |
| .....EC9 MOV BYTE PTR DS:[EAX], DL | | |
| .....ECB INC EAX | | |
| +--.....ECC-----JMP SHORT func.6C250ED4 | | |
| | 6C250ECE INC DWORD PTR DS:[ECX]<<<<<<--+ | |
| | .....ED0 TEST EAX, EAX | |
| | .....ED2 JMP SHORT func.6C250ED9 -----------+ |
| +->6C250ED4 MOV DL, BYTE PTR DS:[ESI] | | |
| .....ED6 MOV BYTE PTR DS:[EAX],DL | | |
| .....ED8 INC EAX | | |
| 6C250ED9 INC ESI <<<<<-----------------+--+ |
| .....EDA CMP BYTE PTR DS:[ESI],0x22 |
+-----.....EDD-----JNZ SHORT func.6C250EAD |
6C250EDF ..... <<<<------------------------------+
首先,我必须说我们在寄存器 ESI 中存储了一个字符串。特别地,它是我尝试检查的当前进程的路径。所以它以“C:\Users...(等等)”开头
我的观察如下。它是一个代表循环的例程。循环通过在循环末尾增加 esi 指针来遍历存储的字符串。还有一个递增的计数器 ECX。我的问题是关于这条线的:
TEST BYTE PTR DS:[EDX+0x6C25EF39],0x4
在这里,ollydbg 告诉我 ANSCII 代码 08 在 [EDX+0x6C25EF39] 中。我查了一下,这是退格的代码。此外,0x4 是 EOT 的表示(= 传输结束)。老实说,我真的不明白是什么。(我假设它可能是删除最后一个当前字符,因为它不是“传输结束”,因此是 0x4,但我不确定。)我唯一能说的是结果总是 ZF =1,所以跳转,我们去到箭头的目标,即计数器ECX递增的地方。关于 ECX 和 EAX,我可以说它们是用 0 初始化的。
因此,根据这些观察,我尝试编写一个 C 代码来想象如何实际编写它:
while(esi != NULL){
char *dl = *(esi);
if(dl != dl){
break;
}
char *edx = *(dl);
//at that the line which I do not understand really comes
ecx++;
if(eax!=0){
esi++;
}
if(esi-- == esi){
break;
}
}
我想补充一点,我也尝试学习 C 语言。所以,我希望你能告诉我我的错误或其他错误的事情,我必须好好学习。