本帖最后由 baronG 于 2010-8-11 16:20 编辑
如题,就是练习逆向而已....
某个例子代码
#include "stdio.h"
char * itobs(int,char *);
void show_bstr(const char *);
int main(void)
{
char bin_str[8 * sizeof(int)+1]; //4*8+1 == 33字节 int类型为4字节,8位表示一个字节 so 4*8+1=='\0'
int number;
/************************************************************************/
/* 004113F8 8B F4 mov esi,esp
004113FA 8D 45 C8 lea eax,[ebp-38h] //获得系统分配给number变量的首地址
004113FD 50 push eax
004113FE 68 4C 57 41 00 push 41574Ch
00411403 FF 15 C4 82 41 00 call dword ptr ds:[004182C4h]
scanf函数,获得整数返回1 ,否则返回0
00411409 83 C4 08 add esp,8
*/
/************************************************************************/
while (scanf("%d",&number) == 1)
{
itobs(number,bin_str); //传入数字和33个元素的char型数组
printf("%d is ",number);//输出整数
show_bstr(bin_str);
putchar('\n');
}
puts("bYe!");
return 0;
}
char * itobs(int n,char *ps)
{
int i;
static int size = 8 * sizeof (int);
for (i = size -1;i>=0;i--,n>>=1)
ps[i] = (01 & n) + '0';
ps[size] = '\0';
return ps;
}
void show_bstr (const char * str)
{
int i =0;
while (str[i])
{
putchar(str[i]);
if (++i%4 == 0 && str[i])
putchar (' ');
}
}
OD里面 某些标注...自己编译了 就知道了 =。= ide,vs2008 sp1
自定义注释
地址 反汇编 注释
004111D1 JMP itobs itobs
004113FD PUSH EAX 变量number地址
004113FE PUSH 0041574C 接受的变量,类型
0041140C CMP ESI,ESP 平衡堆栈
00411413 CMP EAX,1 if eax >1 then jmp 00411465
00411418 LEA EAX,DWORD PTR SS:[EBP-2C] 字符数组变量 首地址获得~
0041141B PUSH EAX rt1
0041141C MOV ECX,DWORD PTR SS:[EBP-38] 获取变量的值
00411420 CALL 004111D1 转换到进制的功能函数
0041159E MOV EAX,DWORD PTR DS:[size] size 大小~
004115A6 MOV DWORD PTR SS:[EBP-8],EAX 变量i
004115AB MOV EAX,DWORD PTR SS:[EBP-8] eax == [ebp-8] == i
004115AE SUB EAX,1 i-1
004115B1 MOV DWORD PTR SS:[EBP-8],EAX i == i-1
004115B4 MOV ECX,DWORD PTR SS:[EBP+8] number
004115B7 SAR ECX,1 number>>1
004115B9 MOV DWORD PTR SS:[EBP+8],ECX number = number>>1
004115BC CMP DWORD PTR SS:[EBP-8],0 if [ebp-8]<0 the jl 004115d5
004115C5 AND EAX,1 0位 与1异或,进行进制位的运算
004115C8 ADD EAX,30 0的ascii +是因为转换成字符,可以放到字符数组中
004115CB MOV ECX,DWORD PTR SS:[EBP+C] ps的字符串数组的首地址
004115CE ADD ECX,DWORD PTR SS:[EBP-8] ps[1f] 就是 ps[31]
004115D1 MOV BYTE PTR DS:[ECX],AL ps[if] = number&1+ascii '0'
004115D5 MOV EAX,DWORD PTR SS:[EBP+C] eax = array[?]
004115D8 ADD EAX,DWORD PTR DS:[size] eax = array+size
004115DE MOV BYTE PTR DS:[EAX],0 数组位置最后一位为0
0041162E MOV DWORD PTR SS:[EBP-8],0 var_a = 0;
00411635 MOV EAX,DWORD PTR SS:[EBP+8] show_binary_point
00411638 ADD EAX,DWORD PTR SS:[EBP-8] str[i] == str[0]
0041165E MOV EAX,DWORD PTR SS:[EBP-8] 获得var_a
00411661 ADD EAX,1 var_a +1;
00411664 MOV DWORD PTR SS:[EBP-8],EAX 写入var_a的新值
00411679 JNZ SHORT 0041169C (初始 CPU 选择)
静心学习....
感谢Z同学的解答~
也许明天开始 逆向数据结构吧~~ |