Tag: 汇编

转到C中的特定地址

我如何JMP到C中的特定地址? 我想用 goto 0x10080000 这是行不通的,还有其他方法可以改变程序计数器的地址吗?

如何从ASM堆栈中的C代码访问双指针

我有一个main.c函数,它有以下声明: int initarr(int**arr, int n, int (*initfunc)(int)); 然后我在c调用函数: success = initarr(&arr, n, getNum); 问题是,在汇编代码中,在MODEL SMALL ,上面函数中的第一个参数将作为WORD或DWORD存在于内存中? 换句话说,当我编写代码时,这会工作: PUSH BP MOV BP,SP PUSH DI MOV DI, WORD PTR[BP+4] ; DI will hold &arr. 现在DI将持有arr的地址。 如果是,如果是这样,我怎样才能访问arr [0]的值? PUSH BP MOV BP,SP PUSH DI PUSH BX MOV DI, WORD PTR[BP+4] MOV BX, WORD PTR[DI] BX会保存数组的地址吗? 我的意思是,第一个细胞的地址? 如果是这样,我现在如何访问arr [0]? […]

通过自修改代码进行动态混淆

这是我想要做的: 假设你有两个function void f1(int *v) { *v = 55; } void f2(int *v) { *v = 44; } char *template; template = allocExecutablePages(…); char *allocExecutablePages (int pages) { template = (char *) valloc (getpagesize () * pages); if (mprotect (template, getpagesize (), PROT_READ|PROT_EXEC|PROT_WRITE) == -1) { perror (“mprotect”); } } 我想在f1和f2之间做一个比较(所以告诉什么是相同的,什么不是)(所以得到那些函数的assembly线并逐行比较)然后将这些行放在我的模板中。 在C中有办法做到这一点吗? 谢谢 更新 感谢所有你回答的人,但也许我没有正确解释我的需要。 […]

简单的assembly问题

; int __stdcall wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd) _wWinMain@16 proc near var_4= dword ptr -4 hInstance= dword ptr 4 hPrevInstance= dword ptr 8 lpCmdLine= dword ptr 0Ch nShowCmd= dword ptr 10h 从我所看到的,最后4个变量是传递给WinMain函数的参数。 另外,var_4必须是我稍后在函数体中声明的int变量。 现在,我有几个问题: a)32位Windows程序中单词的大小是多少? 4字节? 是一个dword 8? b)为什么var_4设置为-4? 为什么不开始,比方说,0? c)但是,在c中定义int的标准程序是 var_x = dword ptr y? 谢谢

打印堆栈框架

所以我目前正在学习堆栈帧,我想实验打印一个函数的堆栈帧(手动)。 我有以下图片记住堆栈框架(我可能是错的): | | 0xffff0fdc +——————————–+ | … | 0xffff0fd8 +——————————–+ | parameter 2 | 0xffff0fd4 +——————————–+ | parameter 1 | 0xffff0fd0 +——————————–+ | return address | 0xffff0fcc +——————————–+ | local variable 2 | 0xffff0fc8 +——————————–+ | local variable 1 | 0xffff0fc4 +——————————–+ 因此我首先写了这个函数来实现上面的结果并打印出来: void func(int a,int b) { uint64_t loc = 0; uint64_t *sp […]

变形示例代码

所以我一直致力于实现James Holderness的变形代码示例 : Metamorphic Code Examples 。 #include #include #include #include #include #define PUSH 0x50 #define POP 0x58 #define MOV 0xB8 #define NOP 0x90 #define ADD 0x01 #define AND 0x21 #define XOR 0x31 #define OR 0x09 #define SBB 0x19 #define SUB 0x29 #define JUNK asm __volatile__(PUSH,NOP,NOP,NOP,NOP,NOP,NOP,NOP,NOP,POP) #define JUNKLEN 8 const unsigned char prefixes[] = {ADD, […]

了解mpreferred-stack-boundary = number

我正在尝试可视化和理解如何利用mpreferred-stack-boundary(更像是构建代码来利用它来学校)。 从阅读gcc手册,它指出它根据mpreferred-stack-boundary = number对齐堆栈,其中number是指向base 2的指数。默认情况下,number = 4所以堆栈的对齐是2 ^ 4 = 16字节。 我不知道咖啡因是否与我的大脑混乱,但我在课堂上看到的所有shell代码注入要求我们在编译时使用mpreferred-stack-boundary = 2,这会使堆栈对齐4个字节。 那么这是否意味着我已经放置在堆栈上的变量默认尝试一次填充16个字节的堆栈? 另外,为什么我放在缓冲区中的shellcode在设置为2时的边界工作但在默认模式下运行时不起作用?

32位到64位内联汇编移植

我有一段C ++代码(在GNU / Linux环境下用g ++编译)加载一个函数指针(它是如何做的无关紧要),用一些内联汇编将一些参数压入堆栈然后调用该函数,代码如下: unsigned long stack[] = { 1, 23, 33, 43 }; /* save all the registers and the stack pointer */ unsigned long esp; asm __volatile__ ( “pusha” ); asm __volatile__ ( “mov %%esp, %0″ :”=m” (esp)); for( i = 0; i < sizeof(stack); i++ ){ unsigned long val = stack[i]; […]

解码C代码的等效汇编代码

想要查看某些C代码的编译器输出(在汇编中),我在C中编写了一个简单的程序,并使用gcc生成了它的汇编文件。 代码是这样的: #include int main() { int i = 0; if ( i == 0 ) { printf(“testing\n”); } return 0; } 它生成的程序集在这里(只有主函数): _main: pushl %ebpz movl %esp, %ebp subl $24, %esp andl $-16, %esp movl $0, %eax addl $15, %eax addl $15, %eax shrl $4, %eax sall $4, %eax movl %eax, -8(%ebp) movl -8(%ebp), […]

禁用缓存后系统变得非常慢

我通过为我的intel机器设置CR0的CD位来禁用缓存。 我使用了上一篇文章中描述的代码 我还使用smp_call_function()函数来设置所有CPU的CR0。 问题是: 设置所有CPU的CR0的CD位后,机器变得非常慢。 我甚至不能使用键盘。 我的问题是: 我想通过设置CR0的CD位来禁用缓存后检查CR0寄存器。 所以我至少需要能够使用键盘。 无论如何,我禁用缓存后可以帮助我使用键盘吗? 完全出乎我的意料,禁用缓存会使系统几乎冻结。